From ace9c3b29898e2d75dd978d1a7ba1d01fb3c4925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 13:09:21 +0200 Subject: [PATCH 01/24] Port the API and CLI to the Meshtastic 3.0 schema Point the protobufs submodule at the trident branch and regenerate. - Messages follow their new homes: api, packet, wire, common; config sections and module configs are top-level messages. - Packed bitfields: bin/gen_bitfields.py names each bit with the protobufs repo's accessor naming. Packet and node dicts show set bits as bools (wantAck, isFavorite, ...); --get, --set, --configure and --export-config treat a bit as a bool field (lora.tx_enabled). - Channels have no role: index 0 is primary, no settings is disabled. 16 channels. - User carries no id: user.id is derived from the NodeNum. hwModel is the packed registry number, named from the bundled hw_devices.json. - Position sends and reads the full-precision latitude/longitude and reads the scaled over-the-air form. - Traceroute asks for device metrics with PACKET_RECORD_PATH and prints the reply's path tail. - Telemetry requests and decodes SensorReadings; device metrics use the 3.0 scales. - excluded_modules is indexed by ModuleConfigType; capabilities replace the metadata booleans. - Removed: --reboot-ota, --ch-vlongslow, --ch-longslow, range test, TRACEROUTE_APP and RANGE_TEST_APP decoding. --- bin/gen_bitfields.py | 55 + bin/regen-protobufs.sh | 9 +- examples/get_hw.py | 3 +- examples/info_example.py | 3 +- meshtastic/__init__.py | 52 +- meshtastic/__main__.py | 156 +- meshtastic/analysis/__main__.py | 5 +- meshtastic/ble_interface.py | 4 +- meshtastic/mesh_interface.py | 360 +- meshtastic/node.py | 166 +- meshtastic/powermon/stress.py | 2 +- meshtastic/protobuf/admin_pb2.py | 168 +- meshtastic/protobuf/admin_pb2.pyi | 1491 ++--- meshtastic/protobuf/api_pb2.py | 122 + meshtastic/protobuf/api_pb2.pyi | 1307 +++++ meshtastic/protobuf/apponly_pb2.py | 13 +- meshtastic/protobuf/apponly_pb2.pyi | 64 +- meshtastic/protobuf/atak_pb2.py | 549 +- meshtastic/protobuf/atak_pb2.pyi | 2026 +++---- meshtastic/protobuf/bitfields.py | 204 + meshtastic/protobuf/cannedmessages_pb2.py | 11 +- meshtastic/protobuf/cannedmessages_pb2.pyi | 36 +- meshtastic/protobuf/channel_pb2.py | 35 +- meshtastic/protobuf/channel_pb2.pyi | 285 +- meshtastic/protobuf/clientonly_pb2.py | 25 +- meshtastic/protobuf/clientonly_pb2.pyi | 160 +- meshtastic/protobuf/common_pb2.py | 195 + meshtastic/protobuf/common_pb2.pyi | 1018 ++++ meshtastic/protobuf/config_pb2.py | 819 ++- meshtastic/protobuf/config_pb2.pyi | 3672 ++++++------ meshtastic/protobuf/connection_status_pb2.py | 11 +- meshtastic/protobuf/connection_status_pb2.pyi | 254 +- meshtastic/protobuf/device_ui_pb2.py | 101 +- meshtastic/protobuf/device_ui_pb2.pyi | 480 +- meshtastic/protobuf/deviceonly_legacy_pb2.py | 39 - meshtastic/protobuf/deviceonly_legacy_pb2.pyi | 106 - meshtastic/protobuf/deviceonly_pb2.py | 139 +- meshtastic/protobuf/deviceonly_pb2.pyi | 782 ++- meshtastic/protobuf/discovery_pb2.py | 71 + meshtastic/protobuf/discovery_pb2.pyi | 435 ++ meshtastic/protobuf/field_metadata_pb2.py | 5 +- meshtastic/protobuf/field_metadata_pb2.pyi | 109 +- meshtastic/protobuf/hw_device_registry_pb2.py | 29 + .../protobuf/hw_device_registry_pb2.pyi | 112 + meshtastic/protobuf/hw_devices.json | 893 +++ meshtastic/protobuf/hw_vendor_registry_pb2.py | 29 + .../protobuf/hw_vendor_registry_pb2.pyi | 115 + meshtastic/protobuf/interdevice_pb2.py | 51 +- meshtastic/protobuf/interdevice_pb2.pyi | 450 +- meshtastic/protobuf/localonly_pb2.py | 13 +- meshtastic/protobuf/localonly_pb2.pyi | 299 +- meshtastic/protobuf/lorawan_bridge_pb2.py | 85 +- meshtastic/protobuf/lorawan_bridge_pb2.pyi | 334 +- meshtastic/protobuf/mesh_beacon_pb2.py | 19 +- meshtastic/protobuf/mesh_beacon_pb2.pyi | 80 +- meshtastic/protobuf/mesh_pb2.py | 274 - meshtastic/protobuf/mesh_pb2.pyi | 5018 ----------------- .../protobuf/modem_preset_registry_pb2.py | 30 + .../protobuf/modem_preset_registry_pb2.pyi | 119 + meshtastic/protobuf/module_config_pb2.py | 753 ++- meshtastic/protobuf/module_config_pb2.pyi | 3042 +++++----- meshtastic/protobuf/mqtt_pb2.py | 47 +- meshtastic/protobuf/mqtt_pb2.pyi | 155 +- meshtastic/protobuf/nanopb_pb2.py | 5 +- meshtastic/protobuf/nanopb_pb2.pyi | 275 +- meshtastic/protobuf/packet_pb2.py | 61 + meshtastic/protobuf/packet_pb2.pyi | 616 ++ meshtastic/protobuf/paxcount_pb2.py | 5 +- meshtastic/protobuf/paxcount_pb2.pyi | 50 +- meshtastic/protobuf/portnums_pb2.py | 9 +- meshtastic/protobuf/portnums_pb2.pyi | 237 +- meshtastic/protobuf/powermon_pb2.py | 7 +- meshtastic/protobuf/powermon_pb2.pyi | 152 +- meshtastic/protobuf/region_registry_pb2.py | 36 + meshtastic/protobuf/region_registry_pb2.pyi | 315 ++ meshtastic/protobuf/remote_hardware_pb2.py | 5 +- meshtastic/protobuf/remote_hardware_pb2.pyi | 73 +- meshtastic/protobuf/rtttl_pb2.py | 9 +- meshtastic/protobuf/rtttl_pb2.pyi | 38 +- meshtastic/protobuf/serial_hal_pb2.py | 41 +- meshtastic/protobuf/serial_hal_pb2.pyi | 128 +- meshtastic/protobuf/storeforward_pb2.py | 57 +- meshtastic/protobuf/storeforward_pb2.pyi | 596 +- meshtastic/protobuf/telemetry_pb2.py | 151 +- meshtastic/protobuf/telemetry_pb2.pyi | 2413 ++++---- meshtastic/protobuf/wire_pb2.py | 132 + meshtastic/protobuf/wire_pb2.pyi | 1376 +++++ meshtastic/protobuf/xmodem_pb2.py | 17 +- meshtastic/protobuf/xmodem_pb2.pyi | 100 +- meshtastic/tests/conftest.py | 6 +- meshtastic/tests/firmware_harness.py | 45 +- meshtastic/tests/fw_helpers.py | 14 - .../tests/test_inject_nanopb_options.py | 73 +- meshtastic/tests/test_main.py | 104 +- meshtastic/tests/test_mesh_interface.py | 79 +- .../test_mesh_interface_traffic_management.py | 8 +- meshtastic/tests/test_node.py | 288 +- meshtastic/tests/test_serial_interface.py | 2 +- meshtastic/tests/test_showNodes_favorite.py | 18 +- meshtastic/tests/test_smoke1.py | 4 +- meshtastic/tests/test_smokemesh.py | 29 +- meshtastic/tests/test_smokevirt.py | 40 +- meshtastic/tests/test_tcp_interface.py | 2 +- meshtastic/tests/test_util.py | 114 +- meshtastic/util.py | 98 +- protobufs | 2 +- 106 files changed, 18568 insertions(+), 16756 deletions(-) create mode 100644 bin/gen_bitfields.py create mode 100644 meshtastic/protobuf/api_pb2.py create mode 100644 meshtastic/protobuf/api_pb2.pyi create mode 100644 meshtastic/protobuf/bitfields.py create mode 100644 meshtastic/protobuf/common_pb2.py create mode 100644 meshtastic/protobuf/common_pb2.pyi delete mode 100644 meshtastic/protobuf/deviceonly_legacy_pb2.py delete mode 100644 meshtastic/protobuf/deviceonly_legacy_pb2.pyi create mode 100644 meshtastic/protobuf/discovery_pb2.py create mode 100644 meshtastic/protobuf/discovery_pb2.pyi create mode 100644 meshtastic/protobuf/hw_device_registry_pb2.py create mode 100644 meshtastic/protobuf/hw_device_registry_pb2.pyi create mode 100644 meshtastic/protobuf/hw_devices.json create mode 100644 meshtastic/protobuf/hw_vendor_registry_pb2.py create mode 100644 meshtastic/protobuf/hw_vendor_registry_pb2.pyi delete mode 100644 meshtastic/protobuf/mesh_pb2.py delete mode 100644 meshtastic/protobuf/mesh_pb2.pyi create mode 100644 meshtastic/protobuf/modem_preset_registry_pb2.py create mode 100644 meshtastic/protobuf/modem_preset_registry_pb2.pyi create mode 100644 meshtastic/protobuf/packet_pb2.py create mode 100644 meshtastic/protobuf/packet_pb2.pyi create mode 100644 meshtastic/protobuf/region_registry_pb2.py create mode 100644 meshtastic/protobuf/region_registry_pb2.pyi create mode 100644 meshtastic/protobuf/wire_pb2.py create mode 100644 meshtastic/protobuf/wire_pb2.pyi diff --git a/bin/gen_bitfields.py b/bin/gen_bitfields.py new file mode 100644 index 000000000..81c791ea5 --- /dev/null +++ b/bin/gen_bitfields.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Write meshtastic/protobuf/bitfields.py from a descriptor set that carries source info. + +Names every bit of every packed bitfield the schema declares, using the protobufs repo's +own discovery and naming (protobufs/tools/gen_bitfield_accessors.py), so a bit is called +here what the firmware accessors call it. + +Usage: + gen_bitfields.py +""" + +import os +import pprint +import sys + +from google.protobuf import descriptor_pb2 + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "protobufs", "tools")) +from gen_bitfield_accessors import accessor_name, collect_enums, find_bitfields, validate # type: ignore # pylint: disable=C0413 + +HEADER = '''"""Generated by bin/gen_bitfields.py from the protobufs submodule -- do not edit. + +The named bits of every packed bitfield: {message: {bit name: (field, mask)}}, with the +message named by its path inside the package. Names match the firmware accessors. +""" + +''' + + +def main() -> int: + """Read the descriptor set, write the table.""" + fds = descriptor_pb2.FileDescriptorSet() + with open(sys.argv[1], "rb") as fh: + fds.ParseFromString(fh.read()) + table: dict = {} + for rec in find_bitfields(fds, collect_enums(fds)): + problems = validate(rec) + if problems: + sys.exit(f"{rec['where']}: {'; '.join(problems)}") + message, field = rec["where"].split(": ", 1)[1].rsplit(".", 1) + bits = table.setdefault(message, {}) + for name, mask in rec["values"]: + if not mask: + continue + bit = accessor_name(name, rec["values"]) + if bit in bits: + sys.exit(f"{message}: two bits are named {bit}") + bits[bit] = (field, mask) + with open(sys.argv[2], "w", encoding="utf-8", newline="\n") as fh: + fh.write(HEADER + "BITFIELDS = " + pprint.pformat(table, width=100) + "\n") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh index 956b008ad..4e2f8503b 100755 --- a/bin/regen-protobufs.sh +++ b/bin/regen-protobufs.sh @@ -69,6 +69,13 @@ done # Generate the python files ./nanopb-0.4.8/generator-bin/protoc -I=$TMPDIR/in --python_out "${OUTDIR}" "--mypy_out=${PYIDIR}" $INDIR/*.proto +# Name the bits of every packed bitfield, from the unmodified schema with its comments +./nanopb-0.4.8/generator-bin/protoc -I=./protobufs --include_source_info "--descriptor_set_out=${TMPDIR}/descriptor.binpb" ./protobufs/meshtastic/*.proto +python3 ./bin/gen_bitfields.py "${TMPDIR}/descriptor.binpb" "${OUTDIR}/meshtastic/protobuf/bitfields.py" + +# Hardware model names are registry data, not schema +cp ./protobufs/registry/generated/hw_devices.json "${OUTDIR}/meshtastic/protobuf/" + # Change "from meshtastic.protobuf import" to "from . import" $SEDCMD 's/^from meshtastic.protobuf import/from . import/' "${OUTDIR}"/meshtastic/protobuf/*pb2*.py[i] @@ -77,7 +84,7 @@ touch "${OUTDIR}/meshtastic/protobuf/__init__.py" # Copy to the source controlled tree mkdir -p meshtastic/protobuf -rm -rf meshtastic/protobuf/*pb2*.py +rm -rf meshtastic/protobuf/*pb2*.py meshtastic/protobuf/*pb2*.pyi cp "${OUTDIR}/meshtastic/protobuf"/* meshtastic/protobuf exit 0 diff --git a/examples/get_hw.py b/examples/get_hw.py index 137796f04..b1211c0f3 100644 --- a/examples/get_hw.py +++ b/examples/get_hw.py @@ -11,6 +11,7 @@ import sys import meshtastic.serial_interface +from meshtastic.util import hw_model_name def main() -> int: @@ -28,7 +29,7 @@ def main() -> int: if iface.nodes: for node in iface.nodes.values(): if node["num"] == iface.myInfo.my_node_num: - print(node["user"]["hwModel"]) + print(hw_model_name(node["user"].get("hwModel", 0))) break except KeyboardInterrupt: return 0 diff --git a/examples/info_example.py b/examples/info_example.py index ca6dabcc5..73fbde326 100644 --- a/examples/info_example.py +++ b/examples/info_example.py @@ -8,6 +8,7 @@ """ import meshtastic.serial_interface +from meshtastic.util import hw_model_name def main() -> int: @@ -33,7 +34,7 @@ def main() -> int: "Name: " f"{user.get('longName', 'unknown')} ({user.get('shortName', 'unknown')})" ) - print(f"Hardware model: {user.get('hwModel', 'unknown')}") + print(f"Hardware model: {hw_model_name(user.get('hwModel', 0))}") except KeyboardInterrupt: return 0 except Exception as exc: diff --git a/meshtastic/__init__.py b/meshtastic/__init__.py index b3aa8c4bd..d2ec4b16b 100644 --- a/meshtastic/__init__.py +++ b/meshtastic/__init__.py @@ -90,17 +90,21 @@ def onConnection(interface, topic=pub.AUTO_TOPIC): # called when we (re)connect from .protobuf import ( admin_pb2, + api_pb2, apponly_pb2, channel_pb2, + common_pb2, config_pb2, - mesh_pb2, + discovery_pb2, mqtt_pb2, + packet_pb2, paxcount_pb2, portnums_pb2, remote_hardware_pb2, storeforward_pb2, telemetry_pb2, - powermon_pb2 + powermon_pb2, + wire_pb2, ) from . import ( util, @@ -214,6 +218,7 @@ def _onNodeInfoReceive(iface, asDict): # decode user protobufs and update nodedb, provide decoded version as "position" in the published msg # update node DB as needed n = iface._getOrCreateByNum(asDict["from"]) + p["id"] = f"!{asDict['from']:08x}" # 3.0 User carries no id: it is the NodeNum n["user"] = p # We now have a node ID, make sure it is up-to-date in that table iface.nodes[p["id"]] = n @@ -225,24 +230,19 @@ def _onTelemetryReceive(iface, asDict): if "from" not in asDict: return - toUpdate = None - telemetry = asDict.get("decoded", {}).get("telemetry", {}) node = iface._getOrCreateByNum(asDict["from"]) - if "deviceMetrics" in telemetry: - toUpdate = "deviceMetrics" - elif "environmentMetrics" in telemetry: - toUpdate = "environmentMetrics" - elif "airQualityMetrics" in telemetry: - toUpdate = "airQualityMetrics" - elif "powerMetrics" in telemetry: - toUpdate = "powerMetrics" - elif "localStats" in telemetry: - toUpdate = "localStats" + if "sensorReadings" in telemetry: + # Keyed columns, not fields: keep the latest value of each quantity + raw = telemetry["raw"] + toUpdate = "sensorReadings" + updateObj = util.sensor_readings_to_list(raw.sensor_readings, raw.time)[-1] else: - return - - updateObj = telemetry.get(toUpdate) + toUpdate = next((k for k in ("deviceMetrics", "localStats", "hostMetrics", "trafficManagementStats") + if k in telemetry), None) + if toUpdate is None: + return + updateObj = telemetry.get(toUpdate) newMetrics = node.get(toUpdate, {}) newMetrics.update(updateObj) logger.debug(f"updating {toUpdate} metrics for {asDict['from']} to {newMetrics}") @@ -267,39 +267,33 @@ def _onAdminReceive(iface, asDict): portnums_pb2.PortNum.TEXT_MESSAGE_APP: KnownProtocol( "text", onReceive=_onTextReceive ), - portnums_pb2.PortNum.RANGE_TEST_APP: KnownProtocol( - "rangetest", onReceive=_onTextReceive - ), portnums_pb2.PortNum.DETECTION_SENSOR_APP: KnownProtocol( "detectionsensor", onReceive=_onTextReceive ), portnums_pb2.PortNum.POSITION_APP: KnownProtocol( - "position", mesh_pb2.Position, _onPositionReceive + "position", wire_pb2.Position, _onPositionReceive ), portnums_pb2.PortNum.NODEINFO_APP: KnownProtocol( - "user", mesh_pb2.User, _onNodeInfoReceive + "user", wire_pb2.User, _onNodeInfoReceive ), portnums_pb2.PortNum.ADMIN_APP: KnownProtocol( "admin", admin_pb2.AdminMessage, _onAdminReceive ), - portnums_pb2.PortNum.ROUTING_APP: KnownProtocol("routing", mesh_pb2.Routing), + portnums_pb2.PortNum.ROUTING_APP: KnownProtocol("routing", wire_pb2.Routing), portnums_pb2.PortNum.TELEMETRY_APP: KnownProtocol( "telemetry", telemetry_pb2.Telemetry, _onTelemetryReceive ), portnums_pb2.PortNum.REMOTE_HARDWARE_APP: KnownProtocol( "remotehw", remote_hardware_pb2.HardwareMessage ), - portnums_pb2.PortNum.SIMULATOR_APP: KnownProtocol("simulator", mesh_pb2.Compressed), - portnums_pb2.PortNum.TRACEROUTE_APP: KnownProtocol( - "traceroute", mesh_pb2.RouteDiscovery - ), portnums_pb2.PortNum.POWERSTRESS_APP: KnownProtocol( "powerstress", powermon_pb2.PowerStressMessage ), - portnums_pb2.PortNum.WAYPOINT_APP: KnownProtocol("waypoint", mesh_pb2.Waypoint), + portnums_pb2.PortNum.WAYPOINT_APP: KnownProtocol("waypoint", wire_pb2.Waypoint), portnums_pb2.PortNum.PAXCOUNTER_APP: KnownProtocol("paxcounter", paxcount_pb2.Paxcount), portnums_pb2.PortNum.STORE_FORWARD_APP: KnownProtocol("storeforward", storeforward_pb2.StoreAndForward), - portnums_pb2.PortNum.NEIGHBORINFO_APP: KnownProtocol("neighborinfo", mesh_pb2.NeighborInfo), + portnums_pb2.PortNum.NEIGHBORINFO_APP: KnownProtocol("neighborinfo", wire_pb2.NeighborInfo), + portnums_pb2.PortNum.NODE_DISCOVERY_APP: KnownProtocol("discovery", discovery_pb2.DiscoveryMessage), portnums_pb2.PortNum.MAP_REPORT_APP: KnownProtocol("mapreport", mqtt_pb2.MapReport), } diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index ca1680a58..8ea016b15 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -30,7 +30,6 @@ pyqrcode = None import yaml -from google.protobuf.json_format import MessageToDict from pubsub import pub # type: ignore[import-untyped] try: @@ -47,6 +46,7 @@ from meshtastic import BROADCAST_ADDR, mt_config, remote_hardware from meshtastic.ble_interface import BLEInterface from meshtastic.mesh_interface import MeshInterface +from meshtastic.node import channel_role try: from meshtastic.powermon import ( PowerMeter, @@ -63,7 +63,7 @@ have_powermon = False powermon_exception = e meter = None -from meshtastic.protobuf import admin_pb2, channel_pb2, clientonly_pb2, config_pb2, portnums_pb2, mesh_pb2 +from meshtastic.protobuf import admin_pb2, channel_pb2, clientonly_pb2, common_pb2, config_pb2, portnums_pb2 from meshtastic.version import get_active_version logger = logging.getLogger(__name__) @@ -72,8 +72,8 @@ # These fields are stored as uint32 bitmasks in the protobuf but have an # associated enum that names the individual flags. BITFIELD_ENUMS = { - "network.enabled_protocols": config_pb2.Config.NetworkConfig.ProtocolFlags, - "position.position_flags": config_pb2.Config.PositionConfig.PositionFlags, + "network.enabled_protocols": config_pb2.NetworkConfig.ProtocolFlags, + "position.position_flags": config_pb2.PositionConfig.PositionFlags, } def onReceive(packet, interface) -> None: @@ -99,7 +99,7 @@ def onReceive(packet, interface) -> None: rxChannel = packet.get("channel", 0) targetChannel = int(args.ch_index or 0) if rxChannel == targetChannel: - rxSnr = packet["rxSnr"] + rxSnr = packet.get("rxSnr", 0) / 2 hopLimit = packet["hopLimit"] print(f"message: {msg}") reply = f"got msg '{msg}' with rxSnr: {rxSnr} and hopLimit: {hopLimit}" @@ -121,7 +121,7 @@ def checkChannel(interface: MeshInterface, channelIndex: int) -> bool: """Given an interface and channel index, return True if that channel is non-disabled on the local node""" ch = interface.localNode.getChannelByChannelIndex(channelIndex) logger.debug(f"ch:{ch}") - return ch and ch.role != channel_pb2.Channel.Role.DISABLED + return ch and channel_role(ch) != "DISABLED" def getPref(node, comp_name) -> bool: @@ -153,9 +153,12 @@ def _printSetting(config_type, uni_name, pref_value, repeated): objDesc = config.DESCRIPTOR config_type = objDesc.fields_by_name.get(name[0]) pref = "" #FIXME - is this correct to leave as an empty string if not found? + bit = None if config_type: pref = config_type.message_type.fields_by_name.get(snake_name) - if pref or wholeField: + if not pref and not wholeField: + bit = meshtastic.util.find_bit(config_type.message_type, snake_name) + if pref or bit or wholeField: found = True break @@ -172,14 +175,22 @@ def _printSetting(config_type, uni_name, pref_value, repeated): if len(config.ListFields()) != 0 and not isinstance(pref, str): # if str, it's still the empty string, I think # read the value config_values = getattr(config, config_type.name) - if not wholeField: + if bit: + _printSetting(config_type, uni_name, bool(getattr(config_values, bit[0]) & bit[1]), False) + elif not wholeField: pref_value = getattr(config_values, pref.name) repeated = _is_repeated_field(pref) _printSetting(config_type, uni_name, pref_value, repeated) else: + bits = meshtastic.util.bitfield_bits(config_values.DESCRIPTOR) + bitfield_names = {f for f, _ in bits.values()} for field in config_values.ListFields(): + if field[0].name in bitfield_names: + continue # shown bit by bit below repeated = _is_repeated_field(field[0]) _printSetting(config_type, field[0].name, field[1], repeated) + for bit_name, (field_name, mask) in bits.items(): + _printSetting(config_type, bit_name, bool(getattr(config_values, field_name) & mask), False) else: # Always show whole field for remote node node.requestConfig(config_type) @@ -209,7 +220,7 @@ def traverseConfig(config_root, config, interface_config) -> bool: return True -def setPref(config, comp_name, raw_val) -> bool: +def setPref(config, comp_name, raw_val) -> bool: # pylint: disable=R0911 """Set a channel or preferences value""" name = splitCompoundName(comp_name) @@ -235,6 +246,16 @@ def setPref(config, comp_name, raw_val) -> bool: elif config_type: pref = config_type + if not pref and config_type and config_type.message_type is not None: + bit = meshtastic.util.find_bit(config_type.message_type, snake_name) + if bit: + val = meshtastic.util.fromStr(raw_val) if isinstance(raw_val, str) else raw_val + config_values = getattr(config_part, config_type.name) + word = getattr(config_values, bit[0]) + setattr(config_values, bit[0], word | bit[1] if val else word & ~bit[1]) + print(f"Set {'.'.join(name[0:-1])}.{uni_name} to {raw_val}") + return True + if (not pref) or (not config_type): return False @@ -413,7 +434,7 @@ def onConnected(interface): closeNow = True waitForAckNak = True node = interface.getNode(args.dest, False, **getNode_kwargs) - if node.module_available(mesh_pb2.CANNEDMSG_CONFIG): + if node.module_available(admin_pb2.AdminMessage.CANNEDMSG_CONFIG): print(f"Setting canned plugin message to {args.set_canned_message}") node.set_canned_message(args.set_canned_message) else: @@ -423,7 +444,7 @@ def onConnected(interface): closeNow = True waitForAckNak = True node = interface.getNode(args.dest, False, **getNode_kwargs) - if node.module_available(mesh_pb2.EXTNOTIF_CONFIG): + if node.module_available(admin_pb2.AdminMessage.EXTNOTIF_CONFIG): print(f"Setting ringtone to {args.set_ringtone}") node.set_ringtone(args.set_ringtone) else: @@ -478,11 +499,6 @@ def onConnected(interface): waitForAckNak = True interface.getNode(args.dest, False, **getNode_kwargs).reboot() - if args.reboot_ota: - closeNow = True - waitForAckNak = True - interface.getNode(args.dest, False, **getNode_kwargs).rebootOTA() - if args.ota_update: closeNow = True waitForAckNak = True @@ -622,14 +638,19 @@ def onConnected(interface): else: channelIndex = mt_config.channel_index or 0 if checkChannel(interface, channelIndex): + # 3.0 carries environment, air quality, power and health as one SensorReadings list telemMap = { "device": "device_metrics", - "environment": "environment_metrics", - "air_quality": "air_quality_metrics", - "airquality": "air_quality_metrics", - "power": "power_metrics", + "sensors": "sensor_readings", + "environment": "sensor_readings", + "air_quality": "sensor_readings", + "airquality": "sensor_readings", + "power": "sensor_readings", + "health": "sensor_readings", "localstats": "local_stats", "local_stats": "local_stats", + "host": "host_metrics", + "traffic": "traffic_management_stats", } telemType = telemMap.get(args.request_telemetry, "device_metrics") print( @@ -815,8 +836,8 @@ def _seed_config(section: str, is_module: bool) -> Optional[Any]: and profile.config.position.fixed_position ): pos = profile.fixed_position - lat = float(pos.latitude_i * Decimal("1e-7")) if pos.latitude_i else 0.0 - lon = float(pos.longitude_i * Decimal("1e-7")) if pos.longitude_i else 0.0 + lat = float(pos.latitude * Decimal("1e-7")) if pos.latitude else 0.0 + lon = float(pos.longitude * Decimal("1e-7")) if pos.longitude else 0.0 alt = pos.altitude if pos.altitude else 0 print(f"Fixing altitude at {alt} meters") print(f"Fixing latitude at {lat} degrees") @@ -922,7 +943,6 @@ def _seed_config(section: str, is_module: bool) -> Optional[Any]: chs.psk = meshtastic.util.genPSK256() chs.name = args.ch_add ch.settings.CopyFrom(chs) - ch.role = channel_pb2.Channel.Role.SECONDARY print(f"Writing modified channels to device") n.writeChannel(ch.index) if channelIndex is None: @@ -963,35 +983,29 @@ def setSimpleConfig(modem_preset): node.writeConfig("lora") # handle the simple radio set commands - if args.ch_vlongslow: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.VERY_LONG_SLOW) - - if args.ch_longslow: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.LONG_SLOW) - if args.ch_longmod: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.LONG_MODERATE) + setSimpleConfig(common_pb2.ModemPreset.MODEM_LONG_MODERATE) if args.ch_longfast: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.LONG_FAST) + setSimpleConfig(common_pb2.ModemPreset.MODEM_LONG_FAST) if args.ch_longturbo: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.LONG_TURBO) + setSimpleConfig(common_pb2.ModemPreset.MODEM_LONG_TURBO) if args.ch_medslow: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.MEDIUM_SLOW) + setSimpleConfig(common_pb2.ModemPreset.MODEM_MEDIUM_SLOW) if args.ch_medfast: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.MEDIUM_FAST) + setSimpleConfig(common_pb2.ModemPreset.MODEM_MEDIUM_FAST) if args.ch_shortslow: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.SHORT_SLOW) + setSimpleConfig(common_pb2.ModemPreset.MODEM_SHORT_SLOW) if args.ch_shortfast: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.SHORT_FAST) + setSimpleConfig(common_pb2.ModemPreset.MODEM_SHORT_FAST) if args.ch_shortturbo: - setSimpleConfig(config_pb2.Config.LoRaConfig.ModemPreset.SHORT_TURBO) + setSimpleConfig(common_pb2.ModemPreset.MODEM_SHORT_TURBO) if args.ch_set or args.ch_enable or args.ch_disable: closeNow = True @@ -1048,14 +1062,11 @@ def setSimpleConfig(modem_preset): enable = True # If we set any pref, assume the user wants to enable the channel + # 3.0 channels have no role: a channel with settings is enabled if enable: - ch.role = ( - channel_pb2.Channel.Role.PRIMARY - if (channelIndex == 0) - else channel_pb2.Channel.Role.SECONDARY - ) + ch.settings.SetInParent() else: - ch.role = channel_pb2.Channel.Role.DISABLED + ch.ClearField("settings") print(f"Writing modified channels to device") node.writeChannel(channelIndex) @@ -1215,8 +1226,9 @@ def printConfig(config) -> None: config = objDesc.fields_by_name.get(config_section.name) print(f"{config_section.name}:") names = [] - for field in config.message_type.fields: - tmp_name = f"{config_section.name}.{field.name}" + bit_names = list(meshtastic.util.bitfield_bits(config.message_type)) + for field_name in [f.name for f in config.message_type.fields] + bit_names: + tmp_name = f"{config_section.name}.{field_name}" if mt_config.camel_case: tmp_name = meshtastic.util.snake_to_camel(tmp_name) names.append(tmp_name) @@ -1262,18 +1274,11 @@ def export_config(interface) -> str: """used in --export-config""" configObj = {} - # A list of configuration keys that should be set to False if they are missing + # A list of configuration keys that should be set to False if they are missing. Bitfield + # bits need none: they are all exported, set or not. config_true_defaults = { ("bluetooth", "enabled"), - ("lora", "sx126xRxBoostedGain"), - ("lora", "txEnabled"), - ("lora", "usePreset"), ("position", "positionBroadcastSmartEnabled"), - ("security", "serialEnabled"), - } - - module_true_defaults = { - ("mqtt", "encryptionEnabled"), } owner = interface.getLongName() @@ -1310,7 +1315,7 @@ def export_config(interface) -> str: if alt: configObj["location"]["alt"] = alt - config = MessageToDict(interface.localNode.localConfig) #checkme - Used as a dictionary here and a string below + config = meshtastic.util.message_to_dict(interface.localNode.localConfig, all_bits=True) #checkme - Used as a dictionary here and a string below #was used as a string here and a Dictionary above if config: # Convert inner keys to correct snake/camelCase @@ -1326,6 +1331,8 @@ def export_config(interface) -> str: prefs[pref]['privateKey'] = 'base64:' + prefs[pref]['privateKey'] if 'publicKey' in prefs[pref]: prefs[pref]['publicKey'] = 'base64:' + prefs[pref]['publicKey'] + if 'groupPrivateKey' in prefs[pref]: + prefs[pref]['groupPrivateKey'] = 'base64:' + prefs[pref]['groupPrivateKey'] if 'adminKey' in prefs[pref]: for i in range(len(prefs[pref]['adminKey'])): prefs[pref]['adminKey'][i] = 'base64:' + prefs[pref]['adminKey'][i] @@ -1336,7 +1343,7 @@ def export_config(interface) -> str: set_missing_flags_false(configObj["config"], config_true_defaults) - module_config = MessageToDict(interface.localNode.moduleConfig) + module_config = meshtastic.util.message_to_dict(interface.localNode.moduleConfig, all_bits=True) if module_config: # Convert inner keys to correct snake/camelCase prefs = {} @@ -1348,8 +1355,6 @@ def export_config(interface) -> str: else: configObj["module_config"] = prefs - set_missing_flags_false(configObj["module_config"], module_true_defaults) - config_txt = "# start of Meshtastic configure yaml\n" #checkme - "config" (now changed to config_out) #was used as a string here and a Dictionary above config_txt += yaml.dump(configObj) @@ -1394,8 +1399,8 @@ def _profile_from_yaml( lon = float(loc.get("lon", 0) or 0) alt = int(loc.get("alt", 0) or 0) if lat or lon or alt: - profile.fixed_position.latitude_i = int(Decimal(str(lat)) * Decimal("1e7")) - profile.fixed_position.longitude_i = int(Decimal(str(lon)) * Decimal("1e7")) + profile.fixed_position.latitude = int(Decimal(str(lat)) * Decimal("1e7")) + profile.fixed_position.longitude = int(Decimal(str(lon)) * Decimal("1e7")) profile.fixed_position.altitude = alt if "config" in configuration: for section in configuration["config"]: @@ -1503,9 +1508,9 @@ def export_profile(interface) -> bytes: if lat or lon or alt: if lat: - profile.fixed_position.latitude_i = int(Decimal(str(lat)) * Decimal("1e7")) + profile.fixed_position.latitude = int(Decimal(str(lat)) * Decimal("1e7")) if lon: - profile.fixed_position.longitude_i = int(Decimal(str(lon)) * Decimal("1e7")) + profile.fixed_position.longitude = int(Decimal(str(lon)) * Decimal("1e7")) if alt: profile.fixed_position.altitude = int(alt) @@ -1593,7 +1598,7 @@ def common(): # OTA (WiFi/BLE) only needs the local node to send the admin request and then # streams the firmware directly; it never reads the node DB. Skip fetching it so a # large node DB dump can't stall/close the connection before the OTA request lands. - if getattr(args, "ota_update", None) or getattr(args, "reboot_ota", False): + if getattr(args, "ota_update", None): args.no_nodes = True if have_powermon: @@ -1973,18 +1978,6 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: metavar="RINGTONE", ) - group.add_argument( - "--ch-vlongslow", - help="Change to the VERY_LONG_SLOW modem preset. Deprecated since 2.5 firmware.", - action="store_true", - ) - - group.add_argument( - "--ch-longslow", - help="Change to the LONG_SLOW modem preset. Deprecated since 2.7 firmware.", - action="store_true", - ) - group.add_argument( "--ch-longmod", "--ch-longmoderate", help="Change to the LONG_MODERATE modem preset", @@ -2248,16 +2241,17 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar group.add_argument( "--traceroute", - help="Traceroute from connected node to a destination. " + help="Trace the route back to the connected node from a destination. " "You need pass the destination ID as argument, like " - "this: '--traceroute !ba4bf9d0' | '--traceroute 0xba4bf9d0'" + "this: '--traceroute !ba4bf9d0' | '--traceroute 0xba4bf9d0'. " "Only nodes with a shared channel can be traced.", metavar="!xxxxxxxx", ) group.add_argument( "--request-telemetry", - help="Request telemetry from a node. With an argument, requests that specific type of telemetry. " + help="Request telemetry from a node. With an argument, requests that specific type of telemetry: " + "device, sensors (environment, air quality, power and health), local_stats, host or traffic. " "You need to pass the destination ID as argument with '--dest'. " "For repeaters, the nodeNum is required.", action="store", @@ -2298,12 +2292,6 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars "--reboot", help="Tell the destination node to reboot", action="store_true" ) - group.add_argument( - "--reboot-ota", - help="Tell the destination node to reboot into factory firmware (ESP32, firmware version <2.7.18)", - action="store_true", - ) - group.add_argument( "--ota-update", help="Perform an OTA update on the local node (ESP32, firmware version >=2.7.18, WiFi/TCP only for now). " diff --git a/meshtastic/analysis/__main__.py b/meshtastic/analysis/__main__.py index d9077cf62..0b3f72361 100644 --- a/meshtastic/analysis/__main__.py +++ b/meshtastic/analysis/__main__.py @@ -14,7 +14,8 @@ from dash import Dash, dcc, html # type: ignore[import-untyped] from pyarrow import feather -from .. import mesh_pb2, powermon_pb2 +from .. import powermon_pb2 +from ..util import hw_model_name from ..slog import root_dir # Configure panda options @@ -114,7 +115,7 @@ def get_board_info(dslog: pd.DataFrame) -> tuple: """ board_info = dslog[dslog["sw_version"].notnull()] sw_version = board_info.iloc[0]["sw_version"] - board_id = mesh_pb2.HardwareModel.Name(board_info.iloc[0]["board_id"]) + board_id = hw_model_name(int(board_info.iloc[0]["board_id"])) return (board_id, sw_version) diff --git a/meshtastic/ble_interface.py b/meshtastic/ble_interface.py index 64a63616f..2938c1b33 100644 --- a/meshtastic/ble_interface.py +++ b/meshtastic/ble_interface.py @@ -16,7 +16,7 @@ from meshtastic.mesh_interface import MeshInterface -from .protobuf import mesh_pb2 +from .protobuf import api_pb2 SERVICE_UUID = "6ba1b218-15a8-461f-9fa8-5dcae273eafd" TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7" @@ -116,7 +116,7 @@ def from_num_handler(self, _, b: bytes) -> None: # pylint: disable=C0116 self.should_read = True async def log_radio_handler(self, _, b): # pylint: disable=C0116 - log_record = mesh_pb2.LogRecord() + log_record = api_pb2.LogRecord() try: log_record.ParseFromString(bytes(b)) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 1a7dd6eae..e5bf83348 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -16,7 +16,6 @@ from decimal import Decimal from typing import Any, Callable, Dict, List, Optional, Union -import google.protobuf.json_format try: import print_color # type: ignore[import-untyped] @@ -36,19 +35,25 @@ protocols, publishingThread, ) -from meshtastic.protobuf import mesh_pb2, portnums_pb2, telemetry_pb2 +from meshtastic.protobuf import api_pb2, common_pb2, packet_pb2, portnums_pb2, telemetry_pb2, wire_pb2 from meshtastic.util import ( Acknowledgment, Timeout, - convert_mac_addr, + hw_model_name, + message_to_dict, message_to_json, our_exit, remove_keys_from_dict, + sensor_readings_to_list, stripnl, ) logger = logging.getLogger(__name__) +DATA_PAYLOAD_MAX = 256 +"""Data.payload's bound: one LoRa frame. What a frame really leaves for the payload depends on +the packet (header profile, options, path tail, signature), so the node does the final check.""" + def _timeago(delta_secs: int) -> str: """Convert a number of seconds in the past into a short, friendly string e.g. "now", "30 sec ago", "1 hour ago" @@ -109,10 +114,10 @@ def __init__( self, -1, timeout=timeout ) # We fixup nodenum later self.myInfo: Optional[ - mesh_pb2.MyNodeInfo + api_pb2.MyNodeInfo ] = None # We don't have device info yet self.metadata: Optional[ - mesh_pb2.DeviceMetadata + common_pb2.DeviceMetadata ] = None # We don't have device metadata yet self.responseHandlers: Dict[ int, ResponseHandler @@ -130,7 +135,7 @@ def __init__( self.configId: Optional[int] = NODELESS_WANT_CONFIG_ID if noNodes else None self.gotResponse: bool = False # used in gpio read self.mask: Optional[int] = None # used in gpio read and gpio watch - self.queueStatus: Optional[mesh_pb2.QueueStatus] = None + self.queueStatus: Optional[api_pb2.QueueStatus] = None self.queue: collections.OrderedDict = collections.OrderedDict() self._localChannels = None @@ -187,7 +192,7 @@ def _handleLogLine(self, line: str) -> None: pub.sendMessage("meshtastic.log.line", line=line, interface=self) - def _handleLogRecord(self, record: mesh_pb2.LogRecord) -> None: + def _handleLogRecord(self, record: api_pb2.LogRecord) -> None: """Handle a log record which was received encapsulated in a protobuf.""" # For now we just try to format the line as if it had come in over the serial port self._handleLogLine(record.message) @@ -210,16 +215,8 @@ def showInfo(self, file=sys.stdout) -> str: # pylint: disable=W0613 keys_to_remove = ("raw", "decoded", "payload") n2 = remove_keys_from_dict(keys_to_remove, n) - # if we have 'macaddr', re-format it - if "macaddr" in n2["user"]: - val = n2["user"]["macaddr"] - # decode the base64 value - addr = convert_mac_addr(val) - n2["user"]["macaddr"] = addr - # use id as dictionary key for correct json format in list of nodes - nodeid = n2["user"]["id"] - nodes[nodeid] = n2 + nodes[f"!{n2['num']:08x}"] = n2 infos = owner + myinfo + metadata + mesh + json.dumps(nodes, indent=2) print(infos) return infos @@ -335,9 +332,9 @@ def getNestedValue(node_dict: Dict[str, Any], key_path: str) -> Any: if raw_value is None: formatted_value = "0" elif field == "deviceMetrics.channelUtilization": - formatted_value = formatFloat(raw_value, 2, "%") + formatted_value = formatFloat(raw_value / 100 if raw_value else None, 2, "%") elif field == "deviceMetrics.airUtilTx": - formatted_value = formatFloat(raw_value, 2, "%") + formatted_value = formatFloat(raw_value / 100 if raw_value else None, 2, "%") elif field == "deviceMetrics.batteryLevel": if raw_value in (0, 101): formatted_value = "Powered" @@ -356,7 +353,9 @@ def getNestedValue(node_dict: Dict[str, Any], key_path: str) -> Any: elif field == "since": formatted_value = getTimeAgo(raw_value) or "N/A" elif field == "snr": - formatted_value = formatFloat(raw_value, 0, " dB") + formatted_value = formatFloat(raw_value / 2 if raw_value else None, 1, " dB") + elif field == "user.hwModel": + formatted_value = hw_model_name(raw_value or 0) elif field == "user.shortName": formatted_value = raw_value if raw_value is not None else f'Meshtastic {presumptive_id[-4:]}' elif field == "user.id": @@ -488,7 +487,7 @@ def sendAlert( wantResponse=False, onResponse=onResponse, channelIndex=channelIndex, - priority=mesh_pb2.MeshPacket.Priority.ALERT, + priority=packet_pb2.MeshPacket.Priority.ALERT, hopLimit=hopLimit, ) @@ -497,11 +496,11 @@ def sendMqttClientProxyMessage(self, topic: str, data: bytes): Topic and data should be the MQTT topic and the message payload from an MQTT broker, respectively.""" - prox = mesh_pb2.MqttClientProxyMessage() + prox = wire_pb2.MqttClientProxyMessage() prox.topic = topic prox.data = data - toRadio = mesh_pb2.ToRadio() - toRadio.mqttClientProxyMessage.CopyFrom(prox) + toRadio = api_pb2.ToRadio() + toRadio.mqtt_client_proxy_message.CopyFrom(prox) self._sendToRadio(toRadio) def sendData( @@ -517,8 +516,9 @@ def sendData( hopLimit: Optional[int]=None, pkiEncrypted: Optional[bool]=False, publicKey: Optional[bytes]=None, - priority: mesh_pb2.MeshPacket.Priority.ValueType=mesh_pb2.MeshPacket.Priority.RELIABLE, + priority: packet_pb2.MeshPacket.Priority.ValueType=packet_pb2.MeshPacket.Priority.RELIABLE, replyId: Optional[int]=None, + recordPath: bool=False, ): # pylint: disable=R0913 """Send a data packet to some other node @@ -544,6 +544,7 @@ def sendData( channelIndex -- channel number to use hopLimit -- hop limit to use replyId -- the ID of the message that this packet is a response to + recordPath -- ask relays to record the path this packet takes Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -554,10 +555,8 @@ def sendData( data = data.SerializeToString() logger.debug(f"len(data): {len(data)}") - logger.debug( - f"mesh_pb2.Constants.DATA_PAYLOAD_LEN: {mesh_pb2.Constants.DATA_PAYLOAD_LEN}" - ) - if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN: + # A frame's worth; the room a frame really leaves is per packet, and the node enforces it + if len(data) > DATA_PAYLOAD_MAX: raise MeshInterface.MeshInterfaceError("Data payload too big") if ( @@ -565,11 +564,14 @@ def sendData( ): # we are now more strict wrt port numbers our_exit("Warning: A non-zero port number must be specified") - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() meshPacket.channel = channelIndex meshPacket.decoded.payload = data meshPacket.decoded.portnum = portNum - meshPacket.decoded.want_response = wantResponse + if wantResponse: + meshPacket.decoded.bitfield = wire_pb2.Data.BITFIELD_WANT_RESPONSE + if recordPath: + meshPacket.flags |= packet_pb2.MeshPacket.PACKET_RECORD_PATH meshPacket.id = self._generatePacketId() if replyId is not None: meshPacket.decoded.reply_id = replyId @@ -602,14 +604,14 @@ def sendPosition( Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. """ - p = mesh_pb2.Position() + p = wire_pb2.Position() if latitude != 0.0: - p.latitude_i = int(latitude / 1e-7) - logger.debug(f"p.latitude_i:{p.latitude_i}") + p.latitude = int(latitude / 1e-7) + logger.debug(f"p.latitude:{p.latitude}") if longitude != 0.0: - p.longitude_i = int(longitude / 1e-7) - logger.debug(f"p.longitude_i:{p.longitude_i}") + p.longitude = int(longitude / 1e-7) + logger.debug(f"p.longitude:{p.longitude}") if altitude != 0: p.altitude = int(altitude) @@ -638,17 +640,16 @@ def onResponsePosition(self, p): """on response for position""" if p["decoded"]["portnum"] == "POSITION_APP": self._acknowledgment.receivedPosition = True - position = mesh_pb2.Position() + position = wire_pb2.Position() position.ParseFromString(p["decoded"]["payload"]) + pos = self._fixupPosition(message_to_dict(position)) ret = "Position received: " - if position.latitude_i != 0 and position.longitude_i != 0: - ret += ( - f"({position.latitude_i * 10**-7}, {position.longitude_i * 10**-7})" - ) + if pos.get("latitudeI") and pos.get("longitudeI"): + ret += f"({pos['latitude']}, {pos['longitude']})" else: ret += "(unknown)" - if position.altitude != 0: + if position.HasField("altitude"): ret += f" {position.altitude}m" if position.precision_bits not in [0, 32]: @@ -669,16 +670,22 @@ def onResponsePosition(self, p): def sendTraceRoute( self, dest: Union[int, str], hopLimit: int, channelIndex: int = 0 ): - """Send the trace route""" - r = mesh_pb2.RouteDiscovery() + """Trace the route back from a node. + + 3.0 has no traceroute message: a frame that records its path carries it as a tail + of relay suffixes. This asks the node for its device metrics with the path recorded, + and the reply's tail is the route it took back to us.""" + r = telemetry_pb2.Telemetry() + r.device_metrics.SetInParent() self.sendData( r, destinationId=dest, - portNum=portnums_pb2.PortNum.TRACEROUTE_APP, + portNum=portnums_pb2.PortNum.TELEMETRY_APP, wantResponse=True, onResponse=self.onResponseTraceRoute, channelIndex=channelIndex, hopLimit=hopLimit, + recordPath=True, ) # extend timeout based on number of nodes, limit by configured hopLimit nodes_based_factor = (len(self.nodes) - 1) if self.nodes else (hopLimit + 1) @@ -694,49 +701,26 @@ def onResponseTraceRoute(self, p: dict): self._acknowledgment.receivedTraceRoute = True return - UNK_SNR = -128 # Value representing unknown SNR - - routeDiscovery = mesh_pb2.RouteDiscovery() - routeDiscovery.ParseFromString(p["decoded"]["payload"]) - asDict = google.protobuf.json_format.MessageToDict(routeDiscovery) - - print("Route traced towards destination:") - routeStr = self._nodeNumToId(p["to"], False) or f"{p['to']:08x}" # Start with destination of response - - # SNR list should have one more entry than the route, as the final destination adds its SNR also - lenTowards = 0 if "route" not in asDict else len(asDict["route"]) - snrTowardsValid = "snrTowards" in asDict and len(asDict["snrTowards"]) == lenTowards + 1 - if lenTowards > 0: # Loop through hops in route and add SNR if available - for idx, nodeNum in enumerate(asDict["route"]): - routeStr += " --> " + (self._nodeNumToId(nodeNum, False) or f"{nodeNum:08x}") \ - + " (" + (str(asDict["snrTowards"][idx] / 4) if snrTowardsValid and asDict["snrTowards"][idx] != UNK_SNR else "?") + "dB)" - - # End with origin of response - routeStr += " --> " + (self._nodeNumToId(p["from"], False) or f"{p['from']:08x}") \ - + " (" + (str(asDict["snrTowards"][-1] / 4) if snrTowardsValid and asDict["snrTowards"][-1] != UNK_SNR else "?") + "dB)" - - print(routeStr) # Print the route towards destination - - # Only if hopStart is set and there is an SNR entry (for the origin) it's valid, even though route might be empty (direct connection) - lenBack = 0 if "routeBack" not in asDict else len(asDict["routeBack"]) - backValid = "hopStart" in p and "snrBack" in asDict and len(asDict["snrBack"]) == lenBack + 1 - if backValid: - print("Route traced back to us:") - routeStr = self._nodeNumToId(p["from"], False) or f"{p['from']:08x}" # Start with origin of response - - if lenBack > 0: # Loop through hops in routeBack and add SNR if available - for idx, nodeNum in enumerate(asDict["routeBack"]): - routeStr += " --> " + (self._nodeNumToId(nodeNum, False) or f"{nodeNum:08x}") \ - + " (" + (str(asDict["snrBack"][idx] / 4) if asDict["snrBack"][idx] != UNK_SNR else "?") + "dB)" - - # End with destination of response (us) - routeStr += " --> " + (self._nodeNumToId(p["to"], False) or f"{p['to']:08x}") \ - + " (" + (str(asDict["snrBack"][-1] / 4) if asDict["snrBack"][-1] != UNK_SNR else "?") + "dB)" - - print(routeStr) # Print the route back to us - + raw = p["raw"] + hops = raw.hop_start - raw.hop_limit + route = [f"!{p['from']:08x}"] + if raw.flags & packet_pb2.MeshPacket.PACKET_RECORD_PATH: + route += [self._relaySuffixToId(b) for b in raw.path] + if hops > 0: + route.append(self._relaySuffixToId(raw.relay_node)) + elif hops > 0: + route.append(f"({hops} hops, path not recorded)") + route.append(f"!{p['to']:08x}") + print("Route traced back to us:") + print(" --> ".join(route) + f" ({raw.rx_snr / 2}dB)") self._acknowledgment.receivedTraceRoute = True + def _relaySuffixToId(self, suffix: int) -> str: + """Name a relay by its one-byte suffix: the node ID when exactly one known node ends + in that byte, else the suffix. 0x01 also stands for a NodeNum ending in 0x00.""" + nums = [n for n in (self.nodesByNum or {}) if n & 0xFF == suffix or (suffix == 1 and n & 0xFF == 0)] + return f"!{nums[0]:08x}" if len(nums) == 1 else f"!??????{suffix:02x}" + def sendTelemetry( self, destinationId: Union[int, str] = BROADCAST_ADDR, @@ -745,17 +729,15 @@ def sendTelemetry( telemetryType: str = "device_metrics", hopLimit: Optional[int]=None, ): - """Send telemetry and optionally ask for a response""" + """Send telemetry and optionally ask for a response. + + telemetryType names a Telemetry variant: device_metrics (filled from our node), + or sensor_readings, local_stats, host_metrics or traffic_management_stats, which + go out empty as a request.""" r = telemetry_pb2.Telemetry() - if telemetryType == "environment_metrics": - r.environment_metrics.CopyFrom(telemetry_pb2.EnvironmentMetrics()) - elif telemetryType == "air_quality_metrics": - r.air_quality_metrics.CopyFrom(telemetry_pb2.AirQualityMetrics()) - elif telemetryType == "power_metrics": - r.power_metrics.CopyFrom(telemetry_pb2.PowerMetrics()) - elif telemetryType == "local_stats": - r.local_stats.CopyFrom(telemetry_pb2.LocalStats()) + if telemetryType in ("sensor_readings", "local_stats", "host_metrics", "traffic_management_stats"): + getattr(r, telemetryType).SetInParent() else: # fall through to device metrics if self.nodesByNum is not None: node = self.nodesByNum.get(self.localNode.nodeNum) @@ -805,23 +787,25 @@ def onResponseTelemetry(self, p: dict): # Check if the telemetry message has the device_metrics field # This is the original code that was the default for --request-telemetry and is kept for compatibility if telemetry.HasField("device_metrics"): - if telemetry.device_metrics.battery_level is not None: - print(f"Battery level: {telemetry.device_metrics.battery_level:.2f}%") - if telemetry.device_metrics.voltage is not None: - print(f"Voltage: {telemetry.device_metrics.voltage:.2f} V") - if telemetry.device_metrics.channel_utilization is not None: - print( - f"Total channel utilization: {telemetry.device_metrics.channel_utilization:.2f}%" - ) - if telemetry.device_metrics.air_util_tx is not None: - print( - f"Transmit air utilization: {telemetry.device_metrics.air_util_tx:.2f}%" - ) - if telemetry.device_metrics.uptime_seconds is not None: - print(f"Uptime: {telemetry.device_metrics.uptime_seconds} s") + m = telemetry.device_metrics + if m.HasField("battery_level"): + print(f"Battery level: {m.battery_level:.2f}%") + if m.HasField("voltage"): + print(f"Voltage: {m.voltage / 1000:.2f} V") + if m.HasField("channel_utilization"): + print(f"Total channel utilization: {m.channel_utilization / 100:.2f}%") + if m.HasField("air_util_tx"): + print(f"Transmit air utilization: {m.air_util_tx / 100:.2f}%") + if m.HasField("uptime_seconds"): + print(f"Uptime: {m.uptime_seconds} s") + elif telemetry.HasField("sensor_readings"): + for sample in sensor_readings_to_list(telemetry.sensor_readings, telemetry.time): + print(f"sensorReadings at {sample.pop('time')}:") + for name, value in sample.items(): + print(f" {name}: {value}") else: # this is the new code if --request-telemetry is used. - telemetry_dict = google.protobuf.json_format.MessageToDict(telemetry) + telemetry_dict = message_to_dict(telemetry) for key, value in telemetry_dict.items(): if key != "time": # protobuf includes a time field that we don't print for device_metrics. print(f"{key}:") @@ -838,7 +822,7 @@ def onResponseWaypoint(self, p: dict): """on response for waypoint""" if p["decoded"]["portnum"] == "WAYPOINT_APP": self._acknowledgment.receivedWaypoint = True - w = mesh_pb2.Waypoint() + w = wire_pb2.Waypoint() w.ParseFromString(p["decoded"]["payload"]) print(f"Waypoint received: {w}") elif p["decoded"]["portnum"] == "ROUTING_APP": @@ -868,7 +852,7 @@ def sendWaypoint( Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. """ - w = mesh_pb2.Waypoint() + w = wire_pb2.Waypoint() w.name = name w.description = description w.icon = icon @@ -924,7 +908,7 @@ def deleteWaypoint( Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. """ - p = mesh_pb2.Waypoint() + p = wire_pb2.Waypoint() p.id = waypoint_id p.expire = 0 @@ -959,7 +943,7 @@ def _addResponseHandler( def _sendPacket( self, - meshPacket: mesh_pb2.MeshPacket, + meshPacket: packet_pb2.MeshPacket, destinationId: Union[int,str]=BROADCAST_ADDR, wantAck: bool=False, hopLimit: Optional[int]=None, @@ -977,7 +961,7 @@ def _sendPacket( if self.myInfo is not None and destinationId != self.myInfo.my_node_num: self._waitConnected() - toRadio = mesh_pb2.ToRadio() + toRadio = api_pb2.ToRadio() nodeNum: int = 0 if destinationId is None: @@ -1007,7 +991,8 @@ def _sendPacket( logger.warning("Warning: There were no self.nodes.") meshPacket.to = nodeNum - meshPacket.want_ack = wantAck + if wantAck: + meshPacket.flags |= packet_pb2.MeshPacket.PACKET_WANT_ACK if hopLimit is not None: meshPacket.hop_limit = hopLimit @@ -1016,7 +1001,7 @@ def _sendPacket( meshPacket.hop_limit = getattr(loraConfig, "hop_limit") if pkiEncrypted: - meshPacket.pki_encrypted = True + meshPacket.flags |= packet_pb2.MeshPacket.PACKET_PKI_ENCRYPTED if publicKey is not None: meshPacket.public_key = publicKey @@ -1163,8 +1148,8 @@ def _disconnected(self): def sendHeartbeat(self): """Sends a heartbeat to the radio. Can be used to verify the connection is healthy.""" - p = mesh_pb2.ToRadio() - p.heartbeat.CopyFrom(mesh_pb2.Heartbeat()) + p = api_pb2.ToRadio() + p.heartbeat.CopyFrom(api_pb2.Heartbeat()) self._sendToRadio(p) def _startHeartbeat(self): @@ -1203,7 +1188,7 @@ def _startConfig(self): [] ) # empty until we start getting channels pushed from the device (during config) - startConfig = mesh_pb2.ToRadio() + startConfig = api_pb2.ToRadio() if self.configId is None or not self.noNodes: self.configId = random.randint(0, 0xFFFFFFFF) if self.configId == NODELESS_WANT_CONFIG_ID: @@ -1213,7 +1198,7 @@ def _startConfig(self): def _sendDisconnect(self): """Tell device we are done using it""" - m = mesh_pb2.ToRadio() + m = api_pb2.ToRadio() m.disconnect = True self._sendToRadio(m) @@ -1228,7 +1213,7 @@ def _queueClaim(self) -> None: return self.queueStatus.free -= 1 - def _sendToRadio(self, toRadio: mesh_pb2.ToRadio) -> None: + def _sendToRadio(self, toRadio: api_pb2.ToRadio) -> None: """Send a ToRadio protobuf to the device""" if self.noProto: logger.warning( @@ -1277,7 +1262,7 @@ def _sendToRadio(self, toRadio: mesh_pb2.ToRadio) -> None: self.queue[packetId] = packet # logger.warn("queue + resentQueue: " + " ".join(f'{k:08x}' for k in self.queue)) - def _sendToRadioImpl(self, toRadio: mesh_pb2.ToRadio) -> None: + def _sendToRadioImpl(self, toRadio: api_pb2.ToRadio) -> None: """Send a ToRadio protobuf to the device""" logger.error(f"Subclass must provide toradio: {toRadio}") @@ -1296,10 +1281,10 @@ def _handleConfigComplete(self) -> None: def _handleQueueStatusFromRadio(self, queueStatus) -> None: self.queueStatus = queueStatus logger.debug( - f"TX QUEUE free {queueStatus.free} of {queueStatus.maxlen}, res = {queueStatus.res}, id = {queueStatus.mesh_packet_id:08x} " + f"TX QUEUE free {queueStatus.free} of {queueStatus.maxlen}, result = {queueStatus.result}, id = {queueStatus.mesh_packet_id:08x} " ) - if queueStatus.res: + if queueStatus.result: return # logger.warn("queue: " + " ".join(f'{k:08x}' for k in self.queue)) @@ -1317,7 +1302,7 @@ def _handleFromRadio(self, fromRadioBytes): Handle a packet that arrived from the radio(update model and publish events) Called by subclasses.""" - fromRadio = mesh_pb2.FromRadio() + fromRadio = api_pb2.FromRadio() logger.debug( f"in mesh_interface.py _handleFromRadio() fromRadioBytes: {fromRadioBytes}" ) @@ -1329,7 +1314,7 @@ def _handleFromRadio(self, fromRadioBytes): ) traceback.print_exc() raise ex - asDict = google.protobuf.json_format.MessageToDict(fromRadio) + asDict = message_to_dict(fromRadio) logger.debug(f"Received from radio: {fromRadio}") if fromRadio.HasField("my_info"): self.myInfo = fromRadio.my_info @@ -1345,6 +1330,8 @@ def _handleFromRadio(self, fromRadioBytes): node = self._getOrCreateByNum(asDict["nodeInfo"]["num"]) node.update(asDict["nodeInfo"]) + if "user" in node: # 3.0 User carries no id: it is the NodeNum + node["user"]["id"] = f"!{node['num']:08x}" try: newpos = self._fixupPosition(node["position"]) node["position"] = newpos @@ -1372,31 +1359,31 @@ def _handleFromRadio(self, fromRadioBytes): self._handlePacketFromRadio(fromRadio.packet) elif fromRadio.HasField("log_record"): self._handleLogRecord(fromRadio.log_record) - elif fromRadio.HasField("queueStatus"): - self._handleQueueStatusFromRadio(fromRadio.queueStatus) - elif fromRadio.HasField("clientNotification"): + elif fromRadio.HasField("queue_status"): + self._handleQueueStatusFromRadio(fromRadio.queue_status) + elif fromRadio.HasField("client_notification"): publishingThread.queueWork( lambda: pub.sendMessage( "meshtastic.clientNotification", - notification=fromRadio.clientNotification, + notification=fromRadio.client_notification, interface=self, ) ) - elif fromRadio.HasField("mqttClientProxyMessage"): + elif fromRadio.HasField("mqtt_client_proxy_message"): publishingThread.queueWork( lambda: pub.sendMessage( "meshtastic.mqttclientproxymessage", - proxymessage=fromRadio.mqttClientProxyMessage, + proxymessage=fromRadio.mqtt_client_proxy_message, interface=self, ) ) - elif fromRadio.HasField("xmodemPacket"): + elif fromRadio.HasField("xmodem_packet"): publishingThread.queueWork( lambda: pub.sendMessage( "meshtastic.xmodempacket", - packet=fromRadio.xmodemPacket, + packet=fromRadio.xmodem_packet, interface=self, ) ) @@ -1408,79 +1395,12 @@ def _handleFromRadio(self, fromRadioBytes): self._startConfig() # redownload the node db etc... - elif fromRadio.HasField("config") or fromRadio.HasField("moduleConfig"): - if fromRadio.config.HasField("device"): - self.localNode.localConfig.device.CopyFrom(fromRadio.config.device) - elif fromRadio.config.HasField("position"): - self.localNode.localConfig.position.CopyFrom(fromRadio.config.position) - elif fromRadio.config.HasField("power"): - self.localNode.localConfig.power.CopyFrom(fromRadio.config.power) - elif fromRadio.config.HasField("network"): - self.localNode.localConfig.network.CopyFrom(fromRadio.config.network) - elif fromRadio.config.HasField("display"): - self.localNode.localConfig.display.CopyFrom(fromRadio.config.display) - elif fromRadio.config.HasField("lora"): - self.localNode.localConfig.lora.CopyFrom(fromRadio.config.lora) - elif fromRadio.config.HasField("bluetooth"): - self.localNode.localConfig.bluetooth.CopyFrom( - fromRadio.config.bluetooth - ) - elif fromRadio.config.HasField("security"): - self.localNode.localConfig.security.CopyFrom( - fromRadio.config.security - ) - elif fromRadio.moduleConfig.HasField("mqtt"): - self.localNode.moduleConfig.mqtt.CopyFrom(fromRadio.moduleConfig.mqtt) - elif fromRadio.moduleConfig.HasField("serial"): - self.localNode.moduleConfig.serial.CopyFrom( - fromRadio.moduleConfig.serial - ) - elif fromRadio.moduleConfig.HasField("external_notification"): - self.localNode.moduleConfig.external_notification.CopyFrom( - fromRadio.moduleConfig.external_notification - ) - elif fromRadio.moduleConfig.HasField("store_forward"): - self.localNode.moduleConfig.store_forward.CopyFrom( - fromRadio.moduleConfig.store_forward - ) - elif fromRadio.moduleConfig.HasField("range_test"): - self.localNode.moduleConfig.range_test.CopyFrom( - fromRadio.moduleConfig.range_test - ) - elif fromRadio.moduleConfig.HasField("telemetry"): - self.localNode.moduleConfig.telemetry.CopyFrom( - fromRadio.moduleConfig.telemetry - ) - elif fromRadio.moduleConfig.HasField("canned_message"): - self.localNode.moduleConfig.canned_message.CopyFrom( - fromRadio.moduleConfig.canned_message - ) - elif fromRadio.moduleConfig.HasField("audio"): - self.localNode.moduleConfig.audio.CopyFrom(fromRadio.moduleConfig.audio) - elif fromRadio.moduleConfig.HasField("remote_hardware"): - self.localNode.moduleConfig.remote_hardware.CopyFrom( - fromRadio.moduleConfig.remote_hardware - ) - elif fromRadio.moduleConfig.HasField("neighbor_info"): - self.localNode.moduleConfig.neighbor_info.CopyFrom( - fromRadio.moduleConfig.neighbor_info - ) - elif fromRadio.moduleConfig.HasField("detection_sensor"): - self.localNode.moduleConfig.detection_sensor.CopyFrom( - fromRadio.moduleConfig.detection_sensor - ) - elif fromRadio.moduleConfig.HasField("ambient_lighting"): - self.localNode.moduleConfig.ambient_lighting.CopyFrom( - fromRadio.moduleConfig.ambient_lighting - ) - elif fromRadio.moduleConfig.HasField("paxcounter"): - self.localNode.moduleConfig.paxcounter.CopyFrom( - fromRadio.moduleConfig.paxcounter - ) - elif fromRadio.moduleConfig.HasField("traffic_management"): - self.localNode.moduleConfig.traffic_management.CopyFrom( - fromRadio.moduleConfig.traffic_management - ) + elif fromRadio.HasField("config") or fromRadio.HasField("module_config"): + for payload, target in ((fromRadio.config, self.localNode.localConfig), + (fromRadio.module_config, self.localNode.moduleConfig)): + section = payload.WhichOneof("payload_variant") + if section and section in target.DESCRIPTOR.fields_by_name: + getattr(target, section).CopyFrom(getattr(payload, section)) else: logger.debug("Unexpected FromRadio payload") @@ -1488,14 +1408,24 @@ def _handleFromRadio(self, fromRadioBytes): def _fixupPosition(self, position: Dict) -> Dict: """Convert integer lat/lon into floats + A 3.0 Position carries each coordinate either at full precision (latitude, an + integer of 1e-7 degrees, what the node sends a client) or scaled (latitudeScaled, + shifted right by 32 - precisionBits, the over-the-air form). Either becomes + latitudeI, and latitude becomes degrees. + Arguments: position {Position dictionary} -- object to fix up Returns the position with the updated keys """ - if "latitudeI" in position: - position["latitude"] = float(position["latitudeI"] * Decimal("1e-7")) - if "longitudeI" in position: - position["longitude"] = float(position["longitudeI"] * Decimal("1e-7")) + bits = position.get("precisionBits", 32) + for axis in ("latitude", "longitude"): + scaled = position.get(f"{axis}Scaled") + if scaled is not None: + position[f"{axis}I"] = scaled << (32 - bits) if 0 < bits < 32 else scaled + elif isinstance(position.get(axis), int): + position[f"{axis}I"] = position[axis] + if f"{axis}I" in position: + position[axis] = float(position[f"{axis}I"] * Decimal("1e-7")) return position def _nodeNumToId(self, num: int, isDest = True) -> Optional[str]: @@ -1537,7 +1467,7 @@ def _getOrCreateByNum(self, nodeNum): "id": presumptive_id, "longName": f"Meshtastic {presumptive_id[-4:]}", "shortName": f"{presumptive_id[-4:]}", - "hwModel": "UNSET", + "hwModel": 0, }, } # Create a minimal node db entry self.nodesByNum[nodeNum] = n @@ -1553,7 +1483,7 @@ def _handlePacketFromRadio(self, meshPacket, hack=False): hack - well, since we used 'from', which is a python keyword, as an attribute to MeshPacket in protobufs, there really is no way to do something like this: - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() meshPacket.from = 123 If hack is True, we can unit test this code. @@ -1563,7 +1493,7 @@ def _handlePacketFromRadio(self, meshPacket, hack=False): - meshtastic.receive.user(packet = MeshPacket dictionary) - meshtastic.receive.data(packet = MeshPacket dictionary) """ - asDict = google.protobuf.json_format.MessageToDict(meshPacket) + asDict = message_to_dict(meshPacket) # We normally decompose the payload into a dictionary so that the client # doesn't need to understand protobufs. But advanced clients might @@ -1631,7 +1561,7 @@ def _handlePacketFromRadio(self, meshPacket, hack=False): if handler.protobufFactory is not None: pb = handler.protobufFactory() pb.ParseFromString(meshPacket.decoded.payload) - p = google.protobuf.json_format.MessageToDict(pb) + p = message_to_dict(pb) asDict["decoded"][handler.name] = p # Also provide the protobuf raw asDict["decoded"][handler.name]["raw"] = pb diff --git a/meshtastic/node.py b/meshtastic/node.py index 7ce2da084..b99e6561f 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -7,7 +7,7 @@ from typing import Optional, Union, List -from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, config_pb2, localonly_pb2, mesh_pb2, portnums_pb2 +from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, common_pb2, config_pb2, localonly_pb2, portnums_pb2, wire_pb2 from meshtastic.util import ( Timeout, camel_to_snake, @@ -17,12 +17,25 @@ stripnl, message_to_json, generate_channel_hash, + hw_model_name, to_node_num, flags_to_list, ) logger = logging.getLogger(__name__) +MAX_CHANNELS = 16 +"""Channels a 3.0 node holds""" + + +def channel_role(ch: channel_pb2.Channel) -> str: + """A 3.0 channel has no role field: index 0 is the primary, and a channel without + settings is disabled.""" + if ch.index == 0: + return "PRIMARY" + return "SECONDARY" if ch.HasField("settings") else "DISABLED" + + class Node: """A model of a (local or remote) node in the mesh @@ -58,20 +71,21 @@ def __repr__(self): @staticmethod def position_flags_list(position_flags: int) -> List[str]: "Return a list of position flags from the given flags integer" - return flags_to_list(config_pb2.Config.PositionConfig.PositionFlags, position_flags) + return flags_to_list(config_pb2.PositionConfig.PositionFlags, position_flags) @staticmethod def excluded_modules_list(excluded_modules: int) -> List[str]: - "Return a list of excluded modules from the given flags integer" - return flags_to_list(mesh_pb2.ExcludedModules, excluded_modules) + "Return the excluded modules: bit N of the integer is AdminMessage.ModuleConfigType N" + module_type = admin_pb2.AdminMessage.ModuleConfigType + return [name for name, n in module_type.items() if excluded_modules >> n & 1] - def module_available(self, excluded_bit: int) -> bool: - """Check DeviceMetadata.excluded_modules to see if a module is available.""" + def module_available(self, module_type: int) -> bool: + """Check DeviceMetadata.excluded_modules to see if a module (an AdminMessage.ModuleConfigType) is available.""" meta = getattr(self.iface, "metadata", None) if meta is None: return True try: - return (meta.excluded_modules & excluded_bit) == 0 + return not meta.excluded_modules >> module_type & 1 except Exception: return True @@ -83,9 +97,9 @@ def showChannels(self): for c in self.channels: cStr = message_to_json(c.settings) # don't show disabled channels - if channel_pb2.Channel.Role.Name(c.role) != "DISABLED": + if channel_role(c) != "DISABLED": print( - f" Index {c.index}: {channel_pb2.Channel.Role.Name(c.role)} psk={pskToString(c.settings.psk)} {cStr}" + f" Index {c.index}: {channel_role(c)} psk={pskToString(c.settings.psk)} {cStr}" ) publicURL = self.getURL(includeAll=False) adminURL = self.getURL(includeAll=True) @@ -196,56 +210,10 @@ def writeConfig(self, config_name): p = admin_pb2.AdminMessage() - if config_name == "device": - p.set_config.device.CopyFrom(self.localConfig.device) - elif config_name == "position": - p.set_config.position.CopyFrom(self.localConfig.position) - elif config_name == "power": - p.set_config.power.CopyFrom(self.localConfig.power) - elif config_name == "network": - p.set_config.network.CopyFrom(self.localConfig.network) - elif config_name == "display": - p.set_config.display.CopyFrom(self.localConfig.display) - elif config_name == "lora": - p.set_config.lora.CopyFrom(self.localConfig.lora) - elif config_name == "bluetooth": - p.set_config.bluetooth.CopyFrom(self.localConfig.bluetooth) - elif config_name == "security": - p.set_config.security.CopyFrom(self.localConfig.security) - elif config_name == "mqtt": - p.set_module_config.mqtt.CopyFrom(self.moduleConfig.mqtt) - elif config_name == "serial": - p.set_module_config.serial.CopyFrom(self.moduleConfig.serial) - elif config_name == "external_notification": - p.set_module_config.external_notification.CopyFrom( - self.moduleConfig.external_notification - ) - elif config_name == "store_forward": - p.set_module_config.store_forward.CopyFrom(self.moduleConfig.store_forward) - elif config_name == "range_test": - p.set_module_config.range_test.CopyFrom(self.moduleConfig.range_test) - elif config_name == "telemetry": - p.set_module_config.telemetry.CopyFrom(self.moduleConfig.telemetry) - elif config_name == "canned_message": - p.set_module_config.canned_message.CopyFrom( - self.moduleConfig.canned_message - ) - elif config_name == "audio": - p.set_module_config.audio.CopyFrom(self.moduleConfig.audio) - elif config_name == "remote_hardware": - p.set_module_config.remote_hardware.CopyFrom( - self.moduleConfig.remote_hardware - ) - elif config_name == "neighbor_info": - p.set_module_config.neighbor_info.CopyFrom(self.moduleConfig.neighbor_info) - elif config_name == "detection_sensor": - p.set_module_config.detection_sensor.CopyFrom(self.moduleConfig.detection_sensor) - elif config_name == "ambient_lighting": - p.set_module_config.ambient_lighting.CopyFrom(self.moduleConfig.ambient_lighting) - elif config_name == "paxcounter": - p.set_module_config.paxcounter.CopyFrom(self.moduleConfig.paxcounter) - elif config_name == "traffic_management": - p.set_module_config.traffic_management.CopyFrom(self.moduleConfig.traffic_management) + if config_name in self.localConfig.DESCRIPTOR.fields_by_name and config_name != "version": + getattr(p.set_config, config_name).CopyFrom(getattr(self.localConfig, config_name)) + elif config_name in self.moduleConfig.DESCRIPTOR.fields_by_name and config_name != "version": + getattr(p.set_module_config, config_name).CopyFrom(getattr(self.moduleConfig, config_name)) else: our_exit(f"Error: No valid config with name {config_name}") @@ -276,11 +244,7 @@ def getChannelByChannelIndex(self, channelIndex): def deleteChannel(self, channelIndex): """Delete the specified channelIndex and shift other channels up""" - ch = self.channels[channelIndex] - if ch.role not in ( - channel_pb2.Channel.Role.SECONDARY, - channel_pb2.Channel.Role.DISABLED, - ): + if channelIndex == 0: our_exit("Warning: Only SECONDARY channels can be deleted") # we are careful here because if we move the "admin" channel the channelIndex we need to use @@ -297,7 +261,7 @@ def deleteChannel(self, channelIndex): ] self.channels.pop(channelIndex) - self._fixupChannels() # expand back to 8 channels + self._fixupChannels() # expand back to MAX_CHANNELS channels index = channelIndex for old_ch in old_channels: @@ -322,7 +286,7 @@ def getChannelByName(self, name): def getDisabledChannel(self): """Return the first channel that is disabled (i.e. available for some new use)""" for c in self.channels: - if c.role == channel_pb2.Channel.Role.DISABLED: + if channel_role(c) == "DISABLED": return c return None @@ -377,8 +341,8 @@ def getURL(self, includeAll: bool = True): channelSet = apponly_pb2.ChannelSet() if self.channels: for c in self.channels: - if c.role == channel_pb2.Channel.Role.PRIMARY or ( - includeAll and c.role == channel_pb2.Channel.Role.SECONDARY + if channel_role(c) == "PRIMARY" or ( + includeAll and channel_role(c) == "SECONDARY" ): channelSet.settings.append(c.settings) @@ -402,18 +366,14 @@ def getContactURL(self, node_id: Union[int, str], should_ignore: bool = False, m contact.node_num = nodeNum u = node["user"] - if u.get("id"): - contact.user.id = u["id"] - if u.get("macaddr"): - contact.user.macaddr = base64.b64decode(u["macaddr"]) if u.get("longName"): contact.user.long_name = u["longName"] if u.get("shortName"): contact.user.short_name = u["shortName"] - if u.get("hwModel") and u["hwModel"] != "UNSET": - contact.user.hw_model = mesh_pb2.HardwareModel.Value(u["hwModel"]) + if u.get("hwModel"): + contact.user.hw_model = u["hwModel"] if u.get("role"): - contact.user.role = config_pb2.Config.DeviceConfig.Role.Value(u["role"]) + contact.user.role = common_pb2.Role.Value(u["role"]) if u.get("publicKey"): contact.user.public_key = base64.b64decode(u["publicKey"]) if u.get("isLicensed"): @@ -471,18 +431,12 @@ def setURL(self, url: str, addOnly: bool = False): if not ch: our_exit("Warning: No free channels were found") ch.settings.CopyFrom(chs) - ch.role = channel_pb2.Channel.Role.SECONDARY print(f"Adding new channel '{chs.name}' to device") self.writeChannel(ch.index) else: i = 0 for chs in channelSet.settings: ch = channel_pb2.Channel() - ch.role = ( - channel_pb2.Channel.Role.PRIMARY - if i == 0 - else channel_pb2.Channel.Role.SECONDARY - ) ch.index = i ch.settings.CopyFrom(chs) self.channels[ch.index] = ch @@ -542,7 +496,7 @@ def onResponseRequestRingtone(self, p): def get_ringtone(self): """Get the ringtone. Concatenate all pieces together and return a single string.""" logger.debug(f"in get_ringtone()") - if not self.module_available(mesh_pb2.EXTNOTIF_CONFIG): + if not self.module_available(admin_pb2.AdminMessage.EXTNOTIF_CONFIG): logging.warning("External Notification module not present (excluded by firmware)") return None @@ -567,7 +521,7 @@ def get_ringtone(self): def set_ringtone(self, ringtone): """Set the ringtone. The ringtone length must be less than 230 character.""" - if not self.module_available(mesh_pb2.EXTNOTIF_CONFIG): + if not self.module_available(admin_pb2.AdminMessage.EXTNOTIF_CONFIG): logging.warning("External Notification module not present (excluded by firmware)") return None @@ -620,7 +574,7 @@ def onResponseRequestCannedMessagePluginMessageMessages(self, p): def get_canned_message(self): """Get the canned message string. Concatenate all pieces together and return a single string.""" logger.debug(f"in get_canned_message()") - if not self.module_available(mesh_pb2.CANNEDMSG_CONFIG): + if not self.module_available(admin_pb2.AdminMessage.CANNEDMSG_CONFIG): logging.warning("Canned Message module not present (excluded by firmware)") return None if not self.cannedPluginMessage: @@ -648,7 +602,7 @@ def get_canned_message(self): def set_canned_message(self, message): """Set the canned message. The canned messages length must be less than 200 character.""" - if not self.module_available(mesh_pb2.CANNEDMSG_CONFIG): + if not self.module_available(admin_pb2.AdminMessage.CANNEDMSG_CONFIG): logging.warning("Canned Message module not present (excluded by firmware)") return None @@ -730,20 +684,6 @@ def commitSettingsTransaction(self): onResponse = self.onAckNak return self._sendAdmin(p, onResponse=onResponse) - def rebootOTA(self, secs: int = 10): - """Tell the node to reboot into factory firmware (firmware < 2.7.18).""" - self.ensureSessionKey() - p = admin_pb2.AdminMessage() - p.reboot_ota_seconds = secs - logger.info(f"Telling node to reboot to OTA in {secs} seconds") - - # If sending to a remote node, wait for ACK/NAK - if self == self.iface.localNode: - onResponse = None - else: - onResponse = self.onAckNak - return self._sendAdmin(p, onResponse=onResponse) - def startOTA( self, ota_mode: admin_pb2.OTAMode.ValueType, @@ -905,16 +845,16 @@ def setFixedPosition(self, lat: Union[int, float], lon: Union[int, float], alt: """Tell the node to set fixed position to the provided value and enable the fixed position setting""" self.ensureSessionKey() - p = mesh_pb2.Position() + p = wire_pb2.Position() if isinstance(lat, float) and lat != 0.0: - p.latitude_i = int(lat / 1e-7) + p.latitude = int(lat / 1e-7) elif isinstance(lat, int) and lat != 0: - p.latitude_i = lat + p.latitude = lat if isinstance(lon, float) and lon != 0.0: - p.longitude_i = int(lon / 1e-7) + p.longitude = int(lon / 1e-7) elif isinstance(lon, int) and lon != 0: - p.longitude_i = lon + p.longitude = lon if alt != 0: p.altitude = alt @@ -971,9 +911,8 @@ def _fillChannels(self): # Add extra disabled channels as needed index = len(self.channels) - while index < 8: + while index < MAX_CHANNELS: ch = channel_pb2.Channel() - ch.role = channel_pb2.Channel.Role.DISABLED ch.index = index self.channels.append(ch) index += 1 @@ -1006,16 +945,13 @@ def onRequestGetMetadata(self, p): logger.debug(f"Received metadata {stripnl(c)}") print(f"\nfirmware_version: {c.firmware_version}") print(f"device_state_version: {c.device_state_version}") - if c.role in config_pb2.Config.DeviceConfig.Role.values(): - print(f"role: {config_pb2.Config.DeviceConfig.Role.Name(c.role)}") + if c.role in common_pb2.Role.values(): + print(f"role: {common_pb2.Role.Name(c.role)}") else: print(f"role: {c.role}") print(f"position_flags: {self.position_flags_list(c.position_flags)}") - if c.hw_model in mesh_pb2.HardwareModel.values(): - print(f"hw_model: {mesh_pb2.HardwareModel.Name(c.hw_model)}") - else: - print(f"hw_model: {c.hw_model}") - print(f"hasPKC: {c.hasPKC}") + print(f"hw_model: {hw_model_name(c.hw_model)}") + print(f"capabilities: {flags_to_list(common_pb2.DeviceMetadata.Capabilities, c.capabilities)}") if c.excluded_modules > 0: print(f"excluded_modules: {self.excluded_modules_list(c.excluded_modules)}") @@ -1045,7 +981,7 @@ def onResponseRequestChannel(self, p): logger.debug(f"Received channel {stripnl(c)}") index = c.index - if index >= 8 - 1: + if index >= MAX_CHANNELS - 1: logger.debug("Finished downloading channels") self.channels = self.partialChannels @@ -1147,7 +1083,7 @@ def get_channels_with_hash(self): hash_val = None result.append({ "index": c.index, - "role": channel_pb2.Channel.Role.Name(c.role), + "role": channel_role(c), "name": c.settings.name if c.settings and hasattr(c.settings, "name") else "", "hash": hash_val, }) diff --git a/meshtastic/powermon/stress.py b/meshtastic/powermon/stress.py index b416d8a3a..a0fac65fc 100644 --- a/meshtastic/powermon/stress.py +++ b/meshtastic/powermon/stress.py @@ -41,7 +41,7 @@ def sendPowerStress( """Client goo for talking with the device side agent.""" r = powermon_pb2.PowerStressMessage() r.cmd = cmd - r.num_seconds = num_seconds + r.num_seconds = round(num_seconds) # whole seconds on the wire return self.iface.sendData( r, diff --git a/meshtastic/protobuf/admin_pb2.py b/meshtastic/protobuf/admin_pb2.py index 18f6d6731..baa970d38 100644 --- a/meshtastic/protobuf/admin_pb2.py +++ b/meshtastic/protobuf/admin_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/admin.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -12,96 +13,103 @@ from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2 +from meshtastic.protobuf import common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 from meshtastic.protobuf import connection_status_pb2 as meshtastic_dot_protobuf_dot_connection__status__pb2 from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 +from meshtastic.protobuf import wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb7\x1e\n\x0c\x41\x64minMessage\x12\x1e\n\x0fsession_passkey\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08\x08\x12\x1d\n\x13get_channel_request\x18\x02 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x03 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x04 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x05 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x06 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12\x41\n\x13get_config_response\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12W\n\x19get_module_config_request\x18\x08 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12N\n\x1aget_module_config_response\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\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\xe7\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\x80\x02H\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\x1c \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18\x1d \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\nset_config\x18\x1e \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12\x45\n\x11set_module_config\x18\x1f \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12\x34\n\"set_canned_message_module_messages\x18 \x01(\tB\x06\x92?\x03\x08\xe7\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, \x01(\rH\x00\x12\x1b\n\x11toggle_muted_node\x18- \x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18. \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18/ \x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x30 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x31 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18\x32 \x01(\x11H\x00\x12\x18\n\x0e\x65xit_simulator\x18\x33 \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x34 \x01(\x11H\x00\x12\x1a\n\x10shutdown_seconds\x18\x35 \x01(\x11H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x36 \x01(\x11H\x00\x12\x16\n\x0cnodedb_reset\x18\x37 \x01(\x08H\x00\x12\x41\n\x0bota_request\x18\x38 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18\x39 \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18: \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1a\x96\x01\n\nInputEvent\x12@\n\nevent_code\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB\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 \"\xfa\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\x12\x10\n\x0cRELAY_CONFIG\x10\n\x12\x10\n\x0cGROUP_CONFIG\x10\x0b\"\x84\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\x10TELEMETRY_CONFIG\x10\x04\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x05\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x06\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x07\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\x08\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\t\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\n\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0b\x12\x18\n\x14STATUSMESSAGE_CONFIG\x10\x0c\x12\x1c\n\x18TRAFFICMANAGEMENT_CONFIG\x10\r\x12\x0e\n\nTAK_CONFIG\x10\x0e\x12\x15\n\x11MESHBEACON_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\"\xa4\x01\n\x0cLockdownAuth\x12\x19\n\npassphrase\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\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(\x11\x12\x11\n\tfrequency\x18\x03 \x01(\r\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(\x07\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(\x11H\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(\x11H\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(\x11H\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(\x11H\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\"A\n\x0cSHTXX_config\x12 \n\x0cset_accuracy\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x0f\n\r_set_accuracy\"Z\n\rDS248X_config\x12,\n\x18main_temperature_channel\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x1b\n\x19_main_temperature_channel\"L\n\rAS3935_config\x12%\n\x11set_tuning_cap_pf\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.admin_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _ADMINMESSAGE_INPUTEVENT.fields_by_name['event_code']._options = None - _ADMINMESSAGE_INPUTEVENT.fields_by_name['event_code']._serialized_options = b'\222?\0028\010' - _ADMINMESSAGE_INPUTEVENT.fields_by_name['kb_char']._options = None - _ADMINMESSAGE_INPUTEVENT.fields_by_name['kb_char']._serialized_options = b'\222?\0028\010' - _ADMINMESSAGE_INPUTEVENT.fields_by_name['touch_x']._options = None - _ADMINMESSAGE_INPUTEVENT.fields_by_name['touch_x']._serialized_options = b'\222?\0028\020' - _ADMINMESSAGE_INPUTEVENT.fields_by_name['touch_y']._options = None - _ADMINMESSAGE_INPUTEVENT.fields_by_name['touch_y']._serialized_options = b'\222?\0028\020' - _ADMINMESSAGE_OTAEVENT.fields_by_name['ota_hash']._options = None - _ADMINMESSAGE_OTAEVENT.fields_by_name['ota_hash']._serialized_options = b'\222?\002\010 ' - _ADMINMESSAGE.fields_by_name['session_passkey']._options = None - _ADMINMESSAGE.fields_by_name['session_passkey']._serialized_options = b'\222?\002\010\010' - _ADMINMESSAGE.fields_by_name['get_canned_message_module_messages_response']._options = None - _ADMINMESSAGE.fields_by_name['get_canned_message_module_messages_response']._serialized_options = b'\222?\003\010\311\001' - _ADMINMESSAGE.fields_by_name['get_ringtone_response']._options = None - _ADMINMESSAGE.fields_by_name['get_ringtone_response']._serialized_options = b'\222?\003\010\347\001' - _ADMINMESSAGE.fields_by_name['delete_file_request']._options = None - _ADMINMESSAGE.fields_by_name['delete_file_request']._serialized_options = b'\222?\003\010\311\001' - _ADMINMESSAGE.fields_by_name['set_canned_message_module_messages']._options = None - _ADMINMESSAGE.fields_by_name['set_canned_message_module_messages']._serialized_options = b'\222?\003\010\311\001' - _ADMINMESSAGE.fields_by_name['set_ringtone_message']._options = None - _ADMINMESSAGE.fields_by_name['set_ringtone_message']._serialized_options = b'\222?\003\010\347\001' - _ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._options = None - _ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._serialized_options = b'\030\001' - _LOCKDOWNAUTH.fields_by_name['passphrase']._options = None - _LOCKDOWNAUTH.fields_by_name['passphrase']._serialized_options = b'\222?\002\010 ' - _HAMPARAMETERS.fields_by_name['call_sign']._options = None - _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=6900 - _globals['_OTAMODE']._serialized_end=6955 - _globals['_ADMINMESSAGE']._serialized_start=315 - _globals['_ADMINMESSAGE']._serialized_end=4162 - _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3273 - _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3384 - _globals['_ADMINMESSAGE_OTAEVENT']._serialized_start=3386 - _globals['_ADMINMESSAGE_OTAEVENT']._serialized_end=3476 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3479 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3693 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3696 - _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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['event_code']._options = None + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['event_code']._serialized_options = b'\222?\0028\010' + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['kb_char']._options = None + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['kb_char']._serialized_options = b'\222?\0028\010' + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['touch_x']._options = None + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['touch_x']._serialized_options = b'\222?\0028\020' + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['touch_y']._options = None + _globals['_ADMINMESSAGE_INPUTEVENT'].fields_by_name['touch_y']._serialized_options = b'\222?\0028\020' + _globals['_ADMINMESSAGE_OTAEVENT'].fields_by_name['ota_hash']._options = None + _globals['_ADMINMESSAGE_OTAEVENT'].fields_by_name['ota_hash']._serialized_options = b'\222?\002\010 ' + _globals['_ADMINMESSAGE'].fields_by_name['session_passkey']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['session_passkey']._serialized_options = b'\222?\002\010\010' + _globals['_ADMINMESSAGE'].fields_by_name['get_canned_message_module_messages_response']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['get_canned_message_module_messages_response']._serialized_options = b'\222?\003\010\347\001' + _globals['_ADMINMESSAGE'].fields_by_name['get_ringtone_response']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['get_ringtone_response']._serialized_options = b'\222?\003\010\347\001' + _globals['_ADMINMESSAGE'].fields_by_name['delete_file_request']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['delete_file_request']._serialized_options = b'\222?\003\010\200\002' + _globals['_ADMINMESSAGE'].fields_by_name['set_canned_message_module_messages']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['set_canned_message_module_messages']._serialized_options = b'\222?\003\010\347\001' + _globals['_ADMINMESSAGE'].fields_by_name['set_ringtone_message']._options = None + _globals['_ADMINMESSAGE'].fields_by_name['set_ringtone_message']._serialized_options = b'\222?\003\010\347\001' + _globals['_LOCKDOWNAUTH'].fields_by_name['passphrase']._options = None + _globals['_LOCKDOWNAUTH'].fields_by_name['passphrase']._serialized_options = b'\222?\002\010 ' + _globals['_LOCKDOWNAUTH'].fields_by_name['boots_remaining']._options = None + _globals['_LOCKDOWNAUTH'].fields_by_name['boots_remaining']._serialized_options = b'\222?\0028\020' + _globals['_HAMPARAMETERS'].fields_by_name['call_sign']._options = None + _globals['_HAMPARAMETERS'].fields_by_name['call_sign']._serialized_options = b'\222?\002\010\010' + _globals['_HAMPARAMETERS'].fields_by_name['short_name']._options = None + _globals['_HAMPARAMETERS'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_HAMPARAMETERS'].fields_by_name['long_name']._options = None + _globals['_HAMPARAMETERS'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\017' + _globals['_NODEREMOTEHARDWAREPINSRESPONSE'].fields_by_name['node_remote_hardware_pins']._options = None + _globals['_NODEREMOTEHARDWAREPINSRESPONSE'].fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\020' + _globals['_SHTXX_CONFIG'].fields_by_name['set_accuracy']._options = None + _globals['_SHTXX_CONFIG'].fields_by_name['set_accuracy']._serialized_options = b'\222?\0028\010' + _globals['_DS248X_CONFIG'].fields_by_name['main_temperature_channel']._options = None + _globals['_DS248X_CONFIG'].fields_by_name['main_temperature_channel']._serialized_options = b'\222?\0028\010' + _globals['_AS3935_CONFIG'].fields_by_name['set_tuning_cap_pf']._options = None + _globals['_AS3935_CONFIG'].fields_by_name['set_tuning_cap_pf']._serialized_options = b'\222?\0028\010' + _globals['_OTAMODE']._serialized_start=7010 + _globals['_OTAMODE']._serialized_end=7065 + _globals['_ADMINMESSAGE']._serialized_start=349 + _globals['_ADMINMESSAGE']._serialized_end=4244 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3302 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3452 + _globals['_ADMINMESSAGE_OTAEVENT']._serialized_start=3454 + _globals['_ADMINMESSAGE_OTAEVENT']._serialized_end=3544 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3547 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3797 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3800 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=4188 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=4190 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=4225 + _globals['_LOCKDOWNAUTH']._serialized_start=4247 + _globals['_LOCKDOWNAUTH']._serialized_end=4411 + _globals['_HAMPARAMETERS']._serialized_start=4414 + _globals['_HAMPARAMETERS']._serialized_end=4545 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=4547 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=4665 + _globals['_SHAREDCONTACT']._serialized_start=4667 + _globals['_SHAREDCONTACT']._serialized_end=4791 + _globals['_KEYVERIFICATIONADMIN']._serialized_start=4794 + _globals['_KEYVERIFICATIONADMIN']._serialized_end=5087 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4964 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=5067 + _globals['_SENSORCONFIG']._serialized_start=5090 + _globals['_SENSORCONFIG']._serialized_end=5507 + _globals['_SCD4X_CONFIG']._serialized_start=5510 + _globals['_SCD4X_CONFIG']._serialized_end=5864 + _globals['_SEN5X_CONFIG']._serialized_start=5867 + _globals['_SEN5X_CONFIG']._serialized_end=6041 + _globals['_SEN6X_CONFIG']._serialized_start=6044 + _globals['_SEN6X_CONFIG']._serialized_end=6460 + _globals['_SCD30_CONFIG']._serialized_start=6463 + _globals['_SCD30_CONFIG']._serialized_end=6771 + _globals['_SHTXX_CONFIG']._serialized_start=6773 + _globals['_SHTXX_CONFIG']._serialized_end=6838 + _globals['_DS248X_CONFIG']._serialized_start=6840 + _globals['_DS248X_CONFIG']._serialized_end=6930 + _globals['_AS3935_CONFIG']._serialized_start=6932 + _globals['_AS3935_CONFIG']._serialized_end=7008 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index 92395f38b..2af8d1d77 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -3,34 +3,35 @@ isort:skip_file """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import meshtastic.protobuf.channel_pb2 -import meshtastic.protobuf.config_pb2 -import meshtastic.protobuf.connection_status_pb2 -import meshtastic.protobuf.device_ui_pb2 -import meshtastic.protobuf.mesh_pb2 -import meshtastic.protobuf.module_config_pb2 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import channel_pb2 as _channel_pb2 +from . import common_pb2 as _common_pb2 +from . import config_pb2 as _config_pb2 +from . import connection_status_pb2 as _connection_status_pb2 +from . import device_ui_pb2 as _device_ui_pb2 +from . import module_config_pb2 as _module_config_pb2 +from . import wire_pb2 as _wire_pb2 +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _OTAMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _OTAModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_OTAMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _OTAModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_OTAMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor NO_REBOOT_OTA: _OTAMode.ValueType # 0 """ Do not reboot into OTA mode @@ -61,55 +62,55 @@ OTA_WIFI: OTAMode.ValueType # 2 """ Reboot into OTA mode for WiFi firmware update """ -global___OTAMode = OTAMode +Global___OTAMode: _TypeAlias = OTAMode # noqa: Y015 -@typing.final -class AdminMessage(google.protobuf.message.Message): +@_typing.final +class AdminMessage(_message.Message): """ This message is handled by the Admin module and is responsible for all settings/channel read/write operations. This message is used to do settings operations to both remote AND local nodes. (Prior to 1.2 these operations were done via special ToRadio operations) """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _ConfigType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _ConfigTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._ConfigType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _ConfigTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[AdminMessage._ConfigType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor DEVICE_CONFIG: AdminMessage._ConfigType.ValueType # 0 """ - TODO: REPLACE + Device configuration (role, serial behavior, etc.) """ POSITION_CONFIG: AdminMessage._ConfigType.ValueType # 1 """ - TODO: REPLACE + Position configuration (GPS settings, broadcast interval, etc.) """ POWER_CONFIG: AdminMessage._ConfigType.ValueType # 2 """ - TODO: REPLACE + Power configuration (sleep settings, ADC multiplier, etc.) """ NETWORK_CONFIG: AdminMessage._ConfigType.ValueType # 3 """ - TODO: REPLACE + Network configuration (WiFi SSID/password, NTP, etc.) """ DISPLAY_CONFIG: AdminMessage._ConfigType.ValueType # 4 """ - TODO: REPLACE + Display configuration (screen orientation, units, OLED settings, etc.) """ LORA_CONFIG: AdminMessage._ConfigType.ValueType # 5 """ - TODO: REPLACE + LoRa radio configuration (region, modem preset, hop limit, TX power, etc.) """ BLUETOOTH_CONFIG: AdminMessage._ConfigType.ValueType # 6 """ - TODO: REPLACE + Bluetooth configuration (enabled, pairing mode, fixed PIN, etc.) """ SECURITY_CONFIG: AdminMessage._ConfigType.ValueType # 7 """ - TODO: REPLACE + Security configuration (public key, private key, admin key, etc.) """ SESSIONKEY_CONFIG: AdminMessage._ConfigType.ValueType # 8 """ @@ -119,43 +120,53 @@ class AdminMessage(google.protobuf.message.Message): """ device-ui config """ + RELAY_CONFIG: AdminMessage._ConfigType.ValueType # 10 + """ + Relay policy configuration + """ + GROUP_CONFIG: AdminMessage._ConfigType.ValueType # 11 + """ + Anycast group configuration + """ class ConfigType(_ConfigType, metaclass=_ConfigTypeEnumTypeWrapper): """ - TODO: REPLACE + Identifies which device configuration block to get or set. Value N is the section + ConfigPayload carries at tag N + 1 and LocalConfig stores at field N + 1; + schema_lint's sections rule checks that the three lists agree. """ DEVICE_CONFIG: AdminMessage.ConfigType.ValueType # 0 """ - TODO: REPLACE + Device configuration (role, serial behavior, etc.) """ POSITION_CONFIG: AdminMessage.ConfigType.ValueType # 1 """ - TODO: REPLACE + Position configuration (GPS settings, broadcast interval, etc.) """ POWER_CONFIG: AdminMessage.ConfigType.ValueType # 2 """ - TODO: REPLACE + Power configuration (sleep settings, ADC multiplier, etc.) """ NETWORK_CONFIG: AdminMessage.ConfigType.ValueType # 3 """ - TODO: REPLACE + Network configuration (WiFi SSID/password, NTP, etc.) """ DISPLAY_CONFIG: AdminMessage.ConfigType.ValueType # 4 """ - TODO: REPLACE + Display configuration (screen orientation, units, OLED settings, etc.) """ LORA_CONFIG: AdminMessage.ConfigType.ValueType # 5 """ - TODO: REPLACE + LoRa radio configuration (region, modem preset, hop limit, TX power, etc.) """ BLUETOOTH_CONFIG: AdminMessage.ConfigType.ValueType # 6 """ - TODO: REPLACE + Bluetooth configuration (enabled, pairing mode, fixed PIN, etc.) """ SECURITY_CONFIG: AdminMessage.ConfigType.ValueType # 7 """ - TODO: REPLACE + Security configuration (public key, private key, admin key, etc.) """ SESSIONKEY_CONFIG: AdminMessage.ConfigType.ValueType # 8 """ @@ -165,162 +176,164 @@ class AdminMessage(google.protobuf.message.Message): """ device-ui config """ + RELAY_CONFIG: AdminMessage.ConfigType.ValueType # 10 + """ + Relay policy configuration + """ + GROUP_CONFIG: AdminMessage.ConfigType.ValueType # 11 + """ + Anycast group configuration + """ class _ModuleConfigType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _ModuleConfigTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._ModuleConfigType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _ModuleConfigTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[AdminMessage._ModuleConfigType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor MQTT_CONFIG: AdminMessage._ModuleConfigType.ValueType # 0 """ - TODO: REPLACE + MQTT module configuration """ SERIAL_CONFIG: AdminMessage._ModuleConfigType.ValueType # 1 """ - TODO: REPLACE + Serial module configuration """ EXTNOTIF_CONFIG: AdminMessage._ModuleConfigType.ValueType # 2 """ - TODO: REPLACE + External notification module configuration """ STOREFORWARD_CONFIG: AdminMessage._ModuleConfigType.ValueType # 3 """ - TODO: REPLACE - """ - RANGETEST_CONFIG: AdminMessage._ModuleConfigType.ValueType # 4 + Store and Forward module configuration """ - TODO: REPLACE + TELEMETRY_CONFIG: AdminMessage._ModuleConfigType.ValueType # 4 """ - TELEMETRY_CONFIG: AdminMessage._ModuleConfigType.ValueType # 5 + Telemetry module configuration """ - TODO: REPLACE + CANNEDMSG_CONFIG: AdminMessage._ModuleConfigType.ValueType # 5 """ - CANNEDMSG_CONFIG: AdminMessage._ModuleConfigType.ValueType # 6 + Canned message module configuration """ - TODO: REPLACE + AUDIO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 6 """ - AUDIO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 7 + Audio module configuration """ - TODO: REPLACE + REMOTEHARDWARE_CONFIG: AdminMessage._ModuleConfigType.ValueType # 7 """ - REMOTEHARDWARE_CONFIG: AdminMessage._ModuleConfigType.ValueType # 8 + Remote hardware module configuration """ - TODO: REPLACE + NEIGHBORINFO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 8 """ - NEIGHBORINFO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 9 + Neighbor info module configuration """ - TODO: REPLACE + AMBIENTLIGHTING_CONFIG: AdminMessage._ModuleConfigType.ValueType # 9 """ - AMBIENTLIGHTING_CONFIG: AdminMessage._ModuleConfigType.ValueType # 10 + Ambient lighting module configuration """ - TODO: REPLACE + DETECTIONSENSOR_CONFIG: AdminMessage._ModuleConfigType.ValueType # 10 """ - DETECTIONSENSOR_CONFIG: AdminMessage._ModuleConfigType.ValueType # 11 + Detection sensor module configuration """ - TODO: REPLACE + PAXCOUNTER_CONFIG: AdminMessage._ModuleConfigType.ValueType # 11 """ - PAXCOUNTER_CONFIG: AdminMessage._ModuleConfigType.ValueType # 12 + Paxcounter module configuration """ - TODO: REPLACE + STATUSMESSAGE_CONFIG: AdminMessage._ModuleConfigType.ValueType # 12 """ - STATUSMESSAGE_CONFIG: AdminMessage._ModuleConfigType.ValueType # 13 + Status message module configuration """ - TODO: REPLACE - """ - TRAFFICMANAGEMENT_CONFIG: AdminMessage._ModuleConfigType.ValueType # 14 + TRAFFICMANAGEMENT_CONFIG: AdminMessage._ModuleConfigType.ValueType # 13 """ Traffic management module config """ - TAK_CONFIG: AdminMessage._ModuleConfigType.ValueType # 15 + TAK_CONFIG: AdminMessage._ModuleConfigType.ValueType # 14 """ TAK module config """ - MESHBEACON_CONFIG: AdminMessage._ModuleConfigType.ValueType # 16 + MESHBEACON_CONFIG: AdminMessage._ModuleConfigType.ValueType # 15 """ Mesh Beacon module config """ class ModuleConfigType(_ModuleConfigType, metaclass=_ModuleConfigTypeEnumTypeWrapper): """ - TODO: REPLACE + Identifies which module configuration block to get or set. Value N is the section + ModuleConfigPayload carries at tag N + 1 and LocalModuleConfig stores at field + N + 1; schema_lint's sections rule checks that the three lists agree. """ MQTT_CONFIG: AdminMessage.ModuleConfigType.ValueType # 0 """ - TODO: REPLACE + MQTT module configuration """ SERIAL_CONFIG: AdminMessage.ModuleConfigType.ValueType # 1 """ - TODO: REPLACE + Serial module configuration """ EXTNOTIF_CONFIG: AdminMessage.ModuleConfigType.ValueType # 2 """ - TODO: REPLACE + External notification module configuration """ STOREFORWARD_CONFIG: AdminMessage.ModuleConfigType.ValueType # 3 """ - TODO: REPLACE - """ - RANGETEST_CONFIG: AdminMessage.ModuleConfigType.ValueType # 4 - """ - TODO: REPLACE + Store and Forward module configuration """ - TELEMETRY_CONFIG: AdminMessage.ModuleConfigType.ValueType # 5 + TELEMETRY_CONFIG: AdminMessage.ModuleConfigType.ValueType # 4 """ - TODO: REPLACE + Telemetry module configuration """ - CANNEDMSG_CONFIG: AdminMessage.ModuleConfigType.ValueType # 6 + CANNEDMSG_CONFIG: AdminMessage.ModuleConfigType.ValueType # 5 """ - TODO: REPLACE + Canned message module configuration """ - AUDIO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 7 + AUDIO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 6 """ - TODO: REPLACE + Audio module configuration """ - REMOTEHARDWARE_CONFIG: AdminMessage.ModuleConfigType.ValueType # 8 + REMOTEHARDWARE_CONFIG: AdminMessage.ModuleConfigType.ValueType # 7 """ - TODO: REPLACE + Remote hardware module configuration """ - NEIGHBORINFO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 9 + NEIGHBORINFO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 8 """ - TODO: REPLACE + Neighbor info module configuration """ - AMBIENTLIGHTING_CONFIG: AdminMessage.ModuleConfigType.ValueType # 10 + AMBIENTLIGHTING_CONFIG: AdminMessage.ModuleConfigType.ValueType # 9 """ - TODO: REPLACE + Ambient lighting module configuration """ - DETECTIONSENSOR_CONFIG: AdminMessage.ModuleConfigType.ValueType # 11 + DETECTIONSENSOR_CONFIG: AdminMessage.ModuleConfigType.ValueType # 10 """ - TODO: REPLACE + Detection sensor module configuration """ - PAXCOUNTER_CONFIG: AdminMessage.ModuleConfigType.ValueType # 12 + PAXCOUNTER_CONFIG: AdminMessage.ModuleConfigType.ValueType # 11 """ - TODO: REPLACE + Paxcounter module configuration """ - STATUSMESSAGE_CONFIG: AdminMessage.ModuleConfigType.ValueType # 13 + STATUSMESSAGE_CONFIG: AdminMessage.ModuleConfigType.ValueType # 12 """ - TODO: REPLACE + Status message module configuration """ - TRAFFICMANAGEMENT_CONFIG: AdminMessage.ModuleConfigType.ValueType # 14 + TRAFFICMANAGEMENT_CONFIG: AdminMessage.ModuleConfigType.ValueType # 13 """ Traffic management module config """ - TAK_CONFIG: AdminMessage.ModuleConfigType.ValueType # 15 + TAK_CONFIG: AdminMessage.ModuleConfigType.ValueType # 14 """ TAK module config """ - MESHBEACON_CONFIG: AdminMessage.ModuleConfigType.ValueType # 16 + MESHBEACON_CONFIG: AdminMessage.ModuleConfigType.ValueType # 15 """ Mesh Beacon module config """ class _BackupLocation: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _BackupLocationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._BackupLocation.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _BackupLocationEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[AdminMessage._BackupLocation.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor FLASH: AdminMessage._BackupLocation.ValueType # 0 """ Backup to the internal flash @@ -340,60 +353,64 @@ class AdminMessage(google.protobuf.message.Message): Backup to the SD card """ - @typing.final - class InputEvent(google.protobuf.message.Message): + @_typing.final + class InputEvent(_message.Message): """ Input event message to be sent to the node. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - EVENT_CODE_FIELD_NUMBER: builtins.int - KB_CHAR_FIELD_NUMBER: builtins.int - TOUCH_X_FIELD_NUMBER: builtins.int - TOUCH_Y_FIELD_NUMBER: builtins.int - event_code: builtins.int + EVENT_CODE_FIELD_NUMBER: _builtins.int + KB_CHAR_FIELD_NUMBER: _builtins.int + TOUCH_X_FIELD_NUMBER: _builtins.int + TOUCH_Y_FIELD_NUMBER: _builtins.int + event_code: _common_pb2.InputBrokerEvent.ValueType """ - The input event code + Which event to inject. """ - kb_char: builtins.int + kb_char: _builtins.int """ - Keyboard character code + Keyboard character code, for an event that carries one. """ - touch_x: builtins.int + touch_x: _builtins.int """ The touch X coordinate """ - touch_y: builtins.int + touch_y: _builtins.int """ The touch Y coordinate """ def __init__( self, *, - event_code: builtins.int = ..., - kb_char: builtins.int = ..., - touch_x: builtins.int = ..., - touch_y: builtins.int = ..., + event_code: _common_pb2.InputBrokerEvent.ValueType = ..., + kb_char: _builtins.int = ..., + touch_x: _builtins.int = ..., + touch_y: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["event_code", b"event_code", "kb_char", b"kb_char", "touch_x", b"touch_x", "touch_y", b"touch_y"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["event_code", b"event_code", "kb_char", b"kb_char", "touch_x", b"touch_x", "touch_y", b"touch_y"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class OTAEvent(google.protobuf.message.Message): + @_typing.final + class OTAEvent(_message.Message): """ User is requesting an over the air update. Node will reboot into the OTA loader """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - REBOOT_OTA_MODE_FIELD_NUMBER: builtins.int - OTA_HASH_FIELD_NUMBER: builtins.int - reboot_ota_mode: global___OTAMode.ValueType + REBOOT_OTA_MODE_FIELD_NUMBER: _builtins.int + OTA_HASH_FIELD_NUMBER: _builtins.int + reboot_ota_mode: Global___OTAMode.ValueType """ Tell the node to reboot into OTA mode for firmware update via BLE or WiFi (ESP32 only for now) """ - ota_hash: builtins.bytes + ota_hash: _builtins.bytes """ A 32 byte hash of the OTA firmware. Used to verify the integrity of the firmware before applying an update. @@ -401,359 +418,356 @@ class AdminMessage(google.protobuf.message.Message): def __init__( self, *, - reboot_ota_mode: global___OTAMode.ValueType = ..., - ota_hash: builtins.bytes = ..., + reboot_ota_mode: Global___OTAMode.ValueType = ..., + ota_hash: _builtins.bytes = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["ota_hash", b"ota_hash", "reboot_ota_mode", b"reboot_ota_mode"]) -> None: ... - - SESSION_PASSKEY_FIELD_NUMBER: builtins.int - GET_CHANNEL_REQUEST_FIELD_NUMBER: builtins.int - GET_CHANNEL_RESPONSE_FIELD_NUMBER: builtins.int - GET_OWNER_REQUEST_FIELD_NUMBER: builtins.int - GET_OWNER_RESPONSE_FIELD_NUMBER: builtins.int - GET_CONFIG_REQUEST_FIELD_NUMBER: builtins.int - GET_CONFIG_RESPONSE_FIELD_NUMBER: builtins.int - GET_MODULE_CONFIG_REQUEST_FIELD_NUMBER: builtins.int - GET_MODULE_CONFIG_RESPONSE_FIELD_NUMBER: builtins.int - GET_CANNED_MESSAGE_MODULE_MESSAGES_REQUEST_FIELD_NUMBER: builtins.int - GET_CANNED_MESSAGE_MODULE_MESSAGES_RESPONSE_FIELD_NUMBER: builtins.int - GET_DEVICE_METADATA_REQUEST_FIELD_NUMBER: builtins.int - GET_DEVICE_METADATA_RESPONSE_FIELD_NUMBER: builtins.int - GET_RINGTONE_REQUEST_FIELD_NUMBER: builtins.int - GET_RINGTONE_RESPONSE_FIELD_NUMBER: builtins.int - GET_DEVICE_CONNECTION_STATUS_REQUEST_FIELD_NUMBER: builtins.int - GET_DEVICE_CONNECTION_STATUS_RESPONSE_FIELD_NUMBER: builtins.int - SET_HAM_MODE_FIELD_NUMBER: builtins.int - GET_NODE_REMOTE_HARDWARE_PINS_REQUEST_FIELD_NUMBER: builtins.int - GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: builtins.int - ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: builtins.int - DELETE_FILE_REQUEST_FIELD_NUMBER: builtins.int - SET_SCALE_FIELD_NUMBER: builtins.int - BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int - RESTORE_PREFERENCES_FIELD_NUMBER: builtins.int - REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int - SEND_INPUT_EVENT_FIELD_NUMBER: builtins.int - SET_OWNER_FIELD_NUMBER: builtins.int - SET_CHANNEL_FIELD_NUMBER: builtins.int - SET_CONFIG_FIELD_NUMBER: builtins.int - SET_MODULE_CONFIG_FIELD_NUMBER: builtins.int - SET_CANNED_MESSAGE_MODULE_MESSAGES_FIELD_NUMBER: builtins.int - SET_RINGTONE_MESSAGE_FIELD_NUMBER: builtins.int - REMOVE_BY_NODENUM_FIELD_NUMBER: builtins.int - SET_FAVORITE_NODE_FIELD_NUMBER: builtins.int - REMOVE_FAVORITE_NODE_FIELD_NUMBER: builtins.int - SET_FIXED_POSITION_FIELD_NUMBER: builtins.int - REMOVE_FIXED_POSITION_FIELD_NUMBER: builtins.int - SET_TIME_ONLY_FIELD_NUMBER: builtins.int - GET_UI_CONFIG_REQUEST_FIELD_NUMBER: builtins.int - GET_UI_CONFIG_RESPONSE_FIELD_NUMBER: builtins.int - STORE_UI_CONFIG_FIELD_NUMBER: builtins.int - SET_IGNORED_NODE_FIELD_NUMBER: builtins.int - REMOVE_IGNORED_NODE_FIELD_NUMBER: builtins.int - TOGGLE_MUTED_NODE_FIELD_NUMBER: builtins.int - BEGIN_EDIT_SETTINGS_FIELD_NUMBER: builtins.int - COMMIT_EDIT_SETTINGS_FIELD_NUMBER: builtins.int - ADD_CONTACT_FIELD_NUMBER: builtins.int - KEY_VERIFICATION_FIELD_NUMBER: builtins.int - FACTORY_RESET_DEVICE_FIELD_NUMBER: builtins.int - REBOOT_OTA_SECONDS_FIELD_NUMBER: builtins.int - EXIT_SIMULATOR_FIELD_NUMBER: builtins.int - REBOOT_SECONDS_FIELD_NUMBER: builtins.int - SHUTDOWN_SECONDS_FIELD_NUMBER: builtins.int - FACTORY_RESET_CONFIG_FIELD_NUMBER: builtins.int - NODEDB_RESET_FIELD_NUMBER: builtins.int - OTA_REQUEST_FIELD_NUMBER: builtins.int - SENSOR_CONFIG_FIELD_NUMBER: builtins.int - LOCKDOWN_AUTH_FIELD_NUMBER: builtins.int - session_passkey: builtins.bytes + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ota_hash", b"ota_hash", "reboot_ota_mode", b"reboot_ota_mode"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + + SESSION_PASSKEY_FIELD_NUMBER: _builtins.int + GET_CHANNEL_REQUEST_FIELD_NUMBER: _builtins.int + GET_CHANNEL_RESPONSE_FIELD_NUMBER: _builtins.int + GET_OWNER_REQUEST_FIELD_NUMBER: _builtins.int + GET_OWNER_RESPONSE_FIELD_NUMBER: _builtins.int + GET_CONFIG_REQUEST_FIELD_NUMBER: _builtins.int + GET_CONFIG_RESPONSE_FIELD_NUMBER: _builtins.int + GET_MODULE_CONFIG_REQUEST_FIELD_NUMBER: _builtins.int + GET_MODULE_CONFIG_RESPONSE_FIELD_NUMBER: _builtins.int + GET_CANNED_MESSAGE_MODULE_MESSAGES_REQUEST_FIELD_NUMBER: _builtins.int + GET_CANNED_MESSAGE_MODULE_MESSAGES_RESPONSE_FIELD_NUMBER: _builtins.int + GET_DEVICE_METADATA_REQUEST_FIELD_NUMBER: _builtins.int + GET_DEVICE_METADATA_RESPONSE_FIELD_NUMBER: _builtins.int + GET_RINGTONE_REQUEST_FIELD_NUMBER: _builtins.int + GET_RINGTONE_RESPONSE_FIELD_NUMBER: _builtins.int + GET_DEVICE_CONNECTION_STATUS_REQUEST_FIELD_NUMBER: _builtins.int + GET_DEVICE_CONNECTION_STATUS_RESPONSE_FIELD_NUMBER: _builtins.int + SET_HAM_MODE_FIELD_NUMBER: _builtins.int + GET_NODE_REMOTE_HARDWARE_PINS_REQUEST_FIELD_NUMBER: _builtins.int + GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: _builtins.int + ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: _builtins.int + DELETE_FILE_REQUEST_FIELD_NUMBER: _builtins.int + SET_SCALE_FIELD_NUMBER: _builtins.int + BACKUP_PREFERENCES_FIELD_NUMBER: _builtins.int + RESTORE_PREFERENCES_FIELD_NUMBER: _builtins.int + REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: _builtins.int + SEND_INPUT_EVENT_FIELD_NUMBER: _builtins.int + SET_OWNER_FIELD_NUMBER: _builtins.int + SET_CHANNEL_FIELD_NUMBER: _builtins.int + SET_CONFIG_FIELD_NUMBER: _builtins.int + SET_MODULE_CONFIG_FIELD_NUMBER: _builtins.int + SET_CANNED_MESSAGE_MODULE_MESSAGES_FIELD_NUMBER: _builtins.int + SET_RINGTONE_MESSAGE_FIELD_NUMBER: _builtins.int + REMOVE_BY_NODENUM_FIELD_NUMBER: _builtins.int + SET_FAVORITE_NODE_FIELD_NUMBER: _builtins.int + REMOVE_FAVORITE_NODE_FIELD_NUMBER: _builtins.int + SET_FIXED_POSITION_FIELD_NUMBER: _builtins.int + REMOVE_FIXED_POSITION_FIELD_NUMBER: _builtins.int + SET_TIME_ONLY_FIELD_NUMBER: _builtins.int + GET_UI_CONFIG_REQUEST_FIELD_NUMBER: _builtins.int + GET_UI_CONFIG_RESPONSE_FIELD_NUMBER: _builtins.int + STORE_UI_CONFIG_FIELD_NUMBER: _builtins.int + SET_IGNORED_NODE_FIELD_NUMBER: _builtins.int + REMOVE_IGNORED_NODE_FIELD_NUMBER: _builtins.int + TOGGLE_MUTED_NODE_FIELD_NUMBER: _builtins.int + BEGIN_EDIT_SETTINGS_FIELD_NUMBER: _builtins.int + COMMIT_EDIT_SETTINGS_FIELD_NUMBER: _builtins.int + ADD_CONTACT_FIELD_NUMBER: _builtins.int + KEY_VERIFICATION_FIELD_NUMBER: _builtins.int + FACTORY_RESET_DEVICE_FIELD_NUMBER: _builtins.int + EXIT_SIMULATOR_FIELD_NUMBER: _builtins.int + REBOOT_SECONDS_FIELD_NUMBER: _builtins.int + SHUTDOWN_SECONDS_FIELD_NUMBER: _builtins.int + FACTORY_RESET_CONFIG_FIELD_NUMBER: _builtins.int + NODEDB_RESET_FIELD_NUMBER: _builtins.int + OTA_REQUEST_FIELD_NUMBER: _builtins.int + SENSOR_CONFIG_FIELD_NUMBER: _builtins.int + LOCKDOWN_AUTH_FIELD_NUMBER: _builtins.int + session_passkey: _builtins.bytes """ The node generates this key and sends it with any get_x_response packets. The client MUST include the same key with any set_x commands. Key expires after 300 seconds. Prevents replay attacks for admin messages. """ - get_channel_request: builtins.int + get_channel_request: _builtins.int """ - Send the specified channel in the response to this message - NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) + Send the channel at this index in the response to this message. 0-based, as + Channel.index is: a oneof arm is present even when its value is zero, so + nothing has to be added to it. """ - get_owner_request: builtins.bool + get_owner_request: _builtins.bool """ Send the current owner data in the response to this message. """ - get_config_request: global___AdminMessage.ConfigType.ValueType + get_config_request: Global___AdminMessage.ConfigType.ValueType """ Ask for the following config data to be sent """ - get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType + get_module_config_request: Global___AdminMessage.ModuleConfigType.ValueType """ Ask for the following config data to be sent """ - get_canned_message_module_messages_request: builtins.bool + get_canned_message_module_messages_request: _builtins.bool """ Get the Canned Message Module messages in the response to this message. """ - get_canned_message_module_messages_response: builtins.str + get_canned_message_module_messages_response: _builtins.str """ Get the Canned Message Module messages in the response to this message. """ - get_device_metadata_request: builtins.bool + get_device_metadata_request: _builtins.bool """ Request the node to send device metadata (firmware, protobuf version, etc) """ - get_ringtone_request: builtins.bool + get_ringtone_request: _builtins.bool """ Get the Ringtone in the response to this message. """ - get_ringtone_response: builtins.str + get_ringtone_response: _builtins.str """ Get the Ringtone in the response to this message. """ - get_device_connection_status_request: builtins.bool + get_device_connection_status_request: _builtins.bool """ Request the node to send it's connection status """ - get_node_remote_hardware_pins_request: builtins.bool + get_node_remote_hardware_pins_request: _builtins.bool """ Get the mesh's nodes with their available gpio pins for RemoteHardware module use """ - enter_dfu_mode_request: builtins.bool + enter_dfu_mode_request: _builtins.bool """ Enter (UF2) DFU mode Only implemented on NRF52 currently """ - delete_file_request: builtins.str + delete_file_request: _builtins.str """ Delete the file by the specified path from the device """ - set_scale: builtins.int + set_scale: _builtins.int """ Set zero and offset for scale chips """ - backup_preferences: global___AdminMessage.BackupLocation.ValueType + backup_preferences: Global___AdminMessage.BackupLocation.ValueType """ Backup the node's preferences """ - restore_preferences: global___AdminMessage.BackupLocation.ValueType + restore_preferences: Global___AdminMessage.BackupLocation.ValueType """ Restore the node's preferences """ - remove_backup_preferences: global___AdminMessage.BackupLocation.ValueType + remove_backup_preferences: Global___AdminMessage.BackupLocation.ValueType """ Remove backups of the node's preferences """ - set_canned_message_module_messages: builtins.str + set_canned_message_module_messages: _builtins.str """ Set the Canned Message Module messages text. """ - set_ringtone_message: builtins.str + set_ringtone_message: _builtins.str """ Set the ringtone for ExternalNotification. """ - remove_by_nodenum: builtins.int + remove_by_nodenum: _builtins.int """ Remove the node by the specified node-num from the NodeDB on the device """ - set_favorite_node: builtins.int + set_favorite_node: _builtins.int """ Set specified node-num to be favorited on the NodeDB on the device """ - remove_favorite_node: builtins.int + remove_favorite_node: _builtins.int """ Set specified node-num to be un-favorited on the NodeDB on the device """ - remove_fixed_position: builtins.bool + remove_fixed_position: _builtins.bool """ Clear fixed position coordinates and then set position.fixed_position = false """ - set_time_only: builtins.int + set_time_only: _builtins.int """ Set time only on the node Convenience method to set the time on the node (as Net quality) without any other position data """ - get_ui_config_request: builtins.bool + get_ui_config_request: _builtins.bool """ Tell the node to send the stored ui data. """ - set_ignored_node: builtins.int + set_ignored_node: _builtins.int """ Set specified node-num to be ignored on the NodeDB on the device """ - remove_ignored_node: builtins.int + remove_ignored_node: _builtins.int """ Set specified node-num to be un-ignored on the NodeDB on the device """ - toggle_muted_node: builtins.int + toggle_muted_node: _builtins.int """ Set specified node-num to be muted """ - begin_edit_settings: builtins.bool + begin_edit_settings: _builtins.bool """ Begins an edit transaction for config, module config, owner, and channel settings changes This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) """ - commit_edit_settings: builtins.bool + commit_edit_settings: _builtins.bool """ Commits an open transaction for any edits made to config, module config, owner, and channel settings """ - factory_reset_device: builtins.int + factory_reset_device: _builtins.int """ Tell the node to factory reset config everything; all device state and configuration will be returned to factory defaults and BLE bonds will be cleared. """ - reboot_ota_seconds: builtins.int - """ - Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot) - Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth. - Deprecated in favor of reboot_ota_mode in 2.7.17 - """ - exit_simulator: builtins.bool + exit_simulator: _builtins.bool """ This message is only supported for the simulator Portduino build. If received the simulator will exit successfully. """ - reboot_seconds: builtins.int + reboot_seconds: _builtins.int """ Tell the node to reboot in this many seconds (or <0 to cancel reboot) """ - shutdown_seconds: builtins.int + shutdown_seconds: _builtins.int """ Tell the node to shutdown in this many seconds (or <0 to cancel shutdown) """ - factory_reset_config: builtins.int + factory_reset_config: _builtins.int """ Tell the node to factory reset config; all device state and configuration will be returned to factory defaults; BLE bonds will be preserved. """ - nodedb_reset: builtins.bool + nodedb_reset: _builtins.bool """ Tell the node to reset the nodedb. When true, favorites are preserved through reset. """ - @property - def get_channel_response(self) -> meshtastic.protobuf.channel_pb2.Channel: + @_builtins.property + def get_channel_response(self) -> _channel_pb2.Channel: """ - TODO: REPLACE + Return the current channel data for the requested index """ - @property - def get_owner_response(self) -> meshtastic.protobuf.mesh_pb2.User: + @_builtins.property + def get_owner_response(self) -> _wire_pb2.User: """ - TODO: REPLACE + Return the current owner (User) data for this node """ - @property - def get_config_response(self) -> meshtastic.protobuf.config_pb2.Config: + @_builtins.property + def get_config_response(self) -> _config_pb2.ConfigPayload: """ Send the current Config in the response to this message. """ - @property - def get_module_config_response(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig: + @_builtins.property + def get_module_config_response(self) -> _module_config_pb2.ModuleConfigPayload: """ Send the current Config in the response to this message. """ - @property - def get_device_metadata_response(self) -> meshtastic.protobuf.mesh_pb2.DeviceMetadata: + @_builtins.property + def get_device_metadata_response(self) -> _common_pb2.DeviceMetadata: """ Device metadata response """ - @property - def get_device_connection_status_response(self) -> meshtastic.protobuf.connection_status_pb2.DeviceConnectionStatus: + @_builtins.property + def get_device_connection_status_response(self) -> _connection_status_pb2.DeviceConnectionStatus: """ Device connection status response """ - @property - def set_ham_mode(self) -> global___HamParameters: + @_builtins.property + def set_ham_mode(self) -> Global___HamParameters: """ Setup a node for licensed amateur (ham) radio operation """ - @property - def get_node_remote_hardware_pins_response(self) -> global___NodeRemoteHardwarePinsResponse: + @_builtins.property + def get_node_remote_hardware_pins_response(self) -> Global___NodeRemoteHardwarePinsResponse: """ Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use """ - @property - def send_input_event(self) -> global___AdminMessage.InputEvent: + @_builtins.property + def send_input_event(self) -> Global___AdminMessage.InputEvent: """ Send an input event to the node. This is used to trigger physical input events like button presses, touch events, etc. """ - @property - def set_owner(self) -> meshtastic.protobuf.mesh_pb2.User: + @_builtins.property + def set_owner(self) -> _wire_pb2.User: """ - Set the owner for this node + Set the owner for this node. public_key is ignored: the node's key is set + through SecurityConfig. """ - @property - def set_channel(self) -> meshtastic.protobuf.channel_pb2.Channel: + @_builtins.property + def set_channel(self) -> _channel_pb2.Channel: """ - Set channels (using the new API). - A special channel is the "primary channel". - The other records are secondary channels. - Note: only one channel can be marked as primary. - If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically. + Set one channel in the table, addressed by its index. + Index 0 is the primary channel. + Sending a Channel with no settings disables that index. """ - @property - def set_config(self) -> meshtastic.protobuf.config_pb2.Config: + @_builtins.property + def set_config(self) -> _config_pb2.ConfigPayload: """ Set the current Config """ - @property - def set_module_config(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig: + @_builtins.property + def set_module_config(self) -> _module_config_pb2.ModuleConfigPayload: """ Set the current Config """ - @property - def set_fixed_position(self) -> meshtastic.protobuf.mesh_pb2.Position: + @_builtins.property + def set_fixed_position(self) -> _wire_pb2.Position: """ Set fixed position data on the node and then set the position.fixed_position = true """ - @property - def get_ui_config_response(self) -> meshtastic.protobuf.device_ui_pb2.DeviceUIConfig: + @_builtins.property + def get_ui_config_response(self) -> _device_ui_pb2.DeviceUIConfig: """ Reply stored device ui data. """ - @property - def store_ui_config(self) -> meshtastic.protobuf.device_ui_pb2.DeviceUIConfig: + @_builtins.property + def store_ui_config(self) -> _device_ui_pb2.DeviceUIConfig: """ Tell the node to store UI data persistently. """ - @property - def add_contact(self) -> global___SharedContact: + @_builtins.property + def add_contact(self) -> Global___SharedContact: """ Add a contact (User) to the nodedb """ - @property - def key_verification(self) -> global___KeyVerificationAdmin: + @_builtins.property + def key_verification(self) -> Global___KeyVerificationAdmin: """ Initiate or respond to a key verification request """ - @property - def ota_request(self) -> global___AdminMessage.OTAEvent: + @_builtins.property + def ota_request(self) -> Global___AdminMessage.OTAEvent: """ Tell the node to reset into the OTA Loader """ - @property - def sensor_config(self) -> global___SensorConfig: + @_builtins.property + def sensor_config(self) -> Global___SensorConfig: """ Parameters and sensor configuration """ - @property - def lockdown_auth(self) -> global___LockdownAuth: + @_builtins.property + def lockdown_auth(self) -> Global___LockdownAuth: """ Lockdown passphrase delivery / unlock / lock-now command for hardened firmware builds (see MESHTASTIC_LOCKDOWN). Used to provision the @@ -768,74 +782,77 @@ class AdminMessage(google.protobuf.message.Message): def __init__( self, *, - session_passkey: builtins.bytes = ..., - get_channel_request: builtins.int = ..., - get_channel_response: meshtastic.protobuf.channel_pb2.Channel | None = ..., - get_owner_request: builtins.bool = ..., - get_owner_response: meshtastic.protobuf.mesh_pb2.User | None = ..., - get_config_request: global___AdminMessage.ConfigType.ValueType = ..., - get_config_response: meshtastic.protobuf.config_pb2.Config | None = ..., - get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType = ..., - get_module_config_response: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ..., - get_canned_message_module_messages_request: builtins.bool = ..., - get_canned_message_module_messages_response: builtins.str = ..., - get_device_metadata_request: builtins.bool = ..., - get_device_metadata_response: meshtastic.protobuf.mesh_pb2.DeviceMetadata | None = ..., - get_ringtone_request: builtins.bool = ..., - get_ringtone_response: builtins.str = ..., - get_device_connection_status_request: builtins.bool = ..., - get_device_connection_status_response: meshtastic.protobuf.connection_status_pb2.DeviceConnectionStatus | None = ..., - set_ham_mode: global___HamParameters | None = ..., - get_node_remote_hardware_pins_request: builtins.bool = ..., - get_node_remote_hardware_pins_response: global___NodeRemoteHardwarePinsResponse | None = ..., - enter_dfu_mode_request: builtins.bool = ..., - delete_file_request: builtins.str = ..., - set_scale: builtins.int = ..., - backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., - restore_preferences: global___AdminMessage.BackupLocation.ValueType = ..., - remove_backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., - send_input_event: global___AdminMessage.InputEvent | None = ..., - set_owner: meshtastic.protobuf.mesh_pb2.User | None = ..., - set_channel: meshtastic.protobuf.channel_pb2.Channel | None = ..., - set_config: meshtastic.protobuf.config_pb2.Config | None = ..., - set_module_config: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ..., - set_canned_message_module_messages: builtins.str = ..., - set_ringtone_message: builtins.str = ..., - remove_by_nodenum: builtins.int = ..., - set_favorite_node: builtins.int = ..., - remove_favorite_node: builtins.int = ..., - set_fixed_position: meshtastic.protobuf.mesh_pb2.Position | None = ..., - remove_fixed_position: builtins.bool = ..., - set_time_only: builtins.int = ..., - get_ui_config_request: builtins.bool = ..., - get_ui_config_response: meshtastic.protobuf.device_ui_pb2.DeviceUIConfig | None = ..., - store_ui_config: meshtastic.protobuf.device_ui_pb2.DeviceUIConfig | None = ..., - set_ignored_node: builtins.int = ..., - remove_ignored_node: builtins.int = ..., - toggle_muted_node: builtins.int = ..., - begin_edit_settings: builtins.bool = ..., - commit_edit_settings: builtins.bool = ..., - add_contact: global___SharedContact | None = ..., - key_verification: global___KeyVerificationAdmin | None = ..., - factory_reset_device: builtins.int = ..., - reboot_ota_seconds: builtins.int = ..., - exit_simulator: builtins.bool = ..., - reboot_seconds: builtins.int = ..., - shutdown_seconds: builtins.int = ..., - factory_reset_config: builtins.int = ..., - nodedb_reset: builtins.bool = ..., - ota_request: global___AdminMessage.OTAEvent | None = ..., - sensor_config: global___SensorConfig | None = ..., - lockdown_auth: global___LockdownAuth | None = ..., + session_passkey: _builtins.bytes = ..., + get_channel_request: _builtins.int = ..., + get_channel_response: _channel_pb2.Channel | None = ..., + get_owner_request: _builtins.bool = ..., + get_owner_response: _wire_pb2.User | None = ..., + get_config_request: Global___AdminMessage.ConfigType.ValueType = ..., + get_config_response: _config_pb2.ConfigPayload | None = ..., + get_module_config_request: Global___AdminMessage.ModuleConfigType.ValueType = ..., + get_module_config_response: _module_config_pb2.ModuleConfigPayload | None = ..., + get_canned_message_module_messages_request: _builtins.bool = ..., + get_canned_message_module_messages_response: _builtins.str = ..., + get_device_metadata_request: _builtins.bool = ..., + get_device_metadata_response: _common_pb2.DeviceMetadata | None = ..., + get_ringtone_request: _builtins.bool = ..., + get_ringtone_response: _builtins.str = ..., + get_device_connection_status_request: _builtins.bool = ..., + get_device_connection_status_response: _connection_status_pb2.DeviceConnectionStatus | None = ..., + set_ham_mode: Global___HamParameters | None = ..., + get_node_remote_hardware_pins_request: _builtins.bool = ..., + get_node_remote_hardware_pins_response: Global___NodeRemoteHardwarePinsResponse | None = ..., + enter_dfu_mode_request: _builtins.bool = ..., + delete_file_request: _builtins.str = ..., + set_scale: _builtins.int = ..., + backup_preferences: Global___AdminMessage.BackupLocation.ValueType = ..., + restore_preferences: Global___AdminMessage.BackupLocation.ValueType = ..., + remove_backup_preferences: Global___AdminMessage.BackupLocation.ValueType = ..., + send_input_event: Global___AdminMessage.InputEvent | None = ..., + set_owner: _wire_pb2.User | None = ..., + set_channel: _channel_pb2.Channel | None = ..., + set_config: _config_pb2.ConfigPayload | None = ..., + set_module_config: _module_config_pb2.ModuleConfigPayload | None = ..., + set_canned_message_module_messages: _builtins.str = ..., + set_ringtone_message: _builtins.str = ..., + remove_by_nodenum: _builtins.int = ..., + set_favorite_node: _builtins.int = ..., + remove_favorite_node: _builtins.int = ..., + set_fixed_position: _wire_pb2.Position | None = ..., + remove_fixed_position: _builtins.bool = ..., + set_time_only: _builtins.int = ..., + get_ui_config_request: _builtins.bool = ..., + get_ui_config_response: _device_ui_pb2.DeviceUIConfig | None = ..., + store_ui_config: _device_ui_pb2.DeviceUIConfig | None = ..., + set_ignored_node: _builtins.int = ..., + remove_ignored_node: _builtins.int = ..., + toggle_muted_node: _builtins.int = ..., + begin_edit_settings: _builtins.bool = ..., + commit_edit_settings: _builtins.bool = ..., + add_contact: Global___SharedContact | None = ..., + key_verification: Global___KeyVerificationAdmin | None = ..., + factory_reset_device: _builtins.int = ..., + exit_simulator: _builtins.bool = ..., + reboot_seconds: _builtins.int = ..., + shutdown_seconds: _builtins.int = ..., + factory_reset_config: _builtins.int = ..., + nodedb_reset: _builtins.bool = ..., + ota_request: Global___AdminMessage.OTAEvent | None = ..., + sensor_config: Global___SensorConfig | None = ..., + lockdown_auth: Global___LockdownAuth | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "lockdown_auth", b"lockdown_auth", "nodedb_reset", b"nodedb_reset", "ota_request", b"ota_request", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "sensor_config", b"sensor_config", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config", "toggle_muted_node", b"toggle_muted_node"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "lockdown_auth", b"lockdown_auth", "nodedb_reset", b"nodedb_reset", "ota_request", b"ota_request", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "sensor_config", b"sensor_config", "session_passkey", b"session_passkey", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config", "toggle_muted_node", b"toggle_muted_node"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["get_channel_request", "get_channel_response", "get_owner_request", "get_owner_response", "get_config_request", "get_config_response", "get_module_config_request", "get_module_config_response", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_device_metadata_request", "get_device_metadata_response", "get_ringtone_request", "get_ringtone_response", "get_device_connection_status_request", "get_device_connection_status_response", "set_ham_mode", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "enter_dfu_mode_request", "delete_file_request", "set_scale", "backup_preferences", "restore_preferences", "remove_backup_preferences", "send_input_event", "set_owner", "set_channel", "set_config", "set_module_config", "set_canned_message_module_messages", "set_ringtone_message", "remove_by_nodenum", "set_favorite_node", "remove_favorite_node", "set_fixed_position", "remove_fixed_position", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "toggle_muted_node", "begin_edit_settings", "commit_edit_settings", "add_contact", "key_verification", "factory_reset_device", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset", "ota_request", "sensor_config", "lockdown_auth"] | None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "lockdown_auth", b"lockdown_auth", "nodedb_reset", b"nodedb_reset", "ota_request", b"ota_request", "payload_variant", b"payload_variant", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "sensor_config", b"sensor_config", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config", "toggle_muted_node", b"toggle_muted_node"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "lockdown_auth", b"lockdown_auth", "nodedb_reset", b"nodedb_reset", "ota_request", b"ota_request", "payload_variant", b"payload_variant", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "sensor_config", b"sensor_config", "session_passkey", b"session_passkey", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config", "toggle_muted_node", b"toggle_muted_node"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["get_channel_request", "get_channel_response", "get_owner_request", "get_owner_response", "get_config_request", "get_config_response", "get_module_config_request", "get_module_config_response", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_device_metadata_request", "get_device_metadata_response", "get_ringtone_request", "get_ringtone_response", "get_device_connection_status_request", "get_device_connection_status_response", "set_ham_mode", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "enter_dfu_mode_request", "delete_file_request", "set_scale", "backup_preferences", "restore_preferences", "remove_backup_preferences", "send_input_event", "set_owner", "set_channel", "set_config", "set_module_config", "set_canned_message_module_messages", "set_ringtone_message", "remove_by_nodenum", "set_favorite_node", "remove_favorite_node", "set_fixed_position", "remove_fixed_position", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "toggle_muted_node", "begin_edit_settings", "commit_edit_settings", "add_contact", "key_verification", "factory_reset_device", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset", "ota_request", "sensor_config", "lockdown_auth"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... -global___AdminMessage = AdminMessage +Global___AdminMessage: _TypeAlias = AdminMessage # noqa: Y015 -@typing.final -class LockdownAuth(google.protobuf.message.Message): +@_typing.final +class LockdownAuth(_message.Message): """ Lockdown passphrase delivery payload. @@ -853,40 +870,40 @@ class LockdownAuth(google.protobuf.message.Message): which case applies. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - PASSPHRASE_FIELD_NUMBER: builtins.int - 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_FIELD_NUMBER: _builtins.int + 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. Capped to 32 to match the proto cap on related security fields. """ - boots_remaining: builtins.int + boots_remaining: _builtins.int """ Optional override of the boot-count token TTL granted on success. 0 = use firmware default (TOKEN_DEFAULT_BOOTS). On reboot the firmware decrements this; when it reaches 0 the device boots fully locked and requires a fresh passphrase. """ - valid_until_epoch: builtins.int + valid_until_epoch: _builtins.int """ Optional wall-clock expiry for the unlock token, as absolute Unix-epoch seconds. 0 = no time limit (only the boot-count TTL applies). On boot, if the device RTC is set and now > this value, the token is treated as expired. """ - lock_now: builtins.bool + lock_now: _builtins.bool """ If true, ignore passphrase fields, immediately revoke all connection-level admin authorization, and reboot the device into the locked state. Always honoured regardless of current lock state. """ - max_session_seconds: builtins.int + max_session_seconds: _builtins.int """ Optional per-boot uptime cap on the unlocked session, in seconds. 0 = unlimited (token-only enforcement, suitable for unattended @@ -923,7 +940,7 @@ class LockdownAuth(google.protobuf.message.Message): way to reset the session clock is a reboot, which costs a boot from the on-flash, HMAC-bound counter. """ - disable: builtins.bool + disable: _builtins.bool """ Disable lockdown mode. Requires a valid passphrase in the same message (the device must prove the operator owns it before @@ -950,49 +967,51 @@ class LockdownAuth(google.protobuf.message.Message): def __init__( self, *, - passphrase: builtins.bytes = ..., - boots_remaining: builtins.int = ..., - valid_until_epoch: builtins.int = ..., - lock_now: builtins.bool = ..., - max_session_seconds: builtins.int = ..., - disable: builtins.bool = ..., + passphrase: _builtins.bytes = ..., + 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", "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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___LockdownAuth = LockdownAuth +Global___LockdownAuth: _TypeAlias = LockdownAuth # noqa: Y015 -@typing.final -class HamParameters(google.protobuf.message.Message): +@_typing.final +class HamParameters(_message.Message): """ Parameters for setting up Meshtastic for ameteur radio usage """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - CALL_SIGN_FIELD_NUMBER: builtins.int - TX_POWER_FIELD_NUMBER: builtins.int - FREQUENCY_FIELD_NUMBER: builtins.int - SHORT_NAME_FIELD_NUMBER: builtins.int - LONG_NAME_FIELD_NUMBER: builtins.int - call_sign: builtins.str + CALL_SIGN_FIELD_NUMBER: _builtins.int + 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 """ - tx_power: builtins.int + tx_power: _builtins.int """ Transmit power in dBm at the LoRA transceiver, not including any amplification """ - frequency: builtins.float + frequency: _builtins.int """ - The selected frequency of LoRA operation - Please respect your local laws, regulations, and band plans. - Ensure your radio is capable of operating of the selected frequency before setting this. + Frequency in Hz """ - short_name: builtins.str + short_name: _builtins.str """ Optional short name of user """ - long_name: builtins.str + long_name: _builtins.str """ Optional long name of user Appended to callsign @@ -1000,27 +1019,31 @@ class HamParameters(google.protobuf.message.Message): def __init__( self, *, - call_sign: builtins.str = ..., - tx_power: builtins.int = ..., - frequency: builtins.float = ..., - short_name: builtins.str = ..., - long_name: builtins.str = ..., + call_sign: _builtins.str = ..., + tx_power: _builtins.int = ..., + frequency: _builtins.int = ..., + short_name: _builtins.str = ..., + long_name: _builtins.str = ..., ) -> 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___HamParameters = HamParameters +Global___HamParameters: _TypeAlias = HamParameters # noqa: Y015 -@typing.final -class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message): +@_typing.final +class NodeRemoteHardwarePinsResponse(_message.Message): """ Response envelope for node_remote_hardware_pins """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int - @property - def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin]: + NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _builtins.int + @_builtins.property + def node_remote_hardware_pins(self) -> _containers.RepeatedCompositeFieldContainer[_module_config_pb2.NodeRemoteHardwarePin]: """ Nodes and their respective remote hardware GPIO pins """ @@ -1028,34 +1051,40 @@ class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message): def __init__( self, *, - node_remote_hardware_pins: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin] | None = ..., + node_remote_hardware_pins: _abc.Iterable[_module_config_pb2.NodeRemoteHardwarePin] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___NodeRemoteHardwarePinsResponse = NodeRemoteHardwarePinsResponse +Global___NodeRemoteHardwarePinsResponse: _TypeAlias = NodeRemoteHardwarePinsResponse # noqa: Y015 -@typing.final -class SharedContact(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class SharedContact(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - NODE_NUM_FIELD_NUMBER: builtins.int - USER_FIELD_NUMBER: builtins.int - SHOULD_IGNORE_FIELD_NUMBER: builtins.int - MANUALLY_VERIFIED_FIELD_NUMBER: builtins.int - node_num: builtins.int + NODE_NUM_FIELD_NUMBER: _builtins.int + USER_FIELD_NUMBER: _builtins.int + SHOULD_IGNORE_FIELD_NUMBER: _builtins.int + MANUALLY_VERIFIED_FIELD_NUMBER: _builtins.int + node_num: _builtins.int """ - The node number of the contact + The node number of the contact. fixed32 for the reason every NodeNum on the air + is: a NodeNum is uniformly distributed over 32 bits, so a varint costs five + bytes 15 times in 16. """ - should_ignore: builtins.bool + should_ignore: _builtins.bool """ Add this contact to the blocked / ignored list """ - manually_verified: builtins.bool + manually_verified: _builtins.bool """ Set the IS_KEY_MANUALLY_VERIFIED bit """ - @property - def user(self) -> meshtastic.protobuf.mesh_pb2.User: + @_builtins.property + def user(self) -> _wire_pb2.User: """ The User of the contact """ @@ -1063,30 +1092,33 @@ class SharedContact(google.protobuf.message.Message): def __init__( self, *, - node_num: builtins.int = ..., - user: meshtastic.protobuf.mesh_pb2.User | None = ..., - should_ignore: builtins.bool = ..., - manually_verified: builtins.bool = ..., + node_num: _builtins.int = ..., + user: _wire_pb2.User | None = ..., + should_ignore: _builtins.bool = ..., + manually_verified: _builtins.bool = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["user", b"user"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["manually_verified", b"manually_verified", "node_num", b"node_num", "should_ignore", b"should_ignore", "user", b"user"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["user", b"user"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["manually_verified", b"manually_verified", "node_num", b"node_num", "should_ignore", b"should_ignore", "user", b"user"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___SharedContact = SharedContact +Global___SharedContact: _TypeAlias = SharedContact # noqa: Y015 -@typing.final -class KeyVerificationAdmin(google.protobuf.message.Message): +@_typing.final +class KeyVerificationAdmin(_message.Message): """ This message is used by a client to initiate or complete a key verification """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _MessageType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _MessageTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[KeyVerificationAdmin._MessageType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _MessageTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[KeyVerificationAdmin._MessageType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor INITIATE_VERIFICATION: KeyVerificationAdmin._MessageType.ValueType # 0 """ This is the first stage, where a client initiates @@ -1128,86 +1160,90 @@ class KeyVerificationAdmin(google.protobuf.message.Message): This is the cancel path, can be taken at any point """ - MESSAGE_TYPE_FIELD_NUMBER: builtins.int - REMOTE_NODENUM_FIELD_NUMBER: builtins.int - NONCE_FIELD_NUMBER: builtins.int - SECURITY_NUMBER_FIELD_NUMBER: builtins.int - message_type: global___KeyVerificationAdmin.MessageType.ValueType - remote_nodenum: builtins.int + MESSAGE_TYPE_FIELD_NUMBER: _builtins.int + REMOTE_NODENUM_FIELD_NUMBER: _builtins.int + NONCE_FIELD_NUMBER: _builtins.int + SECURITY_NUMBER_FIELD_NUMBER: _builtins.int + message_type: Global___KeyVerificationAdmin.MessageType.ValueType + remote_nodenum: _builtins.int """ The nodenum we're requesting """ - nonce: builtins.int + nonce: _builtins.int """ The nonce is used to track the connection """ - security_number: builtins.int + security_number: _builtins.int """ The 4 digit code generated by the remote node, and communicated outside the mesh """ def __init__( self, *, - message_type: global___KeyVerificationAdmin.MessageType.ValueType = ..., - remote_nodenum: builtins.int = ..., - nonce: builtins.int = ..., - security_number: builtins.int | None = ..., + message_type: Global___KeyVerificationAdmin.MessageType.ValueType = ..., + remote_nodenum: _builtins.int = ..., + nonce: _builtins.int = ..., + security_number: _builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_security_number", b"_security_number", "security_number", b"security_number"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_security_number", b"_security_number", "message_type", b"message_type", "nonce", b"nonce", "remote_nodenum", b"remote_nodenum", "security_number", b"security_number"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_security_number", b"_security_number"]) -> typing.Literal["security_number"] | None: ... - -global___KeyVerificationAdmin = KeyVerificationAdmin - -@typing.final -class SensorConfig(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SCD4X_CONFIG_FIELD_NUMBER: builtins.int - 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: + _HasFieldArgType: _TypeAlias = _typing.Literal["_security_number", b"_security_number", "security_number", b"security_number"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_security_number", b"_security_number", "message_type", b"message_type", "nonce", b"nonce", "remote_nodenum", b"remote_nodenum", "security_number", b"security_number"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__security_number: _TypeAlias = _typing.Literal["security_number"] # noqa: Y015 + _WhichOneofArgType__security_number: _TypeAlias = _typing.Literal["_security_number", b"_security_number"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__security_number) -> _WhichOneofReturnType__security_number | None: ... + +Global___KeyVerificationAdmin: _TypeAlias = KeyVerificationAdmin # noqa: Y015 + +@_typing.final +class SensorConfig(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + SCD4X_CONFIG_FIELD_NUMBER: _builtins.int + 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 + @_builtins.property + def scd4x_config(self) -> Global___SCD4X_config: """ SCD4X CO2 Sensor configuration """ - @property - def sen5x_config(self) -> global___SEN5X_config: + @_builtins.property + def sen5x_config(self) -> Global___SEN5X_config: """ SEN5X PM Sensor configuration """ - @property - def scd30_config(self) -> global___SCD30_config: + @_builtins.property + def scd30_config(self) -> Global___SCD30_config: """ SCD30 CO2 Sensor configuration """ - @property - def shtxx_config(self) -> global___SHTXX_config: + @_builtins.property + def shtxx_config(self) -> Global___SHTXX_config: """ SHTXX temperature and relative humidity sensor configuration """ - @property - def ds248x_config(self) -> global___DS248X_config: + @_builtins.property + def ds248x_config(self) -> Global___DS248X_config: """ DS248X-800 temperature sensor configuration """ - @property - def sen6x_config(self) -> global___SEN6X_config: + @_builtins.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: + @_builtins.property + def as3935_config(self) -> Global___AS3935_config: """ AS3935 lightning sensor configuration """ @@ -1215,309 +1251,376 @@ class SensorConfig(google.protobuf.message.Message): def __init__( self, *, - scd4x_config: global___SCD4X_config | None = ..., - 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 = ..., + scd4x_config: Global___SCD4X_config | None = ..., + 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["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 - -@typing.final -class SCD4X_config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SET_ASC_FIELD_NUMBER: builtins.int - SET_TARGET_CO2_CONC_FIELD_NUMBER: builtins.int - SET_TEMPERATURE_FIELD_NUMBER: builtins.int - SET_ALTITUDE_FIELD_NUMBER: builtins.int - SET_AMBIENT_PRESSURE_FIELD_NUMBER: builtins.int - FACTORY_RESET_FIELD_NUMBER: builtins.int - SET_POWER_MODE_FIELD_NUMBER: builtins.int - set_asc: builtins.bool + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SensorConfig: _TypeAlias = SensorConfig # noqa: Y015 + +@_typing.final +class SCD4X_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + SET_ASC_FIELD_NUMBER: _builtins.int + SET_TARGET_CO2_CONC_FIELD_NUMBER: _builtins.int + SET_TEMPERATURE_FIELD_NUMBER: _builtins.int + SET_ALTITUDE_FIELD_NUMBER: _builtins.int + SET_AMBIENT_PRESSURE_FIELD_NUMBER: _builtins.int + FACTORY_RESET_FIELD_NUMBER: _builtins.int + SET_POWER_MODE_FIELD_NUMBER: _builtins.int + set_asc: _builtins.bool """ Set Automatic self-calibration enabled """ - set_target_co2_conc: builtins.int + set_target_co2_conc: _builtins.int """ Recalibration target CO2 concentration in ppm (FRC or ASC) """ - set_temperature: builtins.float + set_temperature: _builtins.int """ - Reference temperature in degC + Reference temperature in centi-degrees Celsius """ - set_altitude: builtins.int + set_altitude: _builtins.int """ Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) """ - set_ambient_pressure: builtins.int + set_ambient_pressure: _builtins.int """ Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude) """ - factory_reset: builtins.bool + factory_reset: _builtins.bool """ Perform a factory reset of the sensor """ - set_power_mode: builtins.bool + set_power_mode: _builtins.bool """ Power mode for sensor (true for low power, false for normal) """ def __init__( self, *, - set_asc: builtins.bool | None = ..., - set_target_co2_conc: builtins.int | None = ..., - set_temperature: builtins.float | None = ..., - set_altitude: builtins.int | None = ..., - set_ambient_pressure: builtins.int | None = ..., - factory_reset: builtins.bool | None = ..., - set_power_mode: builtins.bool | None = ..., + set_asc: _builtins.bool | None = ..., + set_target_co2_conc: _builtins.int | None = ..., + set_temperature: _builtins.int | None = ..., + set_altitude: _builtins.int | None = ..., + set_ambient_pressure: _builtins.int | None = ..., + factory_reset: _builtins.bool | None = ..., + set_power_mode: _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_power_mode", b"_set_power_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_power_mode", b"set_power_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature"]) -> 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_power_mode", b"_set_power_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_power_mode", b"set_power_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature"]) -> 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_power_mode", b"_set_power_mode"]) -> typing.Literal["set_power_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: ... - -global___SCD4X_config = SCD4X_config - -@typing.final -class SEN5X_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_temperature: builtins.float - """ - Reference temperature in degC - """ - set_one_shot_mode: builtins.bool + _HasFieldArgType: _TypeAlias = _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_power_mode", b"_set_power_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_power_mode", b"set_power_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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_power_mode", b"_set_power_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_power_mode", b"set_power_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__factory_reset: _TypeAlias = _typing.Literal["factory_reset"] # noqa: Y015 + _WhichOneofArgType__factory_reset: _TypeAlias = _typing.Literal["_factory_reset", b"_factory_reset"] # noqa: Y015 + _WhichOneofReturnType__set_altitude: _TypeAlias = _typing.Literal["set_altitude"] # noqa: Y015 + _WhichOneofArgType__set_altitude: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude"] # noqa: Y015 + _WhichOneofReturnType__set_ambient_pressure: _TypeAlias = _typing.Literal["set_ambient_pressure"] # noqa: Y015 + _WhichOneofArgType__set_ambient_pressure: _TypeAlias = _typing.Literal["_set_ambient_pressure", b"_set_ambient_pressure"] # noqa: Y015 + _WhichOneofReturnType__set_asc: _TypeAlias = _typing.Literal["set_asc"] # noqa: Y015 + _WhichOneofArgType__set_asc: _TypeAlias = _typing.Literal["_set_asc", b"_set_asc"] # noqa: Y015 + _WhichOneofReturnType__set_power_mode: _TypeAlias = _typing.Literal["set_power_mode"] # noqa: Y015 + _WhichOneofArgType__set_power_mode: _TypeAlias = _typing.Literal["_set_power_mode", b"_set_power_mode"] # noqa: Y015 + _WhichOneofReturnType__set_target_co2_conc: _TypeAlias = _typing.Literal["set_target_co2_conc"] # noqa: Y015 + _WhichOneofArgType__set_target_co2_conc: _TypeAlias = _typing.Literal["_set_target_co2_conc", b"_set_target_co2_conc"] # noqa: Y015 + _WhichOneofReturnType__set_temperature: _TypeAlias = _typing.Literal["set_temperature"] # noqa: Y015 + _WhichOneofArgType__set_temperature: _TypeAlias = _typing.Literal["_set_temperature", b"_set_temperature"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__factory_reset) -> _WhichOneofReturnType__factory_reset | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_altitude) -> _WhichOneofReturnType__set_altitude | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_ambient_pressure) -> _WhichOneofReturnType__set_ambient_pressure | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_asc) -> _WhichOneofReturnType__set_asc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_power_mode) -> _WhichOneofReturnType__set_power_mode | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_target_co2_conc) -> _WhichOneofReturnType__set_target_co2_conc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_temperature) -> _WhichOneofReturnType__set_temperature | None: ... + +Global___SCD4X_config: _TypeAlias = SCD4X_config # noqa: Y015 + +@_typing.final +class SEN5X_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + SET_TEMPERATURE_FIELD_NUMBER: _builtins.int + SET_ONE_SHOT_MODE_FIELD_NUMBER: _builtins.int + START_FAN_CLEANING_FIELD_NUMBER: _builtins.int + set_temperature: _builtins.int + """ + Reference temperature in centi-degrees Celsius + """ + 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 + 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 = ..., + set_temperature: _builtins.int | 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", "_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 + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__set_one_shot_mode: _TypeAlias = _typing.Literal["set_one_shot_mode"] # noqa: Y015 + _WhichOneofArgType__set_one_shot_mode: _TypeAlias = _typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode"] # noqa: Y015 + _WhichOneofReturnType__set_temperature: _TypeAlias = _typing.Literal["set_temperature"] # noqa: Y015 + _WhichOneofArgType__set_temperature: _TypeAlias = _typing.Literal["_set_temperature", b"_set_temperature"] # noqa: Y015 + _WhichOneofReturnType__start_fan_cleaning: _TypeAlias = _typing.Literal["start_fan_cleaning"] # noqa: Y015 + _WhichOneofArgType__start_fan_cleaning: _TypeAlias = _typing.Literal["_start_fan_cleaning", b"_start_fan_cleaning"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_one_shot_mode) -> _WhichOneofReturnType__set_one_shot_mode | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_temperature) -> _WhichOneofReturnType__set_temperature | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__start_fan_cleaning) -> _WhichOneofReturnType__start_fan_cleaning | None: ... + +Global___SEN5X_config: _TypeAlias = SEN5X_config # noqa: Y015 + +@_typing.final +class SEN6X_config(_message.Message): + DESCRIPTOR: _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.int + """ + Reference temperature in centi-degrees Celsius + """ + 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 + start_fan_cleaning: _builtins.bool """ Trigger a fan cleaning cycle """ - set_asc: builtins.bool + set_asc: _builtins.bool """ Set Automatic self-calibration enabled (CO2-capable variants only: SEN63C, SEN66, SEN69C) """ - set_target_co2_conc: builtins.int + set_target_co2_conc: _builtins.int """ Recalibration target CO2 concentration in ppm (FRC only), CO2-capable variants only """ - set_altitude: builtins.int + 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 + set_ambient_pressure: _builtins.int """ Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude), CO2-capable variants only """ - factory_reset: builtins.bool + 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 = ..., + set_temperature: _builtins.int | 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 - - SET_ASC_FIELD_NUMBER: builtins.int - SET_TARGET_CO2_CONC_FIELD_NUMBER: builtins.int - SET_TEMPERATURE_FIELD_NUMBER: builtins.int - SET_ALTITUDE_FIELD_NUMBER: builtins.int - SET_MEASUREMENT_INTERVAL_FIELD_NUMBER: builtins.int - SOFT_RESET_FIELD_NUMBER: builtins.int - set_asc: builtins.bool + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__factory_reset: _TypeAlias = _typing.Literal["factory_reset"] # noqa: Y015 + _WhichOneofArgType__factory_reset: _TypeAlias = _typing.Literal["_factory_reset", b"_factory_reset"] # noqa: Y015 + _WhichOneofReturnType__set_altitude: _TypeAlias = _typing.Literal["set_altitude"] # noqa: Y015 + _WhichOneofArgType__set_altitude: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude"] # noqa: Y015 + _WhichOneofReturnType__set_ambient_pressure: _TypeAlias = _typing.Literal["set_ambient_pressure"] # noqa: Y015 + _WhichOneofArgType__set_ambient_pressure: _TypeAlias = _typing.Literal["_set_ambient_pressure", b"_set_ambient_pressure"] # noqa: Y015 + _WhichOneofReturnType__set_asc: _TypeAlias = _typing.Literal["set_asc"] # noqa: Y015 + _WhichOneofArgType__set_asc: _TypeAlias = _typing.Literal["_set_asc", b"_set_asc"] # noqa: Y015 + _WhichOneofReturnType__set_one_shot_mode: _TypeAlias = _typing.Literal["set_one_shot_mode"] # noqa: Y015 + _WhichOneofArgType__set_one_shot_mode: _TypeAlias = _typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode"] # noqa: Y015 + _WhichOneofReturnType__set_target_co2_conc: _TypeAlias = _typing.Literal["set_target_co2_conc"] # noqa: Y015 + _WhichOneofArgType__set_target_co2_conc: _TypeAlias = _typing.Literal["_set_target_co2_conc", b"_set_target_co2_conc"] # noqa: Y015 + _WhichOneofReturnType__set_temperature: _TypeAlias = _typing.Literal["set_temperature"] # noqa: Y015 + _WhichOneofArgType__set_temperature: _TypeAlias = _typing.Literal["_set_temperature", b"_set_temperature"] # noqa: Y015 + _WhichOneofReturnType__start_fan_cleaning: _TypeAlias = _typing.Literal["start_fan_cleaning"] # noqa: Y015 + _WhichOneofArgType__start_fan_cleaning: _TypeAlias = _typing.Literal["_start_fan_cleaning", b"_start_fan_cleaning"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__factory_reset) -> _WhichOneofReturnType__factory_reset | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_altitude) -> _WhichOneofReturnType__set_altitude | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_ambient_pressure) -> _WhichOneofReturnType__set_ambient_pressure | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_asc) -> _WhichOneofReturnType__set_asc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_one_shot_mode) -> _WhichOneofReturnType__set_one_shot_mode | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_target_co2_conc) -> _WhichOneofReturnType__set_target_co2_conc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_temperature) -> _WhichOneofReturnType__set_temperature | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__start_fan_cleaning) -> _WhichOneofReturnType__start_fan_cleaning | None: ... + +Global___SEN6X_config: _TypeAlias = SEN6X_config # noqa: Y015 + +@_typing.final +class SCD30_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + SET_ASC_FIELD_NUMBER: _builtins.int + SET_TARGET_CO2_CONC_FIELD_NUMBER: _builtins.int + SET_TEMPERATURE_FIELD_NUMBER: _builtins.int + SET_ALTITUDE_FIELD_NUMBER: _builtins.int + SET_MEASUREMENT_INTERVAL_FIELD_NUMBER: _builtins.int + SOFT_RESET_FIELD_NUMBER: _builtins.int + set_asc: _builtins.bool """ Set Automatic self-calibration enabled """ - set_target_co2_conc: builtins.int + set_target_co2_conc: _builtins.int """ Recalibration target CO2 concentration in ppm (FRC or ASC) """ - set_temperature: builtins.float + set_temperature: _builtins.int """ - Reference temperature in degC + Reference temperature in centi-degrees Celsius """ - set_altitude: builtins.int + set_altitude: _builtins.int """ Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) """ - set_measurement_interval: builtins.int + set_measurement_interval: _builtins.int """ Power mode for sensor (true for low power, false for normal) """ - soft_reset: builtins.bool + soft_reset: _builtins.bool """ Perform a factory reset of the sensor """ def __init__( self, *, - set_asc: builtins.bool | None = ..., - set_target_co2_conc: builtins.int | None = ..., - set_temperature: builtins.float | None = ..., - set_altitude: builtins.int | None = ..., - set_measurement_interval: builtins.int | None = ..., - soft_reset: builtins.bool | None = ..., + set_asc: _builtins.bool | None = ..., + set_target_co2_conc: _builtins.int | None = ..., + set_temperature: _builtins.int | None = ..., + set_altitude: _builtins.int | None = ..., + set_measurement_interval: _builtins.int | None = ..., + soft_reset: _builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_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_asc", b"_set_asc"]) -> typing.Literal["set_asc"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_set_measurement_interval", b"_set_measurement_interval"]) -> typing.Literal["set_measurement_interval"] | 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["_soft_reset", b"_soft_reset"]) -> typing.Literal["soft_reset"] | None: ... - -global___SCD30_config = SCD30_config - -@typing.final -class SHTXX_config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SET_ACCURACY_FIELD_NUMBER: builtins.int - set_accuracy: builtins.int + _HasFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__set_altitude: _TypeAlias = _typing.Literal["set_altitude"] # noqa: Y015 + _WhichOneofArgType__set_altitude: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude"] # noqa: Y015 + _WhichOneofReturnType__set_asc: _TypeAlias = _typing.Literal["set_asc"] # noqa: Y015 + _WhichOneofArgType__set_asc: _TypeAlias = _typing.Literal["_set_asc", b"_set_asc"] # noqa: Y015 + _WhichOneofReturnType__set_measurement_interval: _TypeAlias = _typing.Literal["set_measurement_interval"] # noqa: Y015 + _WhichOneofArgType__set_measurement_interval: _TypeAlias = _typing.Literal["_set_measurement_interval", b"_set_measurement_interval"] # noqa: Y015 + _WhichOneofReturnType__set_target_co2_conc: _TypeAlias = _typing.Literal["set_target_co2_conc"] # noqa: Y015 + _WhichOneofArgType__set_target_co2_conc: _TypeAlias = _typing.Literal["_set_target_co2_conc", b"_set_target_co2_conc"] # noqa: Y015 + _WhichOneofReturnType__set_temperature: _TypeAlias = _typing.Literal["set_temperature"] # noqa: Y015 + _WhichOneofArgType__set_temperature: _TypeAlias = _typing.Literal["_set_temperature", b"_set_temperature"] # noqa: Y015 + _WhichOneofReturnType__soft_reset: _TypeAlias = _typing.Literal["soft_reset"] # noqa: Y015 + _WhichOneofArgType__soft_reset: _TypeAlias = _typing.Literal["_soft_reset", b"_soft_reset"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_altitude) -> _WhichOneofReturnType__set_altitude | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_asc) -> _WhichOneofReturnType__set_asc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_measurement_interval) -> _WhichOneofReturnType__set_measurement_interval | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_target_co2_conc) -> _WhichOneofReturnType__set_target_co2_conc | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_temperature) -> _WhichOneofReturnType__set_temperature | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__soft_reset) -> _WhichOneofReturnType__soft_reset | None: ... + +Global___SCD30_config: _TypeAlias = SCD30_config # noqa: Y015 + +@_typing.final +class SHTXX_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + SET_ACCURACY_FIELD_NUMBER: _builtins.int + set_accuracy: _builtins.int """ Accuracy mode (0 = low, 1 = medium, 2 = high) """ def __init__( self, *, - set_accuracy: builtins.int | None = ..., + set_accuracy: _builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_set_accuracy", b"_set_accuracy", "set_accuracy", b"set_accuracy"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_set_accuracy", b"_set_accuracy", "set_accuracy", b"set_accuracy"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_set_accuracy", b"_set_accuracy"]) -> typing.Literal["set_accuracy"] | None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_set_accuracy", b"_set_accuracy", "set_accuracy", b"set_accuracy"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_set_accuracy", b"_set_accuracy", "set_accuracy", b"set_accuracy"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__set_accuracy: _TypeAlias = _typing.Literal["set_accuracy"] # noqa: Y015 + _WhichOneofArgType__set_accuracy: _TypeAlias = _typing.Literal["_set_accuracy", b"_set_accuracy"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_accuracy) -> _WhichOneofReturnType__set_accuracy | None: ... -global___SHTXX_config = SHTXX_config +Global___SHTXX_config: _TypeAlias = SHTXX_config # noqa: Y015 -@typing.final -class DS248X_config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class DS248X_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - MAIN_TEMPERATURE_CHANNEL_FIELD_NUMBER: builtins.int - main_temperature_channel: builtins.int + 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 = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_main_temperature_channel", b"_main_temperature_channel", "main_temperature_channel", b"main_temperature_channel"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_main_temperature_channel", b"_main_temperature_channel", "main_temperature_channel", b"main_temperature_channel"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__main_temperature_channel: _TypeAlias = _typing.Literal["main_temperature_channel"] # noqa: Y015 + _WhichOneofArgType__main_temperature_channel: _TypeAlias = _typing.Literal["_main_temperature_channel", b"_main_temperature_channel"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__main_temperature_channel) -> _WhichOneofReturnType__main_temperature_channel | None: ... -global___DS248X_config = DS248X_config +Global___DS248X_config: _TypeAlias = DS248X_config # noqa: Y015 -@typing.final -class AS3935_config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class AS3935_config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - SET_TUNING_CAP_PF_FIELD_NUMBER: builtins.int - set_tuning_cap_pf: builtins.int + 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. @@ -1525,10 +1628,14 @@ class AS3935_config(google.protobuf.message.Message): def __init__( self, *, - set_tuning_cap_pf: builtins.int | None = ..., + 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 + _HasFieldArgType: _TypeAlias = _typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf", "set_tuning_cap_pf", b"set_tuning_cap_pf"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf", "set_tuning_cap_pf", b"set_tuning_cap_pf"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__set_tuning_cap_pf: _TypeAlias = _typing.Literal["set_tuning_cap_pf"] # noqa: Y015 + _WhichOneofArgType__set_tuning_cap_pf: _TypeAlias = _typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_tuning_cap_pf) -> _WhichOneofReturnType__set_tuning_cap_pf | None: ... + +Global___AS3935_config: _TypeAlias = AS3935_config # noqa: Y015 diff --git a/meshtastic/protobuf/api_pb2.py b/meshtastic/protobuf/api_pb2.py new file mode 100644 index 000000000..315ca5d04 --- /dev/null +++ b/meshtastic/protobuf/api_pb2.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/api.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 +from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 +from meshtastic.protobuf import discovery_pb2 as meshtastic_dot_protobuf_dot_discovery__pb2 +from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 +from meshtastic.protobuf import packet_pb2 as meshtastic_dot_protobuf_dot_packet__pb2 +from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 +from meshtastic.protobuf import wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 +from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/protobuf/api.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a#meshtastic/protobuf/discovery.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a meshtastic/protobuf/packet.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/xmodem.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdf\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x11\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\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38 \x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x34\n\x0brecord_tier\x18\n \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\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\x02 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x03 \x01(\r\x12\x18\n\tdevice_id\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12\x16\n\x07pio_env\x18\x05 \x01(\tB\x05\x92?\x02\x08(\x12\x45\n\x10\x66irmware_edition\x18\x06 \x01(\x0e\x32$.meshtastic.protobuf.FirmwareEditionB\x05\x92?\x02\x38\x08\x12\x1b\n\x0cnodedb_count\x18\x07 \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\"\xe5\x01\n\x0bQueueStatus\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.QueueStatus.Result\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(\x07\"Y\n\x06Result\x12\r\n\tRESULT_OK\x10\x00\x12\x12\n\x0eRESULT_UNKNOWN\x10\x01\x12\x17\n\x13RESULT_NO_INTERFACE\x10\x02\x12\x13\n\x0fRESULT_DISABLED\x10\x03\"\x93\x08\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\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\x41\n\rmodule_config\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\x0cqueue_status\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x34\n\rxmodem_packet\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x32\n\tfile_info\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x46\n\x13\x63lient_notification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12?\n\x10\x64\x65vice_ui_config\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\"\xae\x04\n\x0eLockdownStatus\x12?\n\x05state\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.LockdownStatus.StateB\x05\x92?\x02\x38\x08\x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x04 \x01(\r\"\x86\x03\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x13\n\x0fNEEDS_PROVISION\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\n\n\x06LOCKED\x10\x10\x12\x15\n\x11LOCKED_NEEDS_AUTH\x10\x11\x12\x18\n\x14LOCKED_TOKEN_MISSING\x10\x12\x12\x18\n\x14LOCKED_TOKEN_EXPIRED\x10\x13\x12\x1b\n\x17LOCKED_TOKEN_BOOTS_ZERO\x10\x14\x12\x1a\n\x16LOCKED_TOKEN_HMAC_FAIL\x10\x15\x12\x19\n\x15LOCKED_TOKEN_DEK_FAIL\x10\x16\x12\x1b\n\x17LOCKED_TOKEN_WRONG_SIZE\x10\x17\x12\x1a\n\x16LOCKED_TOKEN_BAD_MAGIC\x10\x18\x12#\n\x1fLOCKED_SESSION_BUDGET_EXHAUSTED\x10\x19\x12\x19\n\x15LOCKED_DISABLE_FAILED\x10\x1a\"\x80\x01\n\x0fLoRaPresetGroup\x12\x15\n\rlegal_presets\x18\x01 \x01(\r\x12?\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"r\n\x13LoRaRegionPresetMap\x12;\n\x06groups\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.LoRaPresetGroupB\x05\x92?\x02\x10\x08\x12\x1e\n\rregion_groups\x18\x02 \x03(\rB\x07\x92?\x04\x10%8\x08\"\xbc\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x02 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x03 \x01(\x08H\x00\x12\x34\n\rxmodem_packet\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x05 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"\xfd\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\x07H\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\x05 \x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\x07 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x08 \x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\t \x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x12\x43\n\x12node_num_collision\x18\n \x01(\x0b\x32%.meshtastic.protobuf.NodeNumCollisionH\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\x19\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\x19\"\x7f\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08\x19\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\"$\n\x10NodeNumCollision\x12\x10\n\x08node_num\x18\x01 \x01(\x07\"9\n\x08\x46ileInfo\x12\x19\n\tfile_name\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x02\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\rB_\n\x14org.meshtastic.protoB\tApiProtosZ\"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.api_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\tApiProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_NODEINFO'].fields_by_name['channel']._options = None + _globals['_NODEINFO'].fields_by_name['channel']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFO'].fields_by_name['flags']._options = None + _globals['_NODEINFO'].fields_by_name['flags']._serialized_options = b'\222?\0028 ' + _globals['_NODEINFO'].fields_by_name['hops_away']._options = None + _globals['_NODEINFO'].fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' + _globals['_MYNODEINFO'].fields_by_name['device_id']._options = None + _globals['_MYNODEINFO'].fields_by_name['device_id']._serialized_options = b'\222?\002\010\020' + _globals['_MYNODEINFO'].fields_by_name['pio_env']._options = None + _globals['_MYNODEINFO'].fields_by_name['pio_env']._serialized_options = b'\222?\002\010(' + _globals['_MYNODEINFO'].fields_by_name['firmware_edition']._options = None + _globals['_MYNODEINFO'].fields_by_name['firmware_edition']._serialized_options = b'\222?\0028\010' + _globals['_MYNODEINFO'].fields_by_name['nodedb_count']._options = None + _globals['_MYNODEINFO'].fields_by_name['nodedb_count']._serialized_options = b'\222?\0028\020' + _globals['_LOGRECORD'].fields_by_name['message']._options = None + _globals['_LOGRECORD'].fields_by_name['message']._serialized_options = b'\222?\003\010\200\003' + _globals['_LOGRECORD'].fields_by_name['source']._options = None + _globals['_LOGRECORD'].fields_by_name['source']._serialized_options = b'\222?\002\010 ' + _globals['_QUEUESTATUS'].fields_by_name['free']._options = None + _globals['_QUEUESTATUS'].fields_by_name['free']._serialized_options = b'\222?\0028\010' + _globals['_QUEUESTATUS'].fields_by_name['maxlen']._options = None + _globals['_QUEUESTATUS'].fields_by_name['maxlen']._serialized_options = b'\222?\0028\010' + _globals['_LOCKDOWNSTATUS'].fields_by_name['state']._options = None + _globals['_LOCKDOWNSTATUS'].fields_by_name['state']._serialized_options = b'\222?\0028\010' + _globals['_LOCKDOWNSTATUS'].fields_by_name['boots_remaining']._options = None + _globals['_LOCKDOWNSTATUS'].fields_by_name['boots_remaining']._serialized_options = b'\222?\0028\020' + _globals['_LORAPRESETGROUP'].fields_by_name['default_preset']._options = None + _globals['_LORAPRESETGROUP'].fields_by_name['default_preset']._serialized_options = b'\222?\0028\010' + _globals['_LORAREGIONPRESETMAP'].fields_by_name['groups']._options = None + _globals['_LORAREGIONPRESETMAP'].fields_by_name['groups']._serialized_options = b'\222?\002\020\010' + _globals['_LORAREGIONPRESETMAP'].fields_by_name['region_groups']._options = None + _globals['_LORAREGIONPRESETMAP'].fields_by_name['region_groups']._serialized_options = b'\222?\004\020%8\010' + _globals['_CLIENTNOTIFICATION'].fields_by_name['message']._options = None + _globals['_CLIENTNOTIFICATION'].fields_by_name['message']._serialized_options = b'\222?\003\010\220\003' + _globals['_KEYVERIFICATIONNUMBERINFORM'].fields_by_name['remote_longname']._options = None + _globals['_KEYVERIFICATIONNUMBERINFORM'].fields_by_name['remote_longname']._serialized_options = b'\222?\002\010\031' + _globals['_KEYVERIFICATIONNUMBERREQUEST'].fields_by_name['remote_longname']._options = None + _globals['_KEYVERIFICATIONNUMBERREQUEST'].fields_by_name['remote_longname']._serialized_options = b'\222?\002\010\031' + _globals['_KEYVERIFICATIONFINAL'].fields_by_name['remote_longname']._options = None + _globals['_KEYVERIFICATIONFINAL'].fields_by_name['remote_longname']._serialized_options = b'\222?\002\010\031' + _globals['_KEYVERIFICATIONFINAL'].fields_by_name['verification_characters']._options = None + _globals['_KEYVERIFICATIONFINAL'].fields_by_name['verification_characters']._serialized_options = b'\222?\002\010\n' + _globals['_FILEINFO'].fields_by_name['file_name']._options = None + _globals['_FILEINFO'].fields_by_name['file_name']._serialized_options = b'\222?\003\010\200\002' + _globals['_NODEINFO']._serialized_start=444 + _globals['_NODEINFO']._serialized_end=795 + _globals['_MYNODEINFO']._serialized_start=798 + _globals['_MYNODEINFO']._serialized_end=1028 + _globals['_LOGRECORD']._serialized_start=1031 + _globals['_LOGRECORD']._serialized_end=1247 + _globals['_LOGRECORD_LEVEL']._serialized_start=1159 + _globals['_LOGRECORD_LEVEL']._serialized_end=1247 + _globals['_QUEUESTATUS']._serialized_start=1250 + _globals['_QUEUESTATUS']._serialized_end=1479 + _globals['_QUEUESTATUS_RESULT']._serialized_start=1390 + _globals['_QUEUESTATUS_RESULT']._serialized_end=1479 + _globals['_FROMRADIO']._serialized_start=1482 + _globals['_FROMRADIO']._serialized_end=2525 + _globals['_LOCKDOWNSTATUS']._serialized_start=2528 + _globals['_LOCKDOWNSTATUS']._serialized_end=3086 + _globals['_LOCKDOWNSTATUS_STATE']._serialized_start=2696 + _globals['_LOCKDOWNSTATUS_STATE']._serialized_end=3086 + _globals['_LORAPRESETGROUP']._serialized_start=3089 + _globals['_LORAPRESETGROUP']._serialized_end=3217 + _globals['_LORAREGIONPRESETMAP']._serialized_start=3219 + _globals['_LORAREGIONPRESETMAP']._serialized_end=3333 + _globals['_TORADIO']._serialized_start=3336 + _globals['_TORADIO']._serialized_end=3652 + _globals['_CLIENTNOTIFICATION']._serialized_start=3655 + _globals['_CLIENTNOTIFICATION']._serialized_end=4292 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=4294 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=4395 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=4397 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=4474 + _globals['_KEYVERIFICATIONFINAL']._serialized_start=4476 + _globals['_KEYVERIFICATIONFINAL']._serialized_end=4603 + _globals['_DUPLICATEDPUBLICKEY']._serialized_start=4605 + _globals['_DUPLICATEDPUBLICKEY']._serialized_end=4626 + _globals['_LOWENTROPYKEY']._serialized_start=4628 + _globals['_LOWENTROPYKEY']._serialized_end=4643 + _globals['_NODENUMCOLLISION']._serialized_start=4645 + _globals['_NODENUMCOLLISION']._serialized_end=4681 + _globals['_FILEINFO']._serialized_start=4683 + _globals['_FILEINFO']._serialized_end=4740 + _globals['_HEARTBEAT']._serialized_start=4742 + _globals['_HEARTBEAT']._serialized_end=4768 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/api_pb2.pyi b/meshtastic/protobuf/api_pb2.pyi new file mode 100644 index 000000000..cec3ddc7e --- /dev/null +++ b/meshtastic/protobuf/api_pb2.pyi @@ -0,0 +1,1307 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import channel_pb2 as _channel_pb2 +from . import common_pb2 as _common_pb2 +from . import config_pb2 as _config_pb2 +from . import device_ui_pb2 as _device_ui_pb2 +from . import discovery_pb2 as _discovery_pb2 +from . import module_config_pb2 as _module_config_pb2 +from . import packet_pb2 as _packet_pb2 +from . import telemetry_pb2 as _telemetry_pb2 +from . import wire_pb2 as _wire_pb2 +from . import xmodem_pb2 as _xmodem_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class NodeInfo(_message.Message): + """ + Full information about a node on the mesh. + Used for client API responses, NOT sent OTA. + """ + + DESCRIPTOR: _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 + FLAGS_FIELD_NUMBER: _builtins.int + HOPS_AWAY_FIELD_NUMBER: _builtins.int + RECORD_TIER_FIELD_NUMBER: _builtins.int + num: _builtins.int + """ + The node number + """ + snr: _builtins.int + """ + 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. + Value is in dB, scaled by 2: half-dB steps, so the whole practical SNR range + of -32 to +31.5 dB is one zigzag byte. + """ + last_heard: _builtins.int + """ + Set to indicate the last time we received a packet from this node + """ + channel: _builtins.int + """ + Local channel index we heard that node on. Only populated if its not the default channel. + """ + flags: _builtins.int + """ + Per-node boolean flags: a bitwise OR of NodeFlags values (common.proto). + Shares its definition with the stored NodeInfoLite.bitfield, so the two words + are interchangeable. The HAS_USER, HAS_IS_UNMESSAGABLE, HAS_SNR and HAS_RF_HEAR + presence bits are storage-only and are not set here, and neither is the slot + fingerprint in bits 12 to 23; NODE_FLAG_HEARD_ON_CURRENT_LORA is derived from those + two and set only here. + All of these persist across NodeDB cleanups. + """ + hops_away: _builtins.int + """ + Number of hops away from us this node is (0 if direct neighbor) + """ + record_tier: _discovery_pb2.RecordTier.ValueType + """ + Where this node's identity came from: heard over RF by this node, served by a discovery + server that heard it, or passed along by one that did not. A client shows "heard directly" + differently from "a server told me", and never pins a key from an expired record. + """ + @_builtins.property + def user(self) -> _wire_pb2.User: + """ + The user info for this node + """ + + @_builtins.property + def position(self) -> _wire_pb2.Position: + """ + This node's last known position. Position.time is when the position was taken, as + its sender reported it, and is kept when a later report leaves it out; last_heard + is when the node was last heard from. + """ + + @_builtins.property + def device_metrics(self) -> _telemetry_pb2.DeviceMetrics: + """ + The latest device metrics for the node. + """ + + def __init__( + self, + *, + num: _builtins.int = ..., + user: _wire_pb2.User | None = ..., + position: _wire_pb2.Position | None = ..., + snr: _builtins.int = ..., + last_heard: _builtins.int = ..., + device_metrics: _telemetry_pb2.DeviceMetrics | None = ..., + channel: _builtins.int = ..., + flags: _builtins.int = ..., + hops_away: _builtins.int | None = ..., + record_tier: _discovery_pb2.RecordTier.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_hops_away", b"_hops_away", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "position", b"position", "user", b"user"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_hops_away", b"_hops_away", "channel", b"channel", "device_metrics", b"device_metrics", "flags", b"flags", "hops_away", b"hops_away", "last_heard", b"last_heard", "num", b"num", "position", b"position", "record_tier", b"record_tier", "snr", b"snr", "user", b"user"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__hops_away: _TypeAlias = _typing.Literal["hops_away"] # noqa: Y015 + _WhichOneofArgType__hops_away: _TypeAlias = _typing.Literal["_hops_away", b"_hops_away"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__hops_away) -> _WhichOneofReturnType__hops_away | None: ... + +Global___NodeInfo: _TypeAlias = NodeInfo # noqa: Y015 + +@_typing.final +class MyNodeInfo(_message.Message): + """ + Unique local debugging info for this node. + Note: we don't include position or the user info, because that will come in the + Sent to the phone in response to WantNodes. + """ + + DESCRIPTOR: _descriptor.Descriptor + + MY_NODE_NUM_FIELD_NUMBER: _builtins.int + REBOOT_COUNT_FIELD_NUMBER: _builtins.int + MIN_APP_VERSION_FIELD_NUMBER: _builtins.int + DEVICE_ID_FIELD_NUMBER: _builtins.int + PIO_ENV_FIELD_NUMBER: _builtins.int + FIRMWARE_EDITION_FIELD_NUMBER: _builtins.int + NODEDB_COUNT_FIELD_NUMBER: _builtins.int + my_node_num: _builtins.int + """ + Tells the phone what our node number is: a CRC over the node's public key. + DeviceState.my_node holds the authoritative copy, computed once when the key is + set and read from there rather than recomputed. + """ + reboot_count: _builtins.int + """ + The total number of reboots this node has ever encountered + (well - since the last time we discarded preferences) + """ + min_app_version: _builtins.int + """ + The minimum app version that can talk to this device. + Phone/PC apps should compare this to their build number and if too low tell the user they must update their app. + """ + device_id: _builtins.bytes + """ + Unique hardware identifier for this device + """ + pio_env: _builtins.str + """ + The PlatformIO environment used to build this firmware + """ + firmware_edition: _common_pb2.FirmwareEdition.ValueType + """ + The indicator for whether this device is running event firmware and which + """ + nodedb_count: _builtins.int + """ + The number of NodeInfo records the phone should expect in the want_config + download that follows. Firmware fills it when it sends MyNodeInfo; the stored + DeviceState.my_node leaves it unset. + """ + def __init__( + self, + *, + my_node_num: _builtins.int = ..., + reboot_count: _builtins.int = ..., + min_app_version: _builtins.int = ..., + device_id: _builtins.bytes = ..., + pio_env: _builtins.str = ..., + firmware_edition: _common_pb2.FirmwareEdition.ValueType = ..., + nodedb_count: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_id", b"device_id", "firmware_edition", b"firmware_edition", "min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "nodedb_count", b"nodedb_count", "pio_env", b"pio_env", "reboot_count", b"reboot_count"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___MyNodeInfo: _TypeAlias = MyNodeInfo # noqa: Y015 + +@_typing.final +class LogRecord(_message.Message): + """ + Debug output from the device. + To minimize the size of records inside the device code, if a time/source/level is not set + on the message it is assumed to be a continuation of the previously sent message. + This allows the device code to use fixed maxlen 64 byte strings for messages, + and then extend as needed by emitting multiple records. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Level: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _LevelEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LogRecord._Level.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + UNSET: LogRecord._Level.ValueType # 0 + """ + Log level unset + """ + CRITICAL: LogRecord._Level.ValueType # 50 + """ + Critical log level + """ + ERROR: LogRecord._Level.ValueType # 40 + """ + Error log level + """ + WARNING: LogRecord._Level.ValueType # 30 + """ + Warning log level + """ + INFO: LogRecord._Level.ValueType # 20 + """ + Info log level + """ + DEBUG: LogRecord._Level.ValueType # 10 + """ + Debug log level + """ + TRACE: LogRecord._Level.ValueType # 5 + """ + Trace log level + """ + + class Level(_Level, metaclass=_LevelEnumTypeWrapper): + """ + Log levels, chosen to match python logging conventions. + """ + + UNSET: LogRecord.Level.ValueType # 0 + """ + Log level unset + """ + CRITICAL: LogRecord.Level.ValueType # 50 + """ + Critical log level + """ + ERROR: LogRecord.Level.ValueType # 40 + """ + Error log level + """ + WARNING: LogRecord.Level.ValueType # 30 + """ + Warning log level + """ + INFO: LogRecord.Level.ValueType # 20 + """ + Info log level + """ + DEBUG: LogRecord.Level.ValueType # 10 + """ + Debug log level + """ + TRACE: LogRecord.Level.ValueType # 5 + """ + Trace log level + """ + + MESSAGE_FIELD_NUMBER: _builtins.int + TIME_FIELD_NUMBER: _builtins.int + SOURCE_FIELD_NUMBER: _builtins.int + LEVEL_FIELD_NUMBER: _builtins.int + message: _builtins.str + """ + The log message body + """ + time: _builtins.int + """ + Seconds since 1970 - or 0 for unknown/unset + """ + source: _builtins.str + """ + Usually based on thread name - if known + """ + level: Global___LogRecord.Level.ValueType + """ + The log level of this message + """ + def __init__( + self, + *, + message: _builtins.str = ..., + time: _builtins.int = ..., + source: _builtins.str = ..., + level: Global___LogRecord.Level.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["level", b"level", "message", b"message", "source", b"source", "time", b"time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LogRecord: _TypeAlias = LogRecord # noqa: Y015 + +@_typing.final +class QueueStatus(_message.Message): + """ + Status of the outgoing message queue + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Result: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _ResultEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[QueueStatus._Result.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + RESULT_OK: QueueStatus._Result.ValueType # 0 + """ + The packet was queued. + """ + RESULT_UNKNOWN: QueueStatus._Result.ValueType # 1 + """ + The queue attempt failed for a reason with no more specific value. + """ + RESULT_NO_INTERFACE: QueueStatus._Result.ValueType # 2 + """ + No interface was available to carry the packet. + """ + RESULT_DISABLED: QueueStatus._Result.ValueType # 3 + """ + The interface that would carry it is disabled. + """ + + class Result(_Result, metaclass=_ResultEnumTypeWrapper): + """ + What happened to the last attempt to queue a packet. Typed, so nothing confuses it + with Routing.Error: a queue result and a routing error are different questions. + """ + + RESULT_OK: QueueStatus.Result.ValueType # 0 + """ + The packet was queued. + """ + RESULT_UNKNOWN: QueueStatus.Result.ValueType # 1 + """ + The queue attempt failed for a reason with no more specific value. + """ + RESULT_NO_INTERFACE: QueueStatus.Result.ValueType # 2 + """ + No interface was available to carry the packet. + """ + RESULT_DISABLED: QueueStatus.Result.ValueType # 3 + """ + The interface that would carry it is disabled. + """ + + RESULT_FIELD_NUMBER: _builtins.int + FREE_FIELD_NUMBER: _builtins.int + MAXLEN_FIELD_NUMBER: _builtins.int + MESH_PACKET_ID_FIELD_NUMBER: _builtins.int + result: Global___QueueStatus.Result.ValueType + """ + Result of the last attempt to queue a packet. + """ + free: _builtins.int + """ + Free entries in the outgoing queue + """ + maxlen: _builtins.int + """ + Maximum entries in the outgoing queue + """ + mesh_packet_id: _builtins.int + """ + The id of the mesh packet this status is about. fixed32, as every packet id is. + """ + def __init__( + self, + *, + result: Global___QueueStatus.Result.ValueType = ..., + free: _builtins.int = ..., + maxlen: _builtins.int = ..., + mesh_packet_id: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["free", b"free", "maxlen", b"maxlen", "mesh_packet_id", b"mesh_packet_id", "result", b"result"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___QueueStatus: _TypeAlias = QueueStatus # noqa: Y015 + +@_typing.final +class FromRadio(_message.Message): + """ + Packets from the radio to the phone will appear on the fromRadio characteristic. + It will support READ and NOTIFY. When a new packet arrives the device will BLE notify. + It will sit in that descriptor until consumed by the phone, + at which point the next item in the FIFO will be populated. + """ + + DESCRIPTOR: _descriptor.Descriptor + + ID_FIELD_NUMBER: _builtins.int + PACKET_FIELD_NUMBER: _builtins.int + MY_INFO_FIELD_NUMBER: _builtins.int + NODE_INFO_FIELD_NUMBER: _builtins.int + CONFIG_FIELD_NUMBER: _builtins.int + LOG_RECORD_FIELD_NUMBER: _builtins.int + CONFIG_COMPLETE_ID_FIELD_NUMBER: _builtins.int + REBOOTED_FIELD_NUMBER: _builtins.int + MODULE_CONFIG_FIELD_NUMBER: _builtins.int + CHANNEL_FIELD_NUMBER: _builtins.int + QUEUE_STATUS_FIELD_NUMBER: _builtins.int + XMODEM_PACKET_FIELD_NUMBER: _builtins.int + METADATA_FIELD_NUMBER: _builtins.int + MQTT_CLIENT_PROXY_MESSAGE_FIELD_NUMBER: _builtins.int + FILE_INFO_FIELD_NUMBER: _builtins.int + CLIENT_NOTIFICATION_FIELD_NUMBER: _builtins.int + DEVICE_UI_CONFIG_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, + see our bluetooth docs + """ + config_complete_id: _builtins.int + """ + Sent as true once the device has finished sending all of the responses to want_config. + Recipient should check if this ID matches our original request nonce, if + not, it means your config responses haven't started yet. + NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + """ + rebooted: _builtins.bool + """ + Sent to tell clients the radio has just rebooted. + Set to true if present. + Not used on all transports, currently just used for the serial console. + NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + """ + @_builtins.property + def packet(self) -> _packet_pb2.MeshPacket: + """ + A mesh packet received or to be sent + """ + + @_builtins.property + def my_info(self) -> Global___MyNodeInfo: + """ + Tells the phone what our node number is, can be -1 if we've not yet joined a mesh. + NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. + """ + + @_builtins.property + def node_info(self) -> Global___NodeInfo: + """ + One packet is sent for each node in the on radio DB + starts over with the first node in our DB + """ + + @_builtins.property + def config(self) -> _config_pb2.ConfigPayload: + """ + Include a part of the config + """ + + @_builtins.property + def log_record(self) -> Global___LogRecord: + """ + Set to send debug console output over our protobuf stream + """ + + @_builtins.property + def module_config(self) -> _module_config_pb2.ModuleConfigPayload: + """ + Include module config + """ + + @_builtins.property + def channel(self) -> _channel_pb2.Channel: + """ + One packet is sent for each channel + """ + + @_builtins.property + def queue_status(self) -> Global___QueueStatus: + """ + Queue status info + """ + + @_builtins.property + def xmodem_packet(self) -> _xmodem_pb2.XModem: + """ + File Transfer Chunk + """ + + @_builtins.property + def metadata(self) -> _common_pb2.DeviceMetadata: + """ + Device metadata message + """ + + @_builtins.property + def mqtt_client_proxy_message(self) -> _wire_pb2.MqttClientProxyMessage: + """ + MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) + """ + + @_builtins.property + def file_info(self) -> Global___FileInfo: + """ + File system manifest messages + """ + + @_builtins.property + def client_notification(self) -> Global___ClientNotification: + """ + Notification message to the client + """ + + @_builtins.property + def device_ui_config(self) -> _device_ui_pb2.DeviceUIConfig: + """ + Persistent data for device-ui + """ + + @_builtins.property + def lockdown_status(self) -> Global___LockdownStatus: + """ + Lockdown state notification for hardened firmware builds. + Sent post-config (so unauthorized clients learn they must + provision/unlock) and after each LockdownAuth admin command + to report success or failure. Replaces the earlier scheme of + encoding state as magic-string prefixes inside ClientNotification. + """ + + @_builtins.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. + + This is the running firmware's own table. region_registry.proto carries the + same relation as a static data file for clients that ship one; this message + is what the device actually enforces. + """ + + def __init__( + self, + *, + id: _builtins.int = ..., + packet: _packet_pb2.MeshPacket | None = ..., + my_info: Global___MyNodeInfo | None = ..., + node_info: Global___NodeInfo | None = ..., + config: _config_pb2.ConfigPayload | None = ..., + log_record: Global___LogRecord | None = ..., + config_complete_id: _builtins.int = ..., + rebooted: _builtins.bool = ..., + module_config: _module_config_pb2.ModuleConfigPayload | None = ..., + channel: _channel_pb2.Channel | None = ..., + queue_status: Global___QueueStatus | None = ..., + xmodem_packet: _xmodem_pb2.XModem | None = ..., + metadata: _common_pb2.DeviceMetadata | None = ..., + mqtt_client_proxy_message: _wire_pb2.MqttClientProxyMessage | None = ..., + file_info: Global___FileInfo | None = ..., + client_notification: Global___ClientNotification | None = ..., + device_ui_config: _device_ui_pb2.DeviceUIConfig | None = ..., + lockdown_status: Global___LockdownStatus | None = ..., + region_presets: Global___LoRaRegionPresetMap | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["channel", b"channel", "client_notification", b"client_notification", "config", b"config", "config_complete_id", b"config_complete_id", "device_ui_config", b"device_ui_config", "file_info", b"file_info", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "module_config", b"module_config", "mqtt_client_proxy_message", b"mqtt_client_proxy_message", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queue_status", b"queue_status", "rebooted", b"rebooted", "region_presets", b"region_presets", "xmodem_packet", b"xmodem_packet"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["channel", b"channel", "client_notification", b"client_notification", "config", b"config", "config_complete_id", b"config_complete_id", "device_ui_config", b"device_ui_config", "file_info", b"file_info", "id", b"id", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "module_config", b"module_config", "mqtt_client_proxy_message", b"mqtt_client_proxy_message", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queue_status", b"queue_status", "rebooted", b"rebooted", "region_presets", b"region_presets", "xmodem_packet", b"xmodem_packet"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "module_config", "channel", "queue_status", "xmodem_packet", "metadata", "mqtt_client_proxy_message", "file_info", "client_notification", "device_ui_config", "lockdown_status", "region_presets"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___FromRadio: _TypeAlias = FromRadio # noqa: Y015 + +@_typing.final +class LockdownStatus(_message.Message): + """ + Lockdown state report from firmware to client (for hardened builds + with MESHTASTIC_LOCKDOWN). Sent immediately after config_complete_id + to inform a freshly-connected unauthorized client what it must do, + and again in response to each LockdownAuth admin command. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _State: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _StateEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LockdownStatus._State.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + STATE_UNSPECIFIED: LockdownStatus._State.ValueType # 0 + """ + Default; should not be sent. + """ + DISABLED: LockdownStatus._State.ValueType # 1 + """ + Lockdown is supported by this firmware but not active: no passphrase has been + provisioned, or it was disabled via AdminMessage.lockdown_auth. The device is + operating in normal, non-encrypted mode, and clients render the lockdown-mode + toggle as OFF. + """ + NEEDS_PROVISION: LockdownStatus._State.ValueType # 2 + """ + No passphrase has ever been provisioned on this device, during an in-progress + enable flow. Client should prompt the operator to set one. + """ + UNLOCKED: LockdownStatus._State.ValueType # 3 + """ + Passphrase accepted; client is now authorized for this connection. + boots_remaining and valid_until_epoch describe the active session + token's TTL. + """ + UNLOCK_FAILED: LockdownStatus._State.ValueType # 4 + """ + Passphrase rejected. backoff_seconds is non-zero when rate-limited. + """ + LOCKED: LockdownStatus._State.ValueType # 16 + """ + Locked for a reason this firmware does not spell out. Client should present + (or auto-replay) a passphrase via AdminMessage.lockdown_auth, as for every + value below. + """ + LOCKED_NEEDS_AUTH: LockdownStatus._State.ValueType # 17 + """ + Storage is already unlocked, but this client must authenticate. + """ + LOCKED_TOKEN_MISSING: LockdownStatus._State.ValueType # 18 + """ + No boot token on flash. + """ + LOCKED_TOKEN_EXPIRED: LockdownStatus._State.ValueType # 19 + """ + Boot token wall-clock TTL elapsed. + """ + LOCKED_TOKEN_BOOTS_ZERO: LockdownStatus._State.ValueType # 20 + """ + Boot token boot-count TTL exhausted. + """ + LOCKED_TOKEN_HMAC_FAIL: LockdownStatus._State.ValueType # 21 + """ + Token tampered with, or issued for a different device. + """ + LOCKED_TOKEN_DEK_FAIL: LockdownStatus._State.ValueType # 22 + """ + Token DEK decrypt failed. + """ + LOCKED_TOKEN_WRONG_SIZE: LockdownStatus._State.ValueType # 23 + """ + Token file corrupted: wrong size. + """ + LOCKED_TOKEN_BAD_MAGIC: LockdownStatus._State.ValueType # 24 + """ + Token file corrupted: bad magic. + """ + LOCKED_SESSION_BUDGET_EXHAUSTED: LockdownStatus._State.ValueType # 25 + """ + The unlocked session's uptime budget ran out with no boot-count budget left. + """ + LOCKED_DISABLE_FAILED: LockdownStatus._State.ValueType # 26 + """ + Disabling lockdown failed, so the device stayed locked. + """ + + class State(_State, metaclass=_StateEnumTypeWrapper): + """ + Lockdown state, and the reason for it when locked. Every value of 16 or above + means locked: a client that does not recognise one treats it as locked and asks + for the passphrase. + """ + + STATE_UNSPECIFIED: LockdownStatus.State.ValueType # 0 + """ + Default; should not be sent. + """ + DISABLED: LockdownStatus.State.ValueType # 1 + """ + Lockdown is supported by this firmware but not active: no passphrase has been + provisioned, or it was disabled via AdminMessage.lockdown_auth. The device is + operating in normal, non-encrypted mode, and clients render the lockdown-mode + toggle as OFF. + """ + NEEDS_PROVISION: LockdownStatus.State.ValueType # 2 + """ + No passphrase has ever been provisioned on this device, during an in-progress + enable flow. Client should prompt the operator to set one. + """ + UNLOCKED: LockdownStatus.State.ValueType # 3 + """ + Passphrase accepted; client is now authorized for this connection. + boots_remaining and valid_until_epoch describe the active session + token's TTL. + """ + UNLOCK_FAILED: LockdownStatus.State.ValueType # 4 + """ + Passphrase rejected. backoff_seconds is non-zero when rate-limited. + """ + LOCKED: LockdownStatus.State.ValueType # 16 + """ + Locked for a reason this firmware does not spell out. Client should present + (or auto-replay) a passphrase via AdminMessage.lockdown_auth, as for every + value below. + """ + LOCKED_NEEDS_AUTH: LockdownStatus.State.ValueType # 17 + """ + Storage is already unlocked, but this client must authenticate. + """ + LOCKED_TOKEN_MISSING: LockdownStatus.State.ValueType # 18 + """ + No boot token on flash. + """ + LOCKED_TOKEN_EXPIRED: LockdownStatus.State.ValueType # 19 + """ + Boot token wall-clock TTL elapsed. + """ + LOCKED_TOKEN_BOOTS_ZERO: LockdownStatus.State.ValueType # 20 + """ + Boot token boot-count TTL exhausted. + """ + LOCKED_TOKEN_HMAC_FAIL: LockdownStatus.State.ValueType # 21 + """ + Token tampered with, or issued for a different device. + """ + LOCKED_TOKEN_DEK_FAIL: LockdownStatus.State.ValueType # 22 + """ + Token DEK decrypt failed. + """ + LOCKED_TOKEN_WRONG_SIZE: LockdownStatus.State.ValueType # 23 + """ + Token file corrupted: wrong size. + """ + LOCKED_TOKEN_BAD_MAGIC: LockdownStatus.State.ValueType # 24 + """ + Token file corrupted: bad magic. + """ + LOCKED_SESSION_BUDGET_EXHAUSTED: LockdownStatus.State.ValueType # 25 + """ + The unlocked session's uptime budget ran out with no boot-count budget left. + """ + LOCKED_DISABLE_FAILED: LockdownStatus.State.ValueType # 26 + """ + Disabling lockdown failed, so the device stayed locked. + """ + + STATE_FIELD_NUMBER: _builtins.int + BOOTS_REMAINING_FIELD_NUMBER: _builtins.int + VALID_UNTIL_EPOCH_FIELD_NUMBER: _builtins.int + BACKOFF_SECONDS_FIELD_NUMBER: _builtins.int + state: Global___LockdownStatus.State.ValueType + """ + Current lockdown state being reported, with the reason when locked. Values may be + added, so a client treats an unrecognised one of 16 or above as locked. + """ + boots_remaining: _builtins.int + """ + For UNLOCKED: remaining boots on the issued session token. + Decrements by 1 on each subsequent boot. + """ + valid_until_epoch: _builtins.int + """ + For UNLOCKED: wall-clock expiry of the issued session token, + absolute Unix-epoch seconds. 0 = no time limit. + """ + backoff_seconds: _builtins.int + """ + For UNLOCK_FAILED: seconds the client must wait before another + passphrase attempt will be accepted. 0 = wrong passphrase, no + backoff (immediate retry allowed but advisable to prompt user). + """ + def __init__( + self, + *, + state: Global___LockdownStatus.State.ValueType = ..., + boots_remaining: _builtins.int = ..., + valid_until_epoch: _builtins.int = ..., + backoff_seconds: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["backoff_seconds", b"backoff_seconds", "boots_remaining", b"boots_remaining", "state", b"state", "valid_until_epoch", b"valid_until_epoch"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LockdownStatus: _TypeAlias = LockdownStatus # noqa: Y015 + +@_typing.final +class LoRaPresetGroup(_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, since most regions share the one standard preset list. + """ + + DESCRIPTOR: _descriptor.Descriptor + + LEGAL_PRESETS_FIELD_NUMBER: _builtins.int + DEFAULT_PRESET_FIELD_NUMBER: _builtins.int + LICENSED_ONLY_FIELD_NUMBER: _builtins.int + legal_presets: _builtins.int + """ + Bitmask of the modem presets legal for every region referencing this group: + bit N is set when ModemPreset value N is legal. Bit 0 is MODEM_LONG_FAST and bit 14 + MODEM_MEDIUM_TURBO, the highest preset 3.0 defines, so 15 bits are in use and the + mask has room for another 17 presets before the field has to grow. + + A bitmask rather than a repeated enum: nanopb sizes repeated enums unpacked + at ~2 bytes per element, so an 11-preset list cost ~22 bytes where the mask + costs 4, and the whole map has to fit inside the FromRadio size cap. + """ + default_preset: _common_pb2.ModemPreset.ValueType + """ + The firmware's default modem preset for regions in this group. + Always one of the presets set in `legal_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. + """ + def __init__( + self, + *, + legal_presets: _builtins.int = ..., + default_preset: _common_pb2.ModemPreset.ValueType = ..., + licensed_only: _builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["default_preset", b"default_preset", "legal_presets", b"legal_presets", "licensed_only", b"licensed_only"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LoRaPresetGroup: _TypeAlias = LoRaPresetGroup # noqa: Y015 + +@_typing.final +class LoRaRegionPresetMap(_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. + Clients must tolerate this whole message being absent (firmware that predates + it), and must not restrict a region that carries no constraint entry. + """ + + DESCRIPTOR: _descriptor.Descriptor + + GROUPS_FIELD_NUMBER: _builtins.int + REGION_GROUPS_FIELD_NUMBER: _builtins.int + @_builtins.property + def groups(self) -> _containers.RepeatedCompositeFieldContainer[Global___LoRaPresetGroup]: + """ + One entry per distinct (preset-mask, default, licensing) combination. + Referenced by position from `region_groups`. + """ + + @_builtins.property + def region_groups(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + Region to group lookup, indexed by RegionCode value: element N describes the + region whose enum value is N. The element holds the `groups` index plus one, + so 0 means "no constraint information for this region" and the client must + not restrict it. Trailing regions with no entry are equally unconstrained, + so firmware only sends up to its highest constrained region. + + Packed varints rather than a repeated (region, index) message: the pair form + cost ~6 bytes per region against ~1 here, and the region is already implied + by position. + """ + + def __init__( + self, + *, + groups: _abc.Iterable[Global___LoRaPresetGroup] | None = ..., + region_groups: _abc.Iterable[_builtins.int] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["groups", b"groups", "region_groups", b"region_groups"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LoRaRegionPresetMap: _TypeAlias = LoRaRegionPresetMap # noqa: Y015 + +@_typing.final +class ToRadio(_message.Message): + """ + Packets/commands to the radio will be written (reliably) to the toRadio characteristic. + Once the write completes the phone can assume it is handled. + """ + + DESCRIPTOR: _descriptor.Descriptor + + PACKET_FIELD_NUMBER: _builtins.int + WANT_CONFIG_ID_FIELD_NUMBER: _builtins.int + DISCONNECT_FIELD_NUMBER: _builtins.int + XMODEM_PACKET_FIELD_NUMBER: _builtins.int + MQTT_CLIENT_PROXY_MESSAGE_FIELD_NUMBER: _builtins.int + HEARTBEAT_FIELD_NUMBER: _builtins.int + want_config_id: _builtins.int + """ + Phone wants radio to send full node db to the phone. This is + typically the first packet sent to the radio when the phone gets a + bluetooth connection. The radio will respond by sending back a + MyNodeInfo, a owner, a radio config and a series of + FromRadio.node_infos, and config_complete. + The integer you write into this field will be reported back in the + config_complete_id response. This allows clients to never be confused by + a stale old partially sent config. + """ + disconnect: _builtins.bool + """ + Tell API server we are disconnecting now. + This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link. + (Sending this message is optional for clients) + """ + @_builtins.property + def packet(self) -> _packet_pb2.MeshPacket: + """ + Send this packet on the mesh + """ + + @_builtins.property + def xmodem_packet(self) -> _xmodem_pb2.XModem: + """ + File Transfer Chunk + """ + + @_builtins.property + def mqtt_client_proxy_message(self) -> _wire_pb2.MqttClientProxyMessage: + """ + MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) + """ + + @_builtins.property + def heartbeat(self) -> Global___Heartbeat: + """ + Heartbeat message (used to keep the device connection awake on serial) + """ + + def __init__( + self, + *, + packet: _packet_pb2.MeshPacket | None = ..., + want_config_id: _builtins.int = ..., + disconnect: _builtins.bool = ..., + xmodem_packet: _xmodem_pb2.XModem | None = ..., + mqtt_client_proxy_message: _wire_pb2.MqttClientProxyMessage | None = ..., + heartbeat: Global___Heartbeat | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqtt_client_proxy_message", b"mqtt_client_proxy_message", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodem_packet", b"xmodem_packet"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqtt_client_proxy_message", b"mqtt_client_proxy_message", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodem_packet", b"xmodem_packet"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["packet", "want_config_id", "disconnect", "xmodem_packet", "mqtt_client_proxy_message", "heartbeat"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___ToRadio: _TypeAlias = ToRadio # noqa: Y015 + +@_typing.final +class ClientNotification(_message.Message): + """ + A notification message from the device to the client. + To be used for important messages that should be displayed to the user + in the form of push notifications or validation messages when saving + invalid configuration. + """ + + DESCRIPTOR: _descriptor.Descriptor + + REPLY_ID_FIELD_NUMBER: _builtins.int + TIME_FIELD_NUMBER: _builtins.int + LEVEL_FIELD_NUMBER: _builtins.int + MESSAGE_FIELD_NUMBER: _builtins.int + KEY_VERIFICATION_NUMBER_INFORM_FIELD_NUMBER: _builtins.int + KEY_VERIFICATION_NUMBER_REQUEST_FIELD_NUMBER: _builtins.int + KEY_VERIFICATION_FINAL_FIELD_NUMBER: _builtins.int + DUPLICATED_PUBLIC_KEY_FIELD_NUMBER: _builtins.int + LOW_ENTROPY_KEY_FIELD_NUMBER: _builtins.int + NODE_NUM_COLLISION_FIELD_NUMBER: _builtins.int + reply_id: _builtins.int + """ + The id of the packet this notification is about. fixed32, as every packet id is. + """ + time: _builtins.int + """ + Seconds since 1970 - or 0 for unknown/unset + """ + level: Global___LogRecord.Level.ValueType + """ + The level type of notification + """ + message: _builtins.str + """ + The message body of the notification + """ + @_builtins.property + def key_verification_number_inform(self) -> Global___KeyVerificationNumberInform: + """Informs the client of a security number for key verification""" + + @_builtins.property + def key_verification_number_request(self) -> Global___KeyVerificationNumberRequest: + """Requests the client to provide a security number for key verification""" + + @_builtins.property + def key_verification_final(self) -> Global___KeyVerificationFinal: + """Final result of a key verification exchange""" + + @_builtins.property + def duplicated_public_key(self) -> Global___DuplicatedPublicKey: + """Notification that a duplicated public key was detected""" + + @_builtins.property + def low_entropy_key(self) -> Global___LowEntropyKey: + """Notification that a low-entropy (weak) key was detected""" + + @_builtins.property + def node_num_collision(self) -> Global___NodeNumCollision: + """Two different public keys hash to one NodeNum""" + + def __init__( + self, + *, + reply_id: _builtins.int | None = ..., + time: _builtins.int = ..., + level: Global___LogRecord.Level.ValueType = ..., + message: _builtins.str = ..., + key_verification_number_inform: Global___KeyVerificationNumberInform | None = ..., + key_verification_number_request: Global___KeyVerificationNumberRequest | None = ..., + key_verification_final: Global___KeyVerificationFinal | None = ..., + duplicated_public_key: Global___DuplicatedPublicKey | None = ..., + low_entropy_key: Global___LowEntropyKey | None = ..., + node_num_collision: Global___NodeNumCollision | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "low_entropy_key", b"low_entropy_key", "node_num_collision", b"node_num_collision", "payload_variant", b"payload_variant", "reply_id", b"reply_id"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "level", b"level", "low_entropy_key", b"low_entropy_key", "message", b"message", "node_num_collision", b"node_num_collision", "payload_variant", b"payload_variant", "reply_id", b"reply_id", "time", b"time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__reply_id: _TypeAlias = _typing.Literal["reply_id"] # noqa: Y015 + _WhichOneofArgType__reply_id: _TypeAlias = _typing.Literal["_reply_id", b"_reply_id"] # noqa: Y015 + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["key_verification_number_inform", "key_verification_number_request", "key_verification_final", "duplicated_public_key", "low_entropy_key", "node_num_collision"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__reply_id) -> _WhichOneofReturnType__reply_id | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___ClientNotification: _TypeAlias = ClientNotification # noqa: Y015 + +@_typing.final +class KeyVerificationNumberInform(_message.Message): + """ + Informs the client of the security number to display for key verification + """ + + DESCRIPTOR: _descriptor.Descriptor + + NONCE_FIELD_NUMBER: _builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: _builtins.int + SECURITY_NUMBER_FIELD_NUMBER: _builtins.int + nonce: _builtins.int + """Nonce used to track this verification session""" + remote_longname: _builtins.str + """Long name of the remote node being verified""" + security_number: _builtins.int + """The 4-digit security number to display""" + def __init__( + self, + *, + nonce: _builtins.int = ..., + remote_longname: _builtins.str = ..., + security_number: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname", "security_number", b"security_number"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___KeyVerificationNumberInform: _TypeAlias = KeyVerificationNumberInform # noqa: Y015 + +@_typing.final +class KeyVerificationNumberRequest(_message.Message): + """ + Requests the client to prompt the user for the security number during key verification + """ + + DESCRIPTOR: _descriptor.Descriptor + + NONCE_FIELD_NUMBER: _builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: _builtins.int + nonce: _builtins.int + """Nonce used to track this verification session""" + remote_longname: _builtins.str + """Long name of the remote node being verified""" + def __init__( + self, + *, + nonce: _builtins.int = ..., + remote_longname: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___KeyVerificationNumberRequest: _TypeAlias = KeyVerificationNumberRequest # noqa: Y015 + +@_typing.final +class KeyVerificationFinal(_message.Message): + """ + Final stage of key verification, containing the result characters for visual comparison + """ + + DESCRIPTOR: _descriptor.Descriptor + + NONCE_FIELD_NUMBER: _builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: _builtins.int + ISSENDER_FIELD_NUMBER: _builtins.int + VERIFICATION_CHARACTERS_FIELD_NUMBER: _builtins.int + nonce: _builtins.int + """Nonce used to track this verification session""" + remote_longname: _builtins.str + """Long name of the remote node being verified""" + isSender: _builtins.bool + """Whether this node initiated the verification""" + verification_characters: _builtins.str + """The verification characters for visual comparison between devices""" + def __init__( + self, + *, + nonce: _builtins.int = ..., + remote_longname: _builtins.str = ..., + isSender: _builtins.bool = ..., + verification_characters: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["isSender", b"isSender", "nonce", b"nonce", "remote_longname", b"remote_longname", "verification_characters", b"verification_characters"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___KeyVerificationFinal: _TypeAlias = KeyVerificationFinal # noqa: Y015 + +@_typing.final +class DuplicatedPublicKey(_message.Message): + """ + Notification that this device's public key is duplicated on the mesh (possible security issue) + """ + + DESCRIPTOR: _descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _Never # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___DuplicatedPublicKey: _TypeAlias = DuplicatedPublicKey # noqa: Y015 + +@_typing.final +class LowEntropyKey(_message.Message): + """ + Notification that the device's key has low entropy and should be regenerated + """ + + DESCRIPTOR: _descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _Never # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LowEntropyKey: _TypeAlias = LowEntropyKey # noqa: Y015 + +@_typing.final +class NodeNumCollision(_message.Message): + """ + Two nodes hold different public keys that hash to the same NodeNum. + + A NodeNum is CRC32 of a public key, a 32-bit function, so a targeted collision costs about + 2^32 key generations: cheap enough that this is a normal event rather than an anomaly, and + cheap enough to be an impersonation attempt. Neither record is dropped and neither replaces + the other; the client shows both and a person picks, and a key already verified through the + KeyVerification exchange is never displaced by the newcomer. + """ + + DESCRIPTOR: _descriptor.Descriptor + + NODE_NUM_FIELD_NUMBER: _builtins.int + node_num: _builtins.int + """ + The NodeNum both keys hash to. + """ + def __init__( + self, + *, + node_num: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["node_num", b"node_num"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeNumCollision: _TypeAlias = NodeNumCollision # noqa: Y015 + +@_typing.final +class FileInfo(_message.Message): + """ + Individual File info for the device + """ + + DESCRIPTOR: _descriptor.Descriptor + + FILE_NAME_FIELD_NUMBER: _builtins.int + SIZE_BYTES_FIELD_NUMBER: _builtins.int + file_name: _builtins.str + """ + The fully qualified path of the file + """ + size_bytes: _builtins.int + """ + The size of the file in bytes + """ + def __init__( + self, + *, + file_name: _builtins.str = ..., + size_bytes: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["file_name", b"file_name", "size_bytes", b"size_bytes"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___FileInfo: _TypeAlias = FileInfo # noqa: Y015 + +@_typing.final +class Heartbeat(_message.Message): + """ + A heartbeat message is sent to the node from the client to keep the connection alive. + This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI. + """ + + DESCRIPTOR: _descriptor.Descriptor + + NONCE_FIELD_NUMBER: _builtins.int + nonce: _builtins.int + """ + The nonce of the heartbeat message + """ + def __init__( + self, + *, + nonce: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["nonce", b"nonce"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___Heartbeat: _TypeAlias = Heartbeat # noqa: Y015 diff --git a/meshtastic/protobuf/apponly_pb2.py b/meshtastic/protobuf/apponly_pb2.py index 9f5d99fc9..85f801409 100644 --- a/meshtastic/protobuf/apponly_pb2.py +++ b/meshtastic/protobuf/apponly_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/apponly.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -16,16 +17,16 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/apponly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a meshtastic/protobuf/nanopb.proto\"\x88\x01\n\nChannelSet\x12=\n\x08settings\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ChannelSettingsB\x05\x92?\x02\x10\x08\x12;\n\x0blora_config\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigBc\n\x14org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/apponly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a meshtastic/protobuf/nanopb.proto\"\x81\x01\n\nChannelSet\x12=\n\x08settings\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ChannelSettingsB\x05\x92?\x02\x10\x10\x12\x34\n\x0blora_config\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigBc\n\x14org.meshtastic.protoB\rAppOnlyProtosZ\"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.apponly_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _CHANNELSET.fields_by_name['settings']._options = None - _CHANNELSET.fields_by_name['settings']._serialized_options = b'\222?\002\020\010' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_CHANNELSET'].fields_by_name['settings']._options = None + _globals['_CHANNELSET'].fields_by_name['settings']._serialized_options = b'\222?\002\020\020' _globals['_CHANNELSET']._serialized_start=162 - _globals['_CHANNELSET']._serialized_end=298 + _globals['_CHANNELSET']._serialized_end=291 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/apponly_pb2.pyi b/meshtastic/protobuf/apponly_pb2.pyi index c8a34bc62..61d694c99 100644 --- a/meshtastic/protobuf/apponly_pb2.pyi +++ b/meshtastic/protobuf/apponly_pb2.pyi @@ -3,39 +3,44 @@ isort:skip_file """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.message -import meshtastic.protobuf.channel_pb2 -import meshtastic.protobuf.config_pb2 -import typing - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -@typing.final -class ChannelSet(google.protobuf.message.Message): +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from . import channel_pb2 as _channel_pb2 +from . import config_pb2 as _config_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class ChannelSet(_message.Message): """ This is the most compact possible representation for a set of channels. - It includes only one PRIMARY channel (which must be first) and - any SECONDARY channels. - No DISABLED channels are included. + The primary channel is first; the rest follow in table order. + Disabled channels are not included. This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - SETTINGS_FIELD_NUMBER: builtins.int - LORA_CONFIG_FIELD_NUMBER: builtins.int - @property - def settings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.channel_pb2.ChannelSettings]: + SETTINGS_FIELD_NUMBER: _builtins.int + LORA_CONFIG_FIELD_NUMBER: _builtins.int + @_builtins.property + def settings(self) -> _containers.RepeatedCompositeFieldContainer[_channel_pb2.ChannelSettings]: """ Channel list with settings """ - @property - def lora_config(self) -> meshtastic.protobuf.config_pb2.Config.LoRaConfig: + @_builtins.property + def lora_config(self) -> _config_pb2.LoRaConfig: """ LoRa config """ @@ -43,10 +48,13 @@ class ChannelSet(google.protobuf.message.Message): def __init__( self, *, - settings: collections.abc.Iterable[meshtastic.protobuf.channel_pb2.ChannelSettings] | None = ..., - lora_config: meshtastic.protobuf.config_pb2.Config.LoRaConfig | None = ..., + settings: _abc.Iterable[_channel_pb2.ChannelSettings] | None = ..., + lora_config: _config_pb2.LoRaConfig | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["lora_config", b"lora_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["lora_config", b"lora_config", "settings", b"settings"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["lora_config", b"lora_config"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["lora_config", b"lora_config", "settings", b"settings"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ChannelSet = ChannelSet +Global___ChannelSet: _TypeAlias = ChannelSet # noqa: Y015 diff --git a/meshtastic/protobuf/atak_pb2.py b/meshtastic/protobuf/atak_pb2.py index 933ba5f4e..3e2338c19 100644 --- a/meshtastic/protobuf/atak_pb2.py +++ b/meshtastic/protobuf/atak_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/atak.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -15,288 +16,278 @@ 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/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') +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\"\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\"\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 \"\xd8\x08\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\"\n\x11vertex_lat_deltas\x18\x0c \x03(\x11\x42\x07\x92?\x04\x10 8 \x12\"\n\x11vertex_lon_deltas\x18\r \x03(\x11\x42\x07\x92?\x04\x10 8 \x12\x11\n\ttruncated\x18\x0e \x01(\x08\x12#\n\x14\x62ullseye_distance_dm\x18\x0f \x01(\rB\x05\x92?\x02\x38 \x12#\n\x14\x62ullseye_bearing_ref\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0e\x62ullseye_flags\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1f\n\x10\x62ullseye_uid_ref\x18\x12 \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\x03\"\x91\x01\n\rBullseyeFlags\x12\x11\n\rBULLSEYE_NONE\x10\x00\x12\x1f\n\x1b\x42ULLSEYE_RANGE_RING_VISIBLE\x10\x01\x12\x1c\n\x18\x42ULLSEYE_HAS_RANGE_RINGS\x10\x02\x12\x1b\n\x17\x42ULLSEYE_EDGE_TO_CENTER\x10\x04\x12\x11\n\rBULLSEYE_MILS\x10\x08\"\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\"\xfd\r\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\"\x97\x01\n\x0e\x45quipmentFlags\x12\x13\n\x0f\x45QUIPMENT_UNSET\x10\x00\x12\x12\n\x0e\x45QUIPMENT_NONE\x10\x01\x12\x13\n\x0f\x45QUIPMENT_HOIST\x10\x02\x12\x18\n\x14\x45QUIPMENT_EXTRACTION\x10\x04\x12\x18\n\x14\x45QUIPMENT_VENTILATOR\x10\x08\x12\x13\n\x0f\x45QUIPMENT_BLOOD\x10\x10\"\x92\x01\n\x0cTerrainFlags\x12\x10\n\x0cTERRAIN_NONE\x10\x00\x12\x11\n\rTERRAIN_SLOPE\x10\x01\x12\x11\n\rTERRAIN_ROUGH\x10\x02\x12\x11\n\rTERRAIN_LOOSE\x10\x04\x12\x11\n\rTERRAIN_TREES\x10\x08\x12\x11\n\rTERRAIN_WIRES\x10\x10\x12\x11\n\rTERRAIN_OTHER\x10 \"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\x30\x12\x1b\n\x0c\x61ssignee_uid\x18\x03 \x01(\tB\x05\x92?\x02\x08\x30\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\"b\n\x0eTAKEnvironment\x12\x1b\n\x13temperature_c_centi\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\"\x9c\x0c\n\tTAKPacket\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\x1b \x01(\x0b\x32\x1a.meshtastic.protobuf.MartiH\x03\x88\x01\x01\x12,\n\x04\x63hat\x18\x1c \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x36\n\x08\x61ircraft\x18\x1d \x01(\x0b\x32\".meshtastic.protobuf.AircraftTrackH\x00\x12\x1c\n\nraw_detail\x18\x1e \x01(\x0c\x42\x06\x92?\x03\x08\xdc\x01H\x00\x12\x30\n\x05shape\x18\x1f \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_marti*\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.atak_pb2', _globals) 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 - _GEOCHAT.fields_by_name['message']._serialized_options = b'\222?\003\010\310\001' - _GEOCHAT.fields_by_name['to']._options = None - _GEOCHAT.fields_by_name['to']._serialized_options = b'\222?\002\010x' - _GEOCHAT.fields_by_name['to_callsign']._options = None - _GEOCHAT.fields_by_name['to_callsign']._serialized_options = b'\222?\002\010x' - _GEOCHAT.fields_by_name['receipt_for_uid']._options = None - _GEOCHAT.fields_by_name['receipt_for_uid']._serialized_options = b'\222?\002\0100' - _STATUS.fields_by_name['battery']._options = None - _STATUS.fields_by_name['battery']._serialized_options = b'\222?\0028\010' - _CONTACT.fields_by_name['callsign']._options = None - _CONTACT.fields_by_name['callsign']._serialized_options = b'\222?\002\010x' - _CONTACT.fields_by_name['device_callsign']._options = None - _CONTACT.fields_by_name['device_callsign']._serialized_options = b'\222?\002\010x' - _PLI.fields_by_name['course']._options = None - _PLI.fields_by_name['course']._serialized_options = b'\222?\0028\020' - _AIRCRAFTTRACK.fields_by_name['icao']._options = None - _AIRCRAFTTRACK.fields_by_name['icao']._serialized_options = b'\222?\002\010\010' - _AIRCRAFTTRACK.fields_by_name['registration']._options = None - _AIRCRAFTTRACK.fields_by_name['registration']._serialized_options = b'\222?\002\010\020' - _AIRCRAFTTRACK.fields_by_name['flight']._options = None - _AIRCRAFTTRACK.fields_by_name['flight']._serialized_options = b'\222?\002\010\020' - _AIRCRAFTTRACK.fields_by_name['aircraft_type']._options = None - _AIRCRAFTTRACK.fields_by_name['aircraft_type']._serialized_options = b'\222?\002\010\010' - _AIRCRAFTTRACK.fields_by_name['squawk']._options = None - _AIRCRAFTTRACK.fields_by_name['squawk']._serialized_options = b'\222?\0028\020' - _AIRCRAFTTRACK.fields_by_name['category']._options = None - _AIRCRAFTTRACK.fields_by_name['category']._serialized_options = b'\222?\002\010\004' - _AIRCRAFTTRACK.fields_by_name['cot_host_id']._options = None - _AIRCRAFTTRACK.fields_by_name['cot_host_id']._serialized_options = b'\222?\002\010@' - _COTGEOPOINT.fields_by_name['lat_delta_i']._options = None - _COTGEOPOINT.fields_by_name['lat_delta_i']._serialized_options = b'\222?\0028 ' - _COTGEOPOINT.fields_by_name['lon_delta_i']._options = None - _COTGEOPOINT.fields_by_name['lon_delta_i']._serialized_options = b'\222?\0028 ' - _DRAWNSHAPE.fields_by_name['major_cm']._options = None - _DRAWNSHAPE.fields_by_name['major_cm']._serialized_options = b'\222?\0028 ' - _DRAWNSHAPE.fields_by_name['minor_cm']._options = None - _DRAWNSHAPE.fields_by_name['minor_cm']._serialized_options = b'\222?\0028 ' - _DRAWNSHAPE.fields_by_name['angle_deg']._options = None - _DRAWNSHAPE.fields_by_name['angle_deg']._serialized_options = b'\222?\0028\020' - _DRAWNSHAPE.fields_by_name['stroke_weight_x10']._options = None - _DRAWNSHAPE.fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' - _DRAWNSHAPE.fields_by_name['bullseye_distance_dm']._options = None - _DRAWNSHAPE.fields_by_name['bullseye_distance_dm']._serialized_options = b'\222?\0028 ' - _DRAWNSHAPE.fields_by_name['bullseye_bearing_ref']._options = None - _DRAWNSHAPE.fields_by_name['bullseye_bearing_ref']._serialized_options = b'\222?\0028\010' - _DRAWNSHAPE.fields_by_name['bullseye_flags']._options = None - _DRAWNSHAPE.fields_by_name['bullseye_flags']._serialized_options = b'\222?\0028\010' - _DRAWNSHAPE.fields_by_name['bullseye_uid_ref']._options = None - _DRAWNSHAPE.fields_by_name['bullseye_uid_ref']._serialized_options = b'\222?\002\0100' - _MARKER.fields_by_name['parent_uid']._options = None - _MARKER.fields_by_name['parent_uid']._serialized_options = b'\222?\002\0100' - _MARKER.fields_by_name['parent_type']._options = None - _MARKER.fields_by_name['parent_type']._serialized_options = b'\222?\002\010\030' - _MARKER.fields_by_name['parent_callsign']._options = None - _MARKER.fields_by_name['parent_callsign']._serialized_options = b'\222?\002\010\030' - _MARKER.fields_by_name['iconset']._options = None - _MARKER.fields_by_name['iconset']._serialized_options = b'\222?\002\010P' - _RANGEANDBEARING.fields_by_name['anchor_uid']._options = None - _RANGEANDBEARING.fields_by_name['anchor_uid']._serialized_options = b'\222?\002\0100' - _RANGEANDBEARING.fields_by_name['range_cm']._options = None - _RANGEANDBEARING.fields_by_name['range_cm']._serialized_options = b'\222?\0028 ' - _RANGEANDBEARING.fields_by_name['bearing_cdeg']._options = None - _RANGEANDBEARING.fields_by_name['bearing_cdeg']._serialized_options = b'\222?\0028\020' - _RANGEANDBEARING.fields_by_name['stroke_weight_x10']._options = None - _RANGEANDBEARING.fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' - _ROUTE_LINK.fields_by_name['uid']._options = None - _ROUTE_LINK.fields_by_name['uid']._serialized_options = b'\222?\002\0100' - _ROUTE_LINK.fields_by_name['callsign']._options = None - _ROUTE_LINK.fields_by_name['callsign']._serialized_options = b'\222?\002\010\020' - _ROUTE_LINK.fields_by_name['link_type']._options = None - _ROUTE_LINK.fields_by_name['link_type']._serialized_options = b'\222?\0028\010' - _ROUTE.fields_by_name['prefix']._options = None - _ROUTE.fields_by_name['prefix']._serialized_options = b'\222?\002\010\010' - _ROUTE.fields_by_name['stroke_weight_x10']._options = None - _ROUTE.fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' - _ROUTE.fields_by_name['links']._options = None - _ROUTE.fields_by_name['links']._serialized_options = b'\222?\002\020\020' - _CASEVACREPORT.fields_by_name['equipment_flags']._options = None - _CASEVACREPORT.fields_by_name['equipment_flags']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['litter_patients']._options = None - _CASEVACREPORT.fields_by_name['litter_patients']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['ambulatory_patients']._options = None - _CASEVACREPORT.fields_by_name['ambulatory_patients']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['zone_marker']._options = None - _CASEVACREPORT.fields_by_name['zone_marker']._serialized_options = b'\222?\002\010\020' - _CASEVACREPORT.fields_by_name['us_military']._options = None - _CASEVACREPORT.fields_by_name['us_military']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['us_civilian']._options = None - _CASEVACREPORT.fields_by_name['us_civilian']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['non_us_military']._options = None - _CASEVACREPORT.fields_by_name['non_us_military']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['non_us_civilian']._options = None - _CASEVACREPORT.fields_by_name['non_us_civilian']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['epw']._options = None - _CASEVACREPORT.fields_by_name['epw']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['child']._options = None - _CASEVACREPORT.fields_by_name['child']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['terrain_flags']._options = None - _CASEVACREPORT.fields_by_name['terrain_flags']._serialized_options = b'\222?\0028\010' - _CASEVACREPORT.fields_by_name['frequency']._options = None - _CASEVACREPORT.fields_by_name['frequency']._serialized_options = b'\222?\002\010\020' - _EMERGENCYALERT.fields_by_name['authoring_uid']._options = None - _EMERGENCYALERT.fields_by_name['authoring_uid']._serialized_options = b'\222?\002\0100' - _EMERGENCYALERT.fields_by_name['cancel_reference_uid']._options = None - _EMERGENCYALERT.fields_by_name['cancel_reference_uid']._serialized_options = b'\222?\002\0100' - _TASKREQUEST.fields_by_name['task_type']._options = None - _TASKREQUEST.fields_by_name['task_type']._serialized_options = b'\222?\002\010\014' - _TASKREQUEST.fields_by_name['target_uid']._options = None - _TASKREQUEST.fields_by_name['target_uid']._serialized_options = b'\222?\002\010 ' - _TASKREQUEST.fields_by_name['assignee_uid']._options = None - _TASKREQUEST.fields_by_name['assignee_uid']._serialized_options = b'\222?\002\010 ' - _TASKREQUEST.fields_by_name['note']._options = None - _TASKREQUEST.fields_by_name['note']._serialized_options = b'\222?\002\0100' - _TAKTALKROOMDATA.fields_by_name['sender_callsign']._options = None - _TAKTALKROOMDATA.fields_by_name['sender_callsign']._serialized_options = b'\030\001' - _TAKPACKETV2.fields_by_name['callsign']._options = None - _TAKPACKETV2.fields_by_name['callsign']._serialized_options = b'\222?\002\010x' - _TAKPACKETV2.fields_by_name['course']._options = None - _TAKPACKETV2.fields_by_name['course']._serialized_options = b'\222?\0028\020' - _TAKPACKETV2.fields_by_name['battery']._options = None - _TAKPACKETV2.fields_by_name['battery']._serialized_options = b'\222?\0028\010' - _TAKPACKETV2.fields_by_name['uid']._options = None - _TAKPACKETV2.fields_by_name['uid']._serialized_options = b'\222?\002\0100' - _TAKPACKETV2.fields_by_name['device_callsign']._options = None - _TAKPACKETV2.fields_by_name['device_callsign']._serialized_options = b'\222?\002\010x' - _TAKPACKETV2.fields_by_name['stale_seconds']._options = None - _TAKPACKETV2.fields_by_name['stale_seconds']._serialized_options = b'\222?\0028\020' - _TAKPACKETV2.fields_by_name['tak_version']._options = None - _TAKPACKETV2.fields_by_name['tak_version']._serialized_options = b'\222?\002\010@' - _TAKPACKETV2.fields_by_name['tak_device']._options = None - _TAKPACKETV2.fields_by_name['tak_device']._serialized_options = b'\222?\002\010 ' - _TAKPACKETV2.fields_by_name['tak_platform']._options = None - _TAKPACKETV2.fields_by_name['tak_platform']._serialized_options = b'\222?\002\010 ' - _TAKPACKETV2.fields_by_name['tak_os']._options = None - _TAKPACKETV2.fields_by_name['tak_os']._serialized_options = b'\222?\002\010\020' - _TAKPACKETV2.fields_by_name['endpoint']._options = None - _TAKPACKETV2.fields_by_name['endpoint']._serialized_options = b'\222?\002\010 ' - _TAKPACKETV2.fields_by_name['phone']._options = None - _TAKPACKETV2.fields_by_name['phone']._serialized_options = b'\222?\002\010\024' - _TAKPACKETV2.fields_by_name['cot_type_str']._options = None - _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=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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_TEAM'].values_by_name["Unspecifed_Color"]._options = None + _globals['_TEAM'].values_by_name["Unspecifed_Color"]._serialized_options = b'\312\363\030\020:\016Default (Cyan)' + _globals['_TEAM'].values_by_name["White"]._options = None + _globals['_TEAM'].values_by_name["White"]._serialized_options = b'\312\363\030\007:\005White' + _globals['_TEAM'].values_by_name["Yellow"]._options = None + _globals['_TEAM'].values_by_name["Yellow"]._serialized_options = b'\312\363\030\010:\006Yellow' + _globals['_TEAM'].values_by_name["Orange"]._options = None + _globals['_TEAM'].values_by_name["Orange"]._serialized_options = b'\312\363\030\010:\006Orange' + _globals['_TEAM'].values_by_name["Magenta"]._options = None + _globals['_TEAM'].values_by_name["Magenta"]._serialized_options = b'\312\363\030\t:\007Magenta' + _globals['_TEAM'].values_by_name["Red"]._options = None + _globals['_TEAM'].values_by_name["Red"]._serialized_options = b'\312\363\030\005:\003Red' + _globals['_TEAM'].values_by_name["Maroon"]._options = None + _globals['_TEAM'].values_by_name["Maroon"]._serialized_options = b'\312\363\030\010:\006Maroon' + _globals['_TEAM'].values_by_name["Purple"]._options = None + _globals['_TEAM'].values_by_name["Purple"]._serialized_options = b'\312\363\030\010:\006Purple' + _globals['_TEAM'].values_by_name["Dark_Blue"]._options = None + _globals['_TEAM'].values_by_name["Dark_Blue"]._serialized_options = b'\312\363\030\013:\tDark Blue' + _globals['_TEAM'].values_by_name["Blue"]._options = None + _globals['_TEAM'].values_by_name["Blue"]._serialized_options = b'\312\363\030\006:\004Blue' + _globals['_TEAM'].values_by_name["Cyan"]._options = None + _globals['_TEAM'].values_by_name["Cyan"]._serialized_options = b'\312\363\030\006:\004Cyan' + _globals['_TEAM'].values_by_name["Teal"]._options = None + _globals['_TEAM'].values_by_name["Teal"]._serialized_options = b'\312\363\030\006:\004Teal' + _globals['_TEAM'].values_by_name["Green"]._options = None + _globals['_TEAM'].values_by_name["Green"]._serialized_options = b'\312\363\030\007:\005Green' + _globals['_TEAM'].values_by_name["Dark_Green"]._options = None + _globals['_TEAM'].values_by_name["Dark_Green"]._serialized_options = b'\312\363\030\014:\nDark Green' + _globals['_TEAM'].values_by_name["Brown"]._options = None + _globals['_TEAM'].values_by_name["Brown"]._serialized_options = b'\312\363\030\007:\005Brown' + _globals['_MEMBERROLE'].values_by_name["Unspecifed"]._options = None + _globals['_MEMBERROLE'].values_by_name["Unspecifed"]._serialized_options = b'\312\363\030\027:\025Default (Team Member)' + _globals['_MEMBERROLE'].values_by_name["TeamMember"]._options = None + _globals['_MEMBERROLE'].values_by_name["TeamMember"]._serialized_options = b'\312\363\030\r:\013Team Member' + _globals['_MEMBERROLE'].values_by_name["TeamLead"]._options = None + _globals['_MEMBERROLE'].values_by_name["TeamLead"]._serialized_options = b'\312\363\030\013:\tTeam Lead' + _globals['_MEMBERROLE'].values_by_name["HQ"]._options = None + _globals['_MEMBERROLE'].values_by_name["HQ"]._serialized_options = b'\312\363\030\004:\002HQ' + _globals['_MEMBERROLE'].values_by_name["Sniper"]._options = None + _globals['_MEMBERROLE'].values_by_name["Sniper"]._serialized_options = b'\312\363\030\010:\006Sniper' + _globals['_MEMBERROLE'].values_by_name["Medic"]._options = None + _globals['_MEMBERROLE'].values_by_name["Medic"]._serialized_options = b'\312\363\030\007:\005Medic' + _globals['_MEMBERROLE'].values_by_name["ForwardObserver"]._options = None + _globals['_MEMBERROLE'].values_by_name["ForwardObserver"]._serialized_options = b'\312\363\030\022:\020Forward Observer' + _globals['_MEMBERROLE'].values_by_name["RTO"]._options = None + _globals['_MEMBERROLE'].values_by_name["RTO"]._serialized_options = b'\312\363\030\005:\003RTO' + _globals['_MEMBERROLE'].values_by_name["K9"]._options = None + _globals['_MEMBERROLE'].values_by_name["K9"]._serialized_options = b'\312\363\030\004:\002K9' + _globals['_GEOCHAT'].fields_by_name['message']._options = None + _globals['_GEOCHAT'].fields_by_name['message']._serialized_options = b'\222?\003\010\310\001' + _globals['_GEOCHAT'].fields_by_name['to']._options = None + _globals['_GEOCHAT'].fields_by_name['to']._serialized_options = b'\222?\002\010x' + _globals['_GEOCHAT'].fields_by_name['to_callsign']._options = None + _globals['_GEOCHAT'].fields_by_name['to_callsign']._serialized_options = b'\222?\002\010x' + _globals['_GEOCHAT'].fields_by_name['receipt_for_uid']._options = None + _globals['_GEOCHAT'].fields_by_name['receipt_for_uid']._serialized_options = b'\222?\002\0100' + _globals['_AIRCRAFTTRACK'].fields_by_name['icao']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['icao']._serialized_options = b'\222?\002\010\010' + _globals['_AIRCRAFTTRACK'].fields_by_name['registration']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['registration']._serialized_options = b'\222?\002\010\020' + _globals['_AIRCRAFTTRACK'].fields_by_name['flight']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['flight']._serialized_options = b'\222?\002\010\020' + _globals['_AIRCRAFTTRACK'].fields_by_name['aircraft_type']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['aircraft_type']._serialized_options = b'\222?\002\010\010' + _globals['_AIRCRAFTTRACK'].fields_by_name['squawk']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['squawk']._serialized_options = b'\222?\0028\020' + _globals['_AIRCRAFTTRACK'].fields_by_name['category']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['category']._serialized_options = b'\222?\002\010\004' + _globals['_AIRCRAFTTRACK'].fields_by_name['cot_host_id']._options = None + _globals['_AIRCRAFTTRACK'].fields_by_name['cot_host_id']._serialized_options = b'\222?\002\010@' + _globals['_COTGEOPOINT'].fields_by_name['lat_delta_i']._options = None + _globals['_COTGEOPOINT'].fields_by_name['lat_delta_i']._serialized_options = b'\222?\0028 ' + _globals['_COTGEOPOINT'].fields_by_name['lon_delta_i']._options = None + _globals['_COTGEOPOINT'].fields_by_name['lon_delta_i']._serialized_options = b'\222?\0028 ' + _globals['_DRAWNSHAPE'].fields_by_name['major_cm']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['major_cm']._serialized_options = b'\222?\0028 ' + _globals['_DRAWNSHAPE'].fields_by_name['minor_cm']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['minor_cm']._serialized_options = b'\222?\0028 ' + _globals['_DRAWNSHAPE'].fields_by_name['angle_deg']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['angle_deg']._serialized_options = b'\222?\0028\020' + _globals['_DRAWNSHAPE'].fields_by_name['stroke_weight_x10']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' + _globals['_DRAWNSHAPE'].fields_by_name['vertex_lat_deltas']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['vertex_lat_deltas']._serialized_options = b'\222?\004\020 8 ' + _globals['_DRAWNSHAPE'].fields_by_name['vertex_lon_deltas']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['vertex_lon_deltas']._serialized_options = b'\222?\004\020 8 ' + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_distance_dm']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_distance_dm']._serialized_options = b'\222?\0028 ' + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_bearing_ref']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_bearing_ref']._serialized_options = b'\222?\0028\010' + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_flags']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_flags']._serialized_options = b'\222?\0028\010' + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_uid_ref']._options = None + _globals['_DRAWNSHAPE'].fields_by_name['bullseye_uid_ref']._serialized_options = b'\222?\002\0100' + _globals['_MARKER'].fields_by_name['parent_uid']._options = None + _globals['_MARKER'].fields_by_name['parent_uid']._serialized_options = b'\222?\002\0100' + _globals['_MARKER'].fields_by_name['parent_type']._options = None + _globals['_MARKER'].fields_by_name['parent_type']._serialized_options = b'\222?\002\010\030' + _globals['_MARKER'].fields_by_name['parent_callsign']._options = None + _globals['_MARKER'].fields_by_name['parent_callsign']._serialized_options = b'\222?\002\010\030' + _globals['_MARKER'].fields_by_name['iconset']._options = None + _globals['_MARKER'].fields_by_name['iconset']._serialized_options = b'\222?\002\010P' + _globals['_RANGEANDBEARING'].fields_by_name['anchor_uid']._options = None + _globals['_RANGEANDBEARING'].fields_by_name['anchor_uid']._serialized_options = b'\222?\002\0100' + _globals['_RANGEANDBEARING'].fields_by_name['range_cm']._options = None + _globals['_RANGEANDBEARING'].fields_by_name['range_cm']._serialized_options = b'\222?\0028 ' + _globals['_RANGEANDBEARING'].fields_by_name['bearing_cdeg']._options = None + _globals['_RANGEANDBEARING'].fields_by_name['bearing_cdeg']._serialized_options = b'\222?\0028\020' + _globals['_RANGEANDBEARING'].fields_by_name['stroke_weight_x10']._options = None + _globals['_RANGEANDBEARING'].fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' + _globals['_ROUTE_LINK'].fields_by_name['uid']._options = None + _globals['_ROUTE_LINK'].fields_by_name['uid']._serialized_options = b'\222?\002\0100' + _globals['_ROUTE_LINK'].fields_by_name['callsign']._options = None + _globals['_ROUTE_LINK'].fields_by_name['callsign']._serialized_options = b'\222?\002\010\020' + _globals['_ROUTE_LINK'].fields_by_name['link_type']._options = None + _globals['_ROUTE_LINK'].fields_by_name['link_type']._serialized_options = b'\222?\0028\010' + _globals['_ROUTE'].fields_by_name['prefix']._options = None + _globals['_ROUTE'].fields_by_name['prefix']._serialized_options = b'\222?\002\010\010' + _globals['_ROUTE'].fields_by_name['stroke_weight_x10']._options = None + _globals['_ROUTE'].fields_by_name['stroke_weight_x10']._serialized_options = b'\222?\0028\020' + _globals['_ROUTE'].fields_by_name['links']._options = None + _globals['_ROUTE'].fields_by_name['links']._serialized_options = b'\222?\002\020\020' + _globals['_CASEVACREPORT'].fields_by_name['equipment_flags']._options = None + _globals['_CASEVACREPORT'].fields_by_name['equipment_flags']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['litter_patients']._options = None + _globals['_CASEVACREPORT'].fields_by_name['litter_patients']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['ambulatory_patients']._options = None + _globals['_CASEVACREPORT'].fields_by_name['ambulatory_patients']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['zone_marker']._options = None + _globals['_CASEVACREPORT'].fields_by_name['zone_marker']._serialized_options = b'\222?\002\010\020' + _globals['_CASEVACREPORT'].fields_by_name['us_military']._options = None + _globals['_CASEVACREPORT'].fields_by_name['us_military']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['us_civilian']._options = None + _globals['_CASEVACREPORT'].fields_by_name['us_civilian']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['non_us_military']._options = None + _globals['_CASEVACREPORT'].fields_by_name['non_us_military']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['non_us_civilian']._options = None + _globals['_CASEVACREPORT'].fields_by_name['non_us_civilian']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['epw']._options = None + _globals['_CASEVACREPORT'].fields_by_name['epw']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['child']._options = None + _globals['_CASEVACREPORT'].fields_by_name['child']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['terrain_flags']._options = None + _globals['_CASEVACREPORT'].fields_by_name['terrain_flags']._serialized_options = b'\222?\0028\010' + _globals['_CASEVACREPORT'].fields_by_name['frequency']._options = None + _globals['_CASEVACREPORT'].fields_by_name['frequency']._serialized_options = b'\222?\002\010\020' + _globals['_EMERGENCYALERT'].fields_by_name['authoring_uid']._options = None + _globals['_EMERGENCYALERT'].fields_by_name['authoring_uid']._serialized_options = b'\222?\002\0100' + _globals['_EMERGENCYALERT'].fields_by_name['cancel_reference_uid']._options = None + _globals['_EMERGENCYALERT'].fields_by_name['cancel_reference_uid']._serialized_options = b'\222?\002\0100' + _globals['_TASKREQUEST'].fields_by_name['task_type']._options = None + _globals['_TASKREQUEST'].fields_by_name['task_type']._serialized_options = b'\222?\002\010\014' + _globals['_TASKREQUEST'].fields_by_name['target_uid']._options = None + _globals['_TASKREQUEST'].fields_by_name['target_uid']._serialized_options = b'\222?\002\0100' + _globals['_TASKREQUEST'].fields_by_name['assignee_uid']._options = None + _globals['_TASKREQUEST'].fields_by_name['assignee_uid']._serialized_options = b'\222?\002\0100' + _globals['_TASKREQUEST'].fields_by_name['note']._options = None + _globals['_TASKREQUEST'].fields_by_name['note']._serialized_options = b'\222?\002\0100' + _globals['_TAKTALKROOMDATA'].fields_by_name['sender_callsign']._options = None + _globals['_TAKTALKROOMDATA'].fields_by_name['sender_callsign']._serialized_options = b'\030\001' + _globals['_TAKPACKET'].fields_by_name['callsign']._options = None + _globals['_TAKPACKET'].fields_by_name['callsign']._serialized_options = b'\222?\002\010x' + _globals['_TAKPACKET'].fields_by_name['course']._options = None + _globals['_TAKPACKET'].fields_by_name['course']._serialized_options = b'\222?\0028\020' + _globals['_TAKPACKET'].fields_by_name['battery']._options = None + _globals['_TAKPACKET'].fields_by_name['battery']._serialized_options = b'\222?\0028\010' + _globals['_TAKPACKET'].fields_by_name['uid']._options = None + _globals['_TAKPACKET'].fields_by_name['uid']._serialized_options = b'\222?\002\0100' + _globals['_TAKPACKET'].fields_by_name['device_callsign']._options = None + _globals['_TAKPACKET'].fields_by_name['device_callsign']._serialized_options = b'\222?\002\010x' + _globals['_TAKPACKET'].fields_by_name['stale_seconds']._options = None + _globals['_TAKPACKET'].fields_by_name['stale_seconds']._serialized_options = b'\222?\0028\020' + _globals['_TAKPACKET'].fields_by_name['tak_version']._options = None + _globals['_TAKPACKET'].fields_by_name['tak_version']._serialized_options = b'\222?\002\010@' + _globals['_TAKPACKET'].fields_by_name['tak_device']._options = None + _globals['_TAKPACKET'].fields_by_name['tak_device']._serialized_options = b'\222?\002\010 ' + _globals['_TAKPACKET'].fields_by_name['tak_platform']._options = None + _globals['_TAKPACKET'].fields_by_name['tak_platform']._serialized_options = b'\222?\002\010 ' + _globals['_TAKPACKET'].fields_by_name['tak_os']._options = None + _globals['_TAKPACKET'].fields_by_name['tak_os']._serialized_options = b'\222?\002\010\020' + _globals['_TAKPACKET'].fields_by_name['endpoint']._options = None + _globals['_TAKPACKET'].fields_by_name['endpoint']._serialized_options = b'\222?\002\010 ' + _globals['_TAKPACKET'].fields_by_name['phone']._options = None + _globals['_TAKPACKET'].fields_by_name['phone']._serialized_options = b'\222?\002\010\024' + _globals['_TAKPACKET'].fields_by_name['cot_type_str']._options = None + _globals['_TAKPACKET'].fields_by_name['cot_type_str']._serialized_options = b'\222?\002\010 ' + _globals['_TAKPACKET'].fields_by_name['raw_detail']._options = None + _globals['_TAKPACKET'].fields_by_name['raw_detail']._serialized_options = b'\222?\003\010\334\001' + _globals['_TEAM']._serialized_start=8320 + _globals['_TEAM']._serialized_end=8726 + _globals['_MEMBERROLE']._serialized_start=8729 + _globals['_MEMBERROLE']._serialized_end=9003 + _globals['_COTHOW']._serialized_start=9006 + _globals['_COTHOW']._serialized_end=9156 + _globals['_COTTYPE']._serialized_start=9159 + _globals['_COTTYPE']._serialized_end=12106 + _globals['_GEOPOINTSOURCE']._serialized_start=12108 + _globals['_GEOPOINTSOURCE']._serialized_end=12233 + _globals['_GEOCHAT']._serialized_start=132 + _globals['_GEOCHAT']._serialized_end=542 + _globals['_GEOCHAT_RECEIPTTYPE']._serialized_start=393 + _globals['_GEOCHAT_RECEIPTTYPE']._serialized_end=477 + _globals['_AIRCRAFTTRACK']._serialized_start=545 + _globals['_AIRCRAFTTRACK']._serialized_end=770 + _globals['_COTGEOPOINT']._serialized_start=772 + _globals['_COTGEOPOINT']._serialized_end=841 + _globals['_DRAWNSHAPE']._serialized_start=844 + _globals['_DRAWNSHAPE']._serialized_end=1956 + _globals['_DRAWNSHAPE_KIND']._serialized_start=1463 + _globals['_DRAWNSHAPE_KIND']._serialized_end=1689 + _globals['_DRAWNSHAPE_STYLEMODE']._serialized_start=1691 + _globals['_DRAWNSHAPE_STYLEMODE']._serialized_end=1808 + _globals['_DRAWNSHAPE_BULLSEYEFLAGS']._serialized_start=1811 + _globals['_DRAWNSHAPE_BULLSEYEFLAGS']._serialized_end=1956 + _globals['_MARKER']._serialized_start=1959 + _globals['_MARKER']._serialized_end=2490 + _globals['_MARKER_KIND']._serialized_start=2210 + _globals['_MARKER_KIND']._serialized_end=2490 + _globals['_RANGEANDBEARING']._serialized_start=2493 + _globals['_RANGEANDBEARING']._serialized_end=2745 + _globals['_ROUTE']._serialized_start=2748 + _globals['_ROUTE']._serialized_end=3342 + _globals['_ROUTE_LINK']._serialized_start=2996 + _globals['_ROUTE_LINK']._serialized_end=3122 + _globals['_ROUTE_METHOD']._serialized_start=3125 + _globals['_ROUTE_METHOD']._serialized_end=3260 + _globals['_ROUTE_DIRECTION']._serialized_start=3262 + _globals['_ROUTE_DIRECTION']._serialized_end=3342 + _globals['_CASEVACREPORT']._serialized_start=3345 + _globals['_CASEVACREPORT']._serialized_end=5134 + _globals['_CASEVACREPORT_PRECEDENCE']._serialized_start=4353 + _globals['_CASEVACREPORT_PRECEDENCE']._serialized_end=4524 + _globals['_CASEVACREPORT_HLZMARKING']._serialized_start=4527 + _globals['_CASEVACREPORT_HLZMARKING']._serialized_end=4682 + _globals['_CASEVACREPORT_SECURITY']._serialized_start=4685 + _globals['_CASEVACREPORT_SECURITY']._serialized_end=4831 + _globals['_CASEVACREPORT_EQUIPMENTFLAGS']._serialized_start=4834 + _globals['_CASEVACREPORT_EQUIPMENTFLAGS']._serialized_end=4985 + _globals['_CASEVACREPORT_TERRAINFLAGS']._serialized_start=4988 + _globals['_CASEVACREPORT_TERRAINFLAGS']._serialized_end=5134 + _globals['_ZMISTENTRY']._serialized_start=5136 + _globals['_ZMISTENTRY']._serialized_end=5218 + _globals['_EMERGENCYALERT']._serialized_start=5221 + _globals['_EMERGENCYALERT']._serialized_end=5513 + _globals['_EMERGENCYALERT_TYPE']._serialized_start=5363 + _globals['_EMERGENCYALERT_TYPE']._serialized_end=5513 + _globals['_TASKREQUEST']._serialized_start=5516 + _globals['_TASKREQUEST']._serialized_end=6016 + _globals['_TASKREQUEST_PRIORITY']._serialized_start=5752 + _globals['_TASKREQUEST_PRIORITY']._serialized_end=5869 + _globals['_TASKREQUEST_STATUS']._serialized_start=5872 + _globals['_TASKREQUEST_STATUS']._serialized_end=6016 + _globals['_TAKENVIRONMENT']._serialized_start=6018 + _globals['_TAKENVIRONMENT']._serialized_end=6116 + _globals['_SENSORFOV']._serialized_start=6119 + _globals['_SENSORFOV']._serialized_end=6525 + _globals['_SENSORFOV_SENSORTYPE']._serialized_start=6343 + _globals['_SENSORFOV_SENSORTYPE']._serialized_end=6513 + _globals['_TAKTALKMESSAGE']._serialized_start=6527 + _globals['_TAKTALKMESSAGE']._serialized_end=6612 + _globals['_TAKTALKROOMDATA']._serialized_start=6614 + _globals['_TAKTALKROOMDATA']._serialized_end=6718 + _globals['_MARTI']._serialized_start=6720 + _globals['_MARTI']._serialized_end=6750 + _globals['_TAKPACKET']._serialized_start=6753 + _globals['_TAKPACKET']._serialized_end=8317 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/atak_pb2.pyi b/meshtastic/protobuf/atak_pb2.pyi index 75f72bb87..1f999e02d 100644 --- a/meshtastic/protobuf/atak_pb2.pyi +++ b/meshtastic/protobuf/atak_pb2.pyi @@ -3,28 +3,33 @@ isort:skip_file trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH)""" -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 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 13): + from warnings import deprecated as _deprecated +else: + from typing_extensions import deprecated as _deprecated + +DESCRIPTOR: _descriptor.FileDescriptor class _Team: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _TeamEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Team.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _TeamEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Team.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Unspecifed_Color: _Team.ValueType # 0 """ Unspecifed @@ -148,14 +153,14 @@ Brown: Team.ValueType # 14 """ Brown """ -global___Team = Team +Global___Team: _TypeAlias = Team # noqa: Y015 class _MemberRole: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _MemberRoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MemberRole.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _MemberRoleEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_MemberRole.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Unspecifed: _MemberRole.ValueType # 0 """ Unspecifed @@ -234,14 +239,14 @@ K9: MemberRole.ValueType # 8 """ Doggo """ -global___MemberRole = MemberRole +Global___MemberRole: _TypeAlias = MemberRole # noqa: Y015 class _CotHow: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _CotHowEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CotHow.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _CotHowEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_CotHow.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor CotHow_Unspecified: _CotHow.ValueType # 0 """ Unspecified @@ -313,14 +318,14 @@ CotHow_m_s: CotHow.ValueType # 7 """ Machine simulated """ -global___CotHow = CotHow +Global___CotHow: _TypeAlias = CotHow # noqa: Y015 class _CotType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _CotTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CotType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _CotTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_CotType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor CotType_Other: _CotType.ValueType # 0 """ Unknown or unmapped type, use cot_type_str @@ -664,12 +669,12 @@ class _CotTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy u-d-f-m: Freehand telestration / annotation. Anchor at event point, - geometry carried via DrawnShape.vertices. May be truncated to + geometry carried via the DrawnShape vertex columns. May be truncated to MAX_VERTICES by the sender. """ CotType_u_d_p: _CotType.ValueType # 77 """ - u-d-p: Closed polygon. Geometry carried via DrawnShape.vertices, + u-d-p: Closed polygon. Geometry carried via the DrawnShape vertex columns, implicitly closed (receiver duplicates first vertex as needed). """ CotType_b_m_p_s_m: _CotType.ValueType # 78 @@ -1177,12 +1182,12 @@ CotType_u_d_f_m: CotType.ValueType # 76 u-d-f-m: Freehand telestration / annotation. Anchor at event point, -geometry carried via DrawnShape.vertices. May be truncated to +geometry carried via the DrawnShape vertex columns. May be truncated to MAX_VERTICES by the sender. """ CotType_u_d_p: CotType.ValueType # 77 """ -u-d-p: Closed polygon. Geometry carried via DrawnShape.vertices, +u-d-p: Closed polygon. Geometry carried via the DrawnShape vertex columns, implicitly closed (receiver duplicates first vertex as needed). """ CotType_b_m_p_s_m: CotType.ValueType # 78 @@ -1339,14 +1344,14 @@ 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. """ -global___CotType = CotType +Global___CotType: _TypeAlias = CotType # noqa: Y015 class _GeoPointSource: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _GeoPointSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_GeoPointSource.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _GeoPointSourceEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_GeoPointSource.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor GeoPointSource_Unspecified: _GeoPointSource.ValueType # 0 """ Unspecified @@ -1385,93 +1390,22 @@ GeoPointSource_NETWORK: GeoPointSource.ValueType # 3 """ Network/external """ -global___GeoPointSource = GeoPointSource - -@typing.final -class TAKPacket(google.protobuf.message.Message): - """ - Packets for the official ATAK Plugin - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - IS_COMPRESSED_FIELD_NUMBER: builtins.int - CONTACT_FIELD_NUMBER: builtins.int - GROUP_FIELD_NUMBER: builtins.int - STATUS_FIELD_NUMBER: builtins.int - PLI_FIELD_NUMBER: builtins.int - CHAT_FIELD_NUMBER: builtins.int - DETAIL_FIELD_NUMBER: builtins.int - is_compressed: builtins.bool - """ - Are the payloads strings compressed for LoRA transport? - """ - detail: builtins.bytes - """ - Generic CoT detail XML - May be compressed / truncated by the sender (EUD) - """ - @property - def contact(self) -> global___Contact: - """ - The contact / callsign for ATAK user - """ - - @property - def group(self) -> global___Group: - """ - The group for ATAK user - """ - - @property - def status(self) -> global___Status: - """ - The status of the ATAK EUD - """ - - @property - def pli(self) -> global___PLI: - """ - TAK position report - """ - - @property - def chat(self) -> global___GeoChat: - """ - ATAK GeoChat message - """ - - def __init__( - self, - *, - is_compressed: builtins.bool = ..., - contact: global___Contact | None = ..., - group: global___Group | None = ..., - status: global___Status | None = ..., - pli: global___PLI | None = ..., - chat: global___GeoChat | None = ..., - detail: builtins.bytes = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["chat", b"chat", "contact", b"contact", "detail", b"detail", "group", b"group", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["chat", b"chat", "contact", b"contact", "detail", b"detail", "group", b"group", "is_compressed", b"is_compressed", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["pli", "chat", "detail"] | None: ... - -global___TAKPacket = TAKPacket +Global___GeoPointSource: _TypeAlias = GeoPointSource # noqa: Y015 -@typing.final -class GeoChat(google.protobuf.message.Message): +@_typing.final +class GeoChat(_message.Message): """ ATAK GeoChat message """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _ReceiptType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _ReceiptTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[GeoChat._ReceiptType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _ReceiptTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[GeoChat._ReceiptType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor ReceiptType_None: GeoChat._ReceiptType.ValueType # 0 """normal chat message""" ReceiptType_Delivered: GeoChat._ReceiptType.ValueType # 1 @@ -1496,39 +1430,39 @@ class GeoChat(google.protobuf.message.Message): ReceiptType_Read: GeoChat.ReceiptType.ValueType # 2 """b-t-f-r read receipt""" - MESSAGE_FIELD_NUMBER: builtins.int - TO_FIELD_NUMBER: builtins.int - TO_CALLSIGN_FIELD_NUMBER: builtins.int - RECEIPT_FOR_UID_FIELD_NUMBER: builtins.int - RECEIPT_TYPE_FIELD_NUMBER: builtins.int - LANG_FIELD_NUMBER: builtins.int - ROOM_ID_FIELD_NUMBER: builtins.int - VOICE_PROFILE_ID_FIELD_NUMBER: builtins.int - message: builtins.str + MESSAGE_FIELD_NUMBER: _builtins.int + TO_FIELD_NUMBER: _builtins.int + TO_CALLSIGN_FIELD_NUMBER: _builtins.int + RECEIPT_FOR_UID_FIELD_NUMBER: _builtins.int + RECEIPT_TYPE_FIELD_NUMBER: _builtins.int + LANG_FIELD_NUMBER: _builtins.int + ROOM_ID_FIELD_NUMBER: _builtins.int + VOICE_PROFILE_ID_FIELD_NUMBER: _builtins.int + message: _builtins.str """ The text message. Empty for receipts. """ - to: builtins.str + to: _builtins.str """ Uid recipient of the message """ - to_callsign: builtins.str + to_callsign: _builtins.str """ Callsign of the recipient for the message """ - receipt_for_uid: builtins.str + receipt_for_uid: _builtins.str """ UID of the chat message this event is acknowledging. Empty for a normal chat message; set for delivered / read receipts. Paired with receipt_type so receivers can match the ack back to the original outbound GeoChat by its event uid. """ - receipt_type: global___GeoChat.ReceiptType.ValueType + receipt_type: Global___GeoChat.ReceiptType.ValueType """ Receipt kind discriminator. See ReceiptType doc. Default ReceiptType_None means this is a regular chat message, not a receipt. """ - lang: builtins.str + lang: _builtins.str """ --- TAKTALK-flavored b-t-f extensions --- @@ -1548,13 +1482,13 @@ class GeoChat(google.protobuf.message.Message): BCP-47-ish language tag or human-readable name (e.g. "en", "English") that the originator's TAKTALK plugin recorded for the message. """ - room_id: builtins.str + room_id: _builtins.str """ TAKTALK chatroom UUID (e.g. "30b2755c-c547-44ef-a0cc-cdbd8a15616f") that the receiver's TAKTALK plugin uses to thread the message under the right room. Resolved to a friendly name via TakTalkRoomData broadcasts. """ - voice_profile_id: builtins.str + voice_profile_id: _builtins.str """ TAKTALK voice profile pointer. Often empty in practice (the empty marker `` still signals TAKTALK origination), so @@ -1564,242 +1498,128 @@ class GeoChat(google.protobuf.message.Message): def __init__( self, *, - message: builtins.str = ..., - to: builtins.str | None = ..., - to_callsign: builtins.str | None = ..., - receipt_for_uid: builtins.str = ..., - receipt_type: global___GeoChat.ReceiptType.ValueType = ..., - lang: builtins.str | None = ..., - room_id: builtins.str | None = ..., - voice_profile_id: builtins.str | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_lang", b"_lang", "_room_id", b"_room_id", "_to", b"_to", "_to_callsign", b"_to_callsign", "_voice_profile_id", b"_voice_profile_id", "lang", b"lang", "room_id", b"room_id", "to", b"to", "to_callsign", b"to_callsign", "voice_profile_id", b"voice_profile_id"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_lang", b"_lang", "_room_id", b"_room_id", "_to", b"_to", "_to_callsign", b"_to_callsign", "_voice_profile_id", b"_voice_profile_id", "lang", b"lang", "message", b"message", "receipt_for_uid", b"receipt_for_uid", "receipt_type", b"receipt_type", "room_id", b"room_id", "to", b"to", "to_callsign", b"to_callsign", "voice_profile_id", b"voice_profile_id"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_lang", b"_lang"]) -> typing.Literal["lang"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_room_id", b"_room_id"]) -> typing.Literal["room_id"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_to", b"_to"]) -> typing.Literal["to"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_to_callsign", b"_to_callsign"]) -> typing.Literal["to_callsign"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_voice_profile_id", b"_voice_profile_id"]) -> typing.Literal["voice_profile_id"] | None: ... - -global___GeoChat = GeoChat - -@typing.final -class Group(google.protobuf.message.Message): - """ - ATAK Group - <__group role='Team Member' name='Cyan'/> - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ROLE_FIELD_NUMBER: builtins.int - TEAM_FIELD_NUMBER: builtins.int - role: global___MemberRole.ValueType - """ - Role of the group member - """ - team: global___Team.ValueType - """ - Team (color) - Default Cyan - """ - def __init__( - self, - *, - role: global___MemberRole.ValueType = ..., - team: global___Team.ValueType = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["role", b"role", "team", b"team"]) -> None: ... - -global___Group = Group - -@typing.final -class Status(google.protobuf.message.Message): - """ - ATAK EUD Status - - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - BATTERY_FIELD_NUMBER: builtins.int - battery: builtins.int - """ - Battery level - """ - def __init__( - self, - *, - battery: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["battery", b"battery"]) -> None: ... - -global___Status = Status - -@typing.final -class Contact(google.protobuf.message.Message): - """ - ATAK Contact - - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - CALLSIGN_FIELD_NUMBER: builtins.int - DEVICE_CALLSIGN_FIELD_NUMBER: builtins.int - callsign: builtins.str - """ - Callsign - """ - device_callsign: builtins.str - """ - Device callsign - - IP address of endpoint in integer form (0.0.0.0 default) - """ - def __init__( - self, - *, - callsign: builtins.str = ..., - device_callsign: builtins.str = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["callsign", b"callsign", "device_callsign", b"device_callsign"]) -> None: ... - -global___Contact = Contact - -@typing.final -class PLI(google.protobuf.message.Message): - """ - Position Location Information from ATAK - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - ALTITUDE_FIELD_NUMBER: builtins.int - SPEED_FIELD_NUMBER: builtins.int - COURSE_FIELD_NUMBER: builtins.int - latitude_i: builtins.int - """ - The new preferred location encoding, multiply by 1e-7 to get degrees - in floating point - """ - longitude_i: builtins.int - """ - The new preferred location encoding, multiply by 1e-7 to get degrees - in floating point - """ - altitude: builtins.int - """ - Altitude (ATAK prefers HAE) - """ - speed: builtins.int - """ - Speed - """ - course: builtins.int - """ - Course in degrees - """ - def __init__( - self, - *, - latitude_i: builtins.int = ..., - longitude_i: builtins.int = ..., - altitude: builtins.int = ..., - speed: builtins.int = ..., - course: builtins.int = ..., + message: _builtins.str = ..., + to: _builtins.str | None = ..., + to_callsign: _builtins.str | None = ..., + receipt_for_uid: _builtins.str = ..., + receipt_type: Global___GeoChat.ReceiptType.ValueType = ..., + lang: _builtins.str | None = ..., + room_id: _builtins.str | None = ..., + voice_profile_id: _builtins.str | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "course", b"course", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "speed", b"speed"]) -> None: ... - -global___PLI = PLI - -@typing.final -class AircraftTrack(google.protobuf.message.Message): + _HasFieldArgType: _TypeAlias = _typing.Literal["_lang", b"_lang", "_room_id", b"_room_id", "_to", b"_to", "_to_callsign", b"_to_callsign", "_voice_profile_id", b"_voice_profile_id", "lang", b"lang", "room_id", b"room_id", "to", b"to", "to_callsign", b"to_callsign", "voice_profile_id", b"voice_profile_id"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_lang", b"_lang", "_room_id", b"_room_id", "_to", b"_to", "_to_callsign", b"_to_callsign", "_voice_profile_id", b"_voice_profile_id", "lang", b"lang", "message", b"message", "receipt_for_uid", b"receipt_for_uid", "receipt_type", b"receipt_type", "room_id", b"room_id", "to", b"to", "to_callsign", b"to_callsign", "voice_profile_id", b"voice_profile_id"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__lang: _TypeAlias = _typing.Literal["lang"] # noqa: Y015 + _WhichOneofArgType__lang: _TypeAlias = _typing.Literal["_lang", b"_lang"] # noqa: Y015 + _WhichOneofReturnType__room_id: _TypeAlias = _typing.Literal["room_id"] # noqa: Y015 + _WhichOneofArgType__room_id: _TypeAlias = _typing.Literal["_room_id", b"_room_id"] # noqa: Y015 + _WhichOneofReturnType__to: _TypeAlias = _typing.Literal["to"] # noqa: Y015 + _WhichOneofArgType__to: _TypeAlias = _typing.Literal["_to", b"_to"] # noqa: Y015 + _WhichOneofReturnType__to_callsign: _TypeAlias = _typing.Literal["to_callsign"] # noqa: Y015 + _WhichOneofArgType__to_callsign: _TypeAlias = _typing.Literal["_to_callsign", b"_to_callsign"] # noqa: Y015 + _WhichOneofReturnType__voice_profile_id: _TypeAlias = _typing.Literal["voice_profile_id"] # noqa: Y015 + _WhichOneofArgType__voice_profile_id: _TypeAlias = _typing.Literal["_voice_profile_id", b"_voice_profile_id"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__lang) -> _WhichOneofReturnType__lang | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__room_id) -> _WhichOneofReturnType__room_id | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__to) -> _WhichOneofReturnType__to | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__to_callsign) -> _WhichOneofReturnType__to_callsign | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voice_profile_id) -> _WhichOneofReturnType__voice_profile_id | None: ... + +Global___GeoChat: _TypeAlias = GeoChat # noqa: Y015 + +@_typing.final +class AircraftTrack(_message.Message): """ Aircraft track information from ADS-B or military air tracking. Covers the majority of observed real-world CoT traffic. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - ICAO_FIELD_NUMBER: builtins.int - REGISTRATION_FIELD_NUMBER: builtins.int - FLIGHT_FIELD_NUMBER: builtins.int - AIRCRAFT_TYPE_FIELD_NUMBER: builtins.int - SQUAWK_FIELD_NUMBER: builtins.int - CATEGORY_FIELD_NUMBER: builtins.int - RSSI_X10_FIELD_NUMBER: builtins.int - GPS_FIELD_NUMBER: builtins.int - COT_HOST_ID_FIELD_NUMBER: builtins.int - icao: builtins.str + ICAO_FIELD_NUMBER: _builtins.int + REGISTRATION_FIELD_NUMBER: _builtins.int + FLIGHT_FIELD_NUMBER: _builtins.int + AIRCRAFT_TYPE_FIELD_NUMBER: _builtins.int + SQUAWK_FIELD_NUMBER: _builtins.int + CATEGORY_FIELD_NUMBER: _builtins.int + RSSI_X10_FIELD_NUMBER: _builtins.int + GPS_FIELD_NUMBER: _builtins.int + COT_HOST_ID_FIELD_NUMBER: _builtins.int + icao: _builtins.str """ ICAO hex identifier (e.g. "AD237C") """ - registration: builtins.str + registration: _builtins.str """ Aircraft registration (e.g. "N946AK") """ - flight: builtins.str + flight: _builtins.str """ Flight number/callsign (e.g. "ASA864") """ - aircraft_type: builtins.str + aircraft_type: _builtins.str """ ICAO aircraft type designator (e.g. "B39M") """ - squawk: builtins.int + squawk: _builtins.int """ Transponder squawk code (0-7777 octal) """ - category: builtins.str + category: _builtins.str """ ADS-B emitter category (e.g. "A3") """ - rssi_x10: builtins.int + rssi_x10: _builtins.int """ - Received signal strength * 10 (e.g. -194 for -19.4 dBm) + Received signal strength * 10 (e.g. -194 for -19.4 dBm). Tenths rather than the + mesh's whole dBm because an ADS-B receiver reports this to one decimal and the + value is passed through, not measured here. """ - gps: builtins.bool + gps: _builtins.bool """ Whether receiver has GPS fix """ - cot_host_id: builtins.str + cot_host_id: _builtins.str """ CoT host ID for source attribution """ def __init__( self, *, - icao: builtins.str = ..., - registration: builtins.str = ..., - flight: builtins.str = ..., - aircraft_type: builtins.str = ..., - squawk: builtins.int = ..., - category: builtins.str = ..., - rssi_x10: builtins.int = ..., - gps: builtins.bool = ..., - cot_host_id: builtins.str = ..., + icao: _builtins.str = ..., + registration: _builtins.str = ..., + flight: _builtins.str = ..., + aircraft_type: _builtins.str = ..., + squawk: _builtins.int = ..., + category: _builtins.str = ..., + rssi_x10: _builtins.int = ..., + gps: _builtins.bool = ..., + cot_host_id: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["aircraft_type", b"aircraft_type", "category", b"category", "cot_host_id", b"cot_host_id", "flight", b"flight", "gps", b"gps", "icao", b"icao", "registration", b"registration", "rssi_x10", b"rssi_x10", "squawk", b"squawk"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["aircraft_type", b"aircraft_type", "category", b"category", "cot_host_id", b"cot_host_id", "flight", b"flight", "gps", b"gps", "icao", b"icao", "registration", b"registration", "rssi_x10", b"rssi_x10", "squawk", b"squawk"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___AircraftTrack = AircraftTrack +Global___AircraftTrack: _TypeAlias = AircraftTrack # noqa: Y015 -@typing.final -class CotGeoPoint(google.protobuf.message.Message): +@_typing.final +class CotGeoPoint(_message.Message): """ Compact geographic vertex used by repeated vertex lists in TAK geometry payloads. Named with a `Cot` prefix to avoid a namespace collision with `meshtastic.GeoPoint` in `device_ui.proto`, which is an unrelated zoom/ latitude/longitude type used by the on-device map UI. - Encoded as a signed DELTA from TAKPacketV2.latitude_i / longitude_i (the + Encoded as a signed DELTA from TAKPacket.latitude_i / longitude_i (the enclosing event's anchor point). The absolute coordinate is recovered by the receiver as `event.latitude_i + vertex.lat_delta_i` (and likewise for longitude). @@ -1810,42 +1630,46 @@ class CotGeoPoint(google.protobuf.message.Message): 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 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 + per field, which is why TAKPacket's top-level latitude_i / longitude_i stay sfixed32 - only small values win with sint32. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - LAT_DELTA_I_FIELD_NUMBER: builtins.int - LON_DELTA_I_FIELD_NUMBER: builtins.int - lat_delta_i: builtins.int + LAT_DELTA_I_FIELD_NUMBER: _builtins.int + LON_DELTA_I_FIELD_NUMBER: _builtins.int + lat_delta_i: _builtins.int """ - Latitude delta from TAKPacketV2.latitude_i, in 1e-7 degree units. + Latitude delta from TAKPacket.latitude_i, in 1e-7 degree units. Add to the enclosing event's latitude_i to recover the absolute latitude. """ - lon_delta_i: builtins.int + lon_delta_i: _builtins.int """ - Longitude delta from TAKPacketV2.longitude_i, in 1e-7 degree units. + Longitude delta from TAKPacket.longitude_i, in 1e-7 degree units. """ def __init__( self, *, - lat_delta_i: builtins.int = ..., - lon_delta_i: builtins.int = ..., + lat_delta_i: _builtins.int = ..., + lon_delta_i: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["lat_delta_i", b"lat_delta_i", "lon_delta_i", b"lon_delta_i"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["lat_delta_i", b"lat_delta_i", "lon_delta_i", b"lon_delta_i"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___CotGeoPoint = CotGeoPoint +Global___CotGeoPoint: _TypeAlias = CotGeoPoint # noqa: Y015 -@typing.final -class DrawnShape(google.protobuf.message.Message): +@_typing.final +class DrawnShape(_message.Message): """ User-drawn tactical graphic: circle, rectangle, polygon, polyline, freehand telestration, ranging circle, or bullseye. Covers CoT types u-d-c-c, u-d-r, u-d-f, u-d-f-m, u-d-p, u-r-b-c-c, u-r-b-bullseye. The shape's anchor position is carried on - TAKPacketV2.latitude_i/longitude_i; polyline/polygon vertices are in the + TAKPacket.latitude_i/longitude_i; polyline/polygon vertices are in the `vertices` repeated field as `CotGeoPoint` deltas from that anchor. Colors use the Team enum as a 14-color palette (see color encoding below) @@ -1853,14 +1677,14 @@ class DrawnShape(google.protobuf.message.Message): don't map to a palette entry. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Kind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _KindEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DrawnShape._Kind.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _KindEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DrawnShape._Kind.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Kind_Unspecified: DrawnShape._Kind.ValueType # 0 """ Unspecified (do not use on the wire) @@ -1966,11 +1790,11 @@ class DrawnShape(google.protobuf.message.Message): """ class _StyleMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _StyleModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DrawnShape._StyleMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _StyleModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DrawnShape._StyleMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor StyleMode_Unspecified: DrawnShape._StyleMode.ValueType # 0 """ Unspecified - receiver infers from which color fields are non-zero. @@ -2023,155 +1847,201 @@ class DrawnShape(google.protobuf.message.Message): polygon, ranging circle. """ - KIND_FIELD_NUMBER: builtins.int - STYLE_FIELD_NUMBER: builtins.int - MAJOR_CM_FIELD_NUMBER: builtins.int - MINOR_CM_FIELD_NUMBER: builtins.int - ANGLE_DEG_FIELD_NUMBER: builtins.int - STROKE_COLOR_FIELD_NUMBER: builtins.int - STROKE_ARGB_FIELD_NUMBER: builtins.int - STROKE_WEIGHT_X10_FIELD_NUMBER: builtins.int - FILL_COLOR_FIELD_NUMBER: builtins.int - FILL_ARGB_FIELD_NUMBER: builtins.int - LABELS_ON_FIELD_NUMBER: builtins.int - VERTEX_LAT_DELTAS_FIELD_NUMBER: builtins.int - VERTEX_LON_DELTAS_FIELD_NUMBER: builtins.int - TRUNCATED_FIELD_NUMBER: builtins.int - BULLSEYE_DISTANCE_DM_FIELD_NUMBER: builtins.int - BULLSEYE_BEARING_REF_FIELD_NUMBER: builtins.int - BULLSEYE_FLAGS_FIELD_NUMBER: builtins.int - BULLSEYE_UID_REF_FIELD_NUMBER: builtins.int - kind: global___DrawnShape.Kind.ValueType + class _BullseyeFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _BullseyeFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DrawnShape._BullseyeFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + BULLSEYE_NONE: DrawnShape._BullseyeFlags.ValueType # 0 + """No attributes set""" + BULLSEYE_RANGE_RING_VISIBLE: DrawnShape._BullseyeFlags.ValueType # 1 + """Range ring is visible""" + BULLSEYE_HAS_RANGE_RINGS: DrawnShape._BullseyeFlags.ValueType # 2 + """Bullseye has range rings""" + BULLSEYE_EDGE_TO_CENTER: DrawnShape._BullseyeFlags.ValueType # 4 + """Measure edge to centre rather than centre to centre""" + BULLSEYE_MILS: DrawnShape._BullseyeFlags.ValueType # 8 + """Bearings are in mils rather than degrees""" + + class BullseyeFlags(_BullseyeFlags, metaclass=_BullseyeFlagsEnumTypeWrapper): + """ + Bullseye attributes: a bitwise OR of BullseyeFlags values. + """ + + BULLSEYE_NONE: DrawnShape.BullseyeFlags.ValueType # 0 + """No attributes set""" + BULLSEYE_RANGE_RING_VISIBLE: DrawnShape.BullseyeFlags.ValueType # 1 + """Range ring is visible""" + BULLSEYE_HAS_RANGE_RINGS: DrawnShape.BullseyeFlags.ValueType # 2 + """Bullseye has range rings""" + BULLSEYE_EDGE_TO_CENTER: DrawnShape.BullseyeFlags.ValueType # 4 + """Measure edge to centre rather than centre to centre""" + BULLSEYE_MILS: DrawnShape.BullseyeFlags.ValueType # 8 + """Bearings are in mils rather than degrees""" + + KIND_FIELD_NUMBER: _builtins.int + STYLE_FIELD_NUMBER: _builtins.int + MAJOR_CM_FIELD_NUMBER: _builtins.int + MINOR_CM_FIELD_NUMBER: _builtins.int + ANGLE_DEG_FIELD_NUMBER: _builtins.int + STROKE_COLOR_FIELD_NUMBER: _builtins.int + STROKE_ARGB_FIELD_NUMBER: _builtins.int + STROKE_WEIGHT_X10_FIELD_NUMBER: _builtins.int + FILL_COLOR_FIELD_NUMBER: _builtins.int + FILL_ARGB_FIELD_NUMBER: _builtins.int + LABELS_ON_FIELD_NUMBER: _builtins.int + VERTEX_LAT_DELTAS_FIELD_NUMBER: _builtins.int + VERTEX_LON_DELTAS_FIELD_NUMBER: _builtins.int + TRUNCATED_FIELD_NUMBER: _builtins.int + BULLSEYE_DISTANCE_DM_FIELD_NUMBER: _builtins.int + BULLSEYE_BEARING_REF_FIELD_NUMBER: _builtins.int + BULLSEYE_FLAGS_FIELD_NUMBER: _builtins.int + BULLSEYE_UID_REF_FIELD_NUMBER: _builtins.int + kind: Global___DrawnShape.Kind.ValueType """ Shape kind (circle, rectangle, freeform, etc.) """ - style: global___DrawnShape.StyleMode.ValueType + style: Global___DrawnShape.StyleMode.ValueType """ Explicit stroke/fill/both discriminator. See StyleMode doc. """ - major_cm: builtins.int + major_cm: _builtins.int """ Ellipse major radius in centimeters. 0 for non-ellipse kinds. """ - minor_cm: builtins.int + minor_cm: _builtins.int """ Ellipse minor radius in centimeters. 0 for non-ellipse kinds. """ - angle_deg: builtins.int + angle_deg: _builtins.int """ Ellipse rotation angle in degrees. Valid values are 0..360 inclusive; 0 and 360 are equivalent rotations. In proto3, an unset uint32 reads as 0, so senders should emit 0 when the angle is unspecified. """ - stroke_color: global___Team.ValueType + stroke_color: Global___Team.ValueType """ Stroke color as a named palette entry from the Team enum. If Unspecifed_Color, the exact ARGB is carried in stroke_argb. Valid only when style is StrokeOnly or StrokeAndFill. """ - stroke_argb: builtins.int + stroke_argb: _builtins.int """ Stroke color as an exact 32-bit ARGB bit pattern. Always populated on the wire; readers MUST use this value when stroke_color == Unspecifed_Color and MAY use it to recover the exact original bytes even when a palette entry is set. """ - stroke_weight_x10: builtins.int + stroke_weight_x10: _builtins.int """ Stroke weight in tenths of a unit (e.g. 30 = 3.0). Typical ATAK range 10..60. """ - fill_color: global___Team.ValueType + fill_color: Global___Team.ValueType """ Fill color as a named palette entry. See stroke_color docs. Valid only when style is FillOnly or StrokeAndFill. """ - fill_argb: builtins.int + fill_argb: _builtins.int """ Fill color exact ARGB fallback. See stroke_argb docs. """ - labels_on: builtins.bool + labels_on: _builtins.bool """ Whether labels are rendered on this shape. """ - truncated: builtins.bool + truncated: _builtins.bool """ True if the sender truncated the vertex columns to fit the pool. --- Bullseye-only fields. All ignored unless kind == Kind_Bullseye. --- """ - bullseye_distance_dm: builtins.int + bullseye_distance_dm: _builtins.int """ Bullseye distance in meters * 10 (e.g. 3285 = 328.5 m). 0 = unset. """ - bullseye_bearing_ref: builtins.int + bullseye_bearing_ref: _builtins.int """ Bullseye bearing reference: 0 unset, 1 Magnetic, 2 True, 3 Grid. """ - bullseye_flags: builtins.int + bullseye_flags: _builtins.int """ - Bullseye attribute bit flags: - bit 0: rangeRingVisible - bit 1: hasRangeRings - bit 2: edgeToCenter - bit 3: mils + Bitwise OR of BullseyeFlags values. """ - bullseye_uid_ref: builtins.str + bullseye_uid_ref: _builtins.str """ Bullseye reference UID (anchor marker). Empty = anchor is self. """ - @property - def vertex_lat_deltas(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ... - @property - def vertex_lon_deltas(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ... + @_builtins.property + def vertex_lat_deltas(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + Vertex list for polyline/polygon/rectangle/telestration shapes, stored as + two PACKED parallel columns of signed deltas from the event anchor + (TAKPacket.latitude_i/longitude_i), in 1e-7 degree units. vertex N is + (lat_deltas[N], lon_deltas[N]); the two columns MUST stay the same length. + + Columns rather than one CotGeoPoint per vertex: a sub-message costs about two + bytes of framing per vertex, where two `repeated sint32` columns pay the field + framing once each - about 58 B less on a 32-vertex telestration - with the same + zigzag small-delta encoding. Capped at 32 by the nanopb pool; senders MUST + truncate longer inputs and set `truncated`. + """ + + @_builtins.property + def vertex_lon_deltas(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: ... def __init__( self, *, - kind: global___DrawnShape.Kind.ValueType = ..., - style: global___DrawnShape.StyleMode.ValueType = ..., - major_cm: builtins.int = ..., - minor_cm: builtins.int = ..., - angle_deg: builtins.int = ..., - stroke_color: global___Team.ValueType = ..., - stroke_argb: builtins.int = ..., - stroke_weight_x10: builtins.int = ..., - fill_color: global___Team.ValueType = ..., - fill_argb: builtins.int = ..., - labels_on: builtins.bool = ..., - vertex_lat_deltas: collections.abc.Iterable[builtins.int] | None = ..., - vertex_lon_deltas: collections.abc.Iterable[builtins.int] | None = ..., - truncated: builtins.bool = ..., - bullseye_distance_dm: builtins.int = ..., - bullseye_bearing_ref: builtins.int = ..., - bullseye_flags: builtins.int = ..., - bullseye_uid_ref: builtins.str = ..., + kind: Global___DrawnShape.Kind.ValueType = ..., + style: Global___DrawnShape.StyleMode.ValueType = ..., + major_cm: _builtins.int = ..., + minor_cm: _builtins.int = ..., + angle_deg: _builtins.int = ..., + stroke_color: Global___Team.ValueType = ..., + stroke_argb: _builtins.int = ..., + stroke_weight_x10: _builtins.int = ..., + fill_color: Global___Team.ValueType = ..., + fill_argb: _builtins.int = ..., + labels_on: _builtins.bool = ..., + vertex_lat_deltas: _abc.Iterable[_builtins.int] | None = ..., + vertex_lon_deltas: _abc.Iterable[_builtins.int] | None = ..., + truncated: _builtins.bool = ..., + bullseye_distance_dm: _builtins.int = ..., + bullseye_bearing_ref: _builtins.int = ..., + bullseye_flags: _builtins.int = ..., + bullseye_uid_ref: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["angle_deg", b"angle_deg", "bullseye_bearing_ref", b"bullseye_bearing_ref", "bullseye_distance_dm", b"bullseye_distance_dm", "bullseye_flags", b"bullseye_flags", "bullseye_uid_ref", b"bullseye_uid_ref", "fill_argb", b"fill_argb", "fill_color", b"fill_color", "kind", b"kind", "labels_on", b"labels_on", "major_cm", b"major_cm", "minor_cm", b"minor_cm", "stroke_argb", b"stroke_argb", "stroke_color", b"stroke_color", "stroke_weight_x10", b"stroke_weight_x10", "style", b"style", "truncated", b"truncated", "vertex_lat_deltas", b"vertex_lat_deltas", "vertex_lon_deltas", b"vertex_lon_deltas"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["angle_deg", b"angle_deg", "bullseye_bearing_ref", b"bullseye_bearing_ref", "bullseye_distance_dm", b"bullseye_distance_dm", "bullseye_flags", b"bullseye_flags", "bullseye_uid_ref", b"bullseye_uid_ref", "fill_argb", b"fill_argb", "fill_color", b"fill_color", "kind", b"kind", "labels_on", b"labels_on", "major_cm", b"major_cm", "minor_cm", b"minor_cm", "stroke_argb", b"stroke_argb", "stroke_color", b"stroke_color", "stroke_weight_x10", b"stroke_weight_x10", "style", b"style", "truncated", b"truncated", "vertex_lat_deltas", b"vertex_lat_deltas", "vertex_lon_deltas", b"vertex_lon_deltas"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___DrawnShape = DrawnShape +Global___DrawnShape: _TypeAlias = DrawnShape # noqa: Y015 -@typing.final -class Marker(google.protobuf.message.Message): +@_typing.final +class Marker(_message.Message): """ Fixed point of interest: spot marker, waypoint, checkpoint, 2525 symbol, or custom icon. Covers CoT types b-m-p-s-m, b-m-p-w, b-m-p-c, b-m-p-s-p-i, b-m-p-s-p-loc, plus a-u-G / a-f-G / a-h-G / a-n-G with iconset paths. The marker position - is carried on TAKPacketV2.latitude_i/longitude_i; fields below carry only + is carried on TAKPacket.latitude_i/longitude_i; fields below carry only the marker-specific metadata. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Kind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _KindEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Marker._Kind.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _KindEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Marker._Kind.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Kind_Unspecified: Marker._Kind.ValueType # 0 """ - Unspecified - fall back to TAKPacketV2.cot_type_id + Unspecified - fall back to TAKPacket.cot_type_id """ Kind_Spot: Marker._Kind.ValueType # 1 """ @@ -2233,7 +2103,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 TAKPacket.cot_type_id """ Kind_Spot: Marker.Kind.ValueType # 1 """ @@ -2286,45 +2156,45 @@ class Marker(google.protobuf.message.Message): does not ride on the LoRa wire. """ - KIND_FIELD_NUMBER: builtins.int - COLOR_FIELD_NUMBER: builtins.int - COLOR_ARGB_FIELD_NUMBER: builtins.int - READINESS_FIELD_NUMBER: builtins.int - PARENT_UID_FIELD_NUMBER: builtins.int - PARENT_TYPE_FIELD_NUMBER: builtins.int - PARENT_CALLSIGN_FIELD_NUMBER: builtins.int - ICONSET_FIELD_NUMBER: builtins.int - kind: global___Marker.Kind.ValueType + KIND_FIELD_NUMBER: _builtins.int + COLOR_FIELD_NUMBER: _builtins.int + COLOR_ARGB_FIELD_NUMBER: _builtins.int + READINESS_FIELD_NUMBER: _builtins.int + PARENT_UID_FIELD_NUMBER: _builtins.int + PARENT_TYPE_FIELD_NUMBER: _builtins.int + PARENT_CALLSIGN_FIELD_NUMBER: _builtins.int + ICONSET_FIELD_NUMBER: _builtins.int + kind: Global___Marker.Kind.ValueType """ Marker kind """ - color: global___Team.ValueType + color: Global___Team.ValueType """ Marker color as a named palette entry. If Unspecifed_Color, the exact ARGB is in color_argb. """ - color_argb: builtins.int + color_argb: _builtins.int """ Marker color exact ARGB bit pattern. Always populated on the wire. """ - readiness: builtins.bool + readiness: _builtins.bool """ Status readiness flag (ATAK ). """ - parent_uid: builtins.str + parent_uid: _builtins.str """ Parent link UID (ATAK ). Empty = no parent. For spot/waypoint markers this is typically the producing TAK user's UID. """ - parent_type: builtins.str + parent_type: _builtins.str """ Parent CoT type (e.g. "a-f-G-U-C"). Usually the parent TAK user's type. """ - parent_callsign: builtins.str + parent_callsign: _builtins.str """ Parent callsign (e.g. "HOPE"). """ - iconset: builtins.str + iconset: _builtins.str """ Iconset path stored verbatim. ATAK emits three flavors: Kind_Symbol2525 -> "COT_MAPPING_2525B//" @@ -2337,104 +2207,111 @@ class Marker(google.protobuf.message.Message): def __init__( self, *, - kind: global___Marker.Kind.ValueType = ..., - color: global___Team.ValueType = ..., - color_argb: builtins.int = ..., - readiness: builtins.bool = ..., - parent_uid: builtins.str = ..., - parent_type: builtins.str = ..., - parent_callsign: builtins.str = ..., - iconset: builtins.str = ..., + kind: Global___Marker.Kind.ValueType = ..., + color: Global___Team.ValueType = ..., + color_argb: _builtins.int = ..., + readiness: _builtins.bool = ..., + parent_uid: _builtins.str = ..., + parent_type: _builtins.str = ..., + parent_callsign: _builtins.str = ..., + iconset: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["color", b"color", "color_argb", b"color_argb", "iconset", b"iconset", "kind", b"kind", "parent_callsign", b"parent_callsign", "parent_type", b"parent_type", "parent_uid", b"parent_uid", "readiness", b"readiness"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["color", b"color", "color_argb", b"color_argb", "iconset", b"iconset", "kind", b"kind", "parent_callsign", b"parent_callsign", "parent_type", b"parent_type", "parent_uid", b"parent_uid", "readiness", b"readiness"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Marker = Marker +Global___Marker: _TypeAlias = Marker # noqa: Y015 -@typing.final -class RangeAndBearing(google.protobuf.message.Message): +@_typing.final +class RangeAndBearing(_message.Message): """ Range and bearing measurement line from the event anchor to a target point. 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 + TAKPacket.latitude_i/longitude_i; the target endpoint is carried as a + CotGeoPoint - same delta-from-anchor encoding used by the DrawnShape vertex columns so a self-anchored RAB (common case) encodes in zero bytes. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - ANCHOR_FIELD_NUMBER: builtins.int - ANCHOR_UID_FIELD_NUMBER: builtins.int - RANGE_CM_FIELD_NUMBER: builtins.int - BEARING_CDEG_FIELD_NUMBER: builtins.int - STROKE_COLOR_FIELD_NUMBER: builtins.int - STROKE_ARGB_FIELD_NUMBER: builtins.int - STROKE_WEIGHT_X10_FIELD_NUMBER: builtins.int - anchor_uid: builtins.str + ANCHOR_FIELD_NUMBER: _builtins.int + ANCHOR_UID_FIELD_NUMBER: _builtins.int + RANGE_CM_FIELD_NUMBER: _builtins.int + BEARING_CDEG_FIELD_NUMBER: _builtins.int + STROKE_COLOR_FIELD_NUMBER: _builtins.int + STROKE_ARGB_FIELD_NUMBER: _builtins.int + STROKE_WEIGHT_X10_FIELD_NUMBER: _builtins.int + anchor_uid: _builtins.str """ Anchor UID (from ). Empty = free-standing. """ - range_cm: builtins.int + range_cm: _builtins.int """ Range in centimeters (value * 100). Range 0..4294 km. """ - bearing_cdeg: builtins.int + bearing_cdeg: _builtins.int """ Bearing in degrees * 100 (0..36000). """ - stroke_color: global___Team.ValueType + stroke_color: Global___Team.ValueType """ Stroke color as a Team palette entry. See DrawnShape.stroke_color doc. """ - stroke_argb: builtins.int + stroke_argb: _builtins.int """ Stroke color exact ARGB fallback. """ - stroke_weight_x10: builtins.int + stroke_weight_x10: _builtins.int """ Stroke weight * 10 (e.g. 30 = 3.0). """ - @property - def anchor(self) -> global___CotGeoPoint: + @_builtins.property + def anchor(self) -> Global___CotGeoPoint: """ - Target/anchor endpoint (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + Target/anchor endpoint (delta-encoded from TAKPacket.latitude_i/longitude_i). """ def __init__( self, *, - anchor: global___CotGeoPoint | None = ..., - anchor_uid: builtins.str = ..., - range_cm: builtins.int = ..., - bearing_cdeg: builtins.int = ..., - stroke_color: global___Team.ValueType = ..., - stroke_argb: builtins.int = ..., - stroke_weight_x10: builtins.int = ..., + anchor: Global___CotGeoPoint | None = ..., + anchor_uid: _builtins.str = ..., + range_cm: _builtins.int = ..., + bearing_cdeg: _builtins.int = ..., + stroke_color: Global___Team.ValueType = ..., + stroke_argb: _builtins.int = ..., + stroke_weight_x10: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["anchor", b"anchor"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["anchor", b"anchor", "anchor_uid", b"anchor_uid", "bearing_cdeg", b"bearing_cdeg", "range_cm", b"range_cm", "stroke_argb", b"stroke_argb", "stroke_color", b"stroke_color", "stroke_weight_x10", b"stroke_weight_x10"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["anchor", b"anchor"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["anchor", b"anchor", "anchor_uid", b"anchor_uid", "bearing_cdeg", b"bearing_cdeg", "range_cm", b"range_cm", "stroke_argb", b"stroke_argb", "stroke_color", b"stroke_color", "stroke_weight_x10", b"stroke_weight_x10"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___RangeAndBearing = RangeAndBearing +Global___RangeAndBearing: _TypeAlias = RangeAndBearing # noqa: Y015 -@typing.final -class Route(google.protobuf.message.Message): +@_typing.final +class Route(_message.Message): """ Named route consisting of ordered waypoints and control points. Covers CoT type b-m-r. The first waypoint's position is on - TAKPacketV2.latitude_i/longitude_i; subsequent waypoints and checkpoints + TAKPacket.latitude_i/longitude_i; subsequent waypoints and checkpoints are in `links`. Link count is capped at 16 by the nanopb pool; senders MUST truncate longer routes and set `truncated = true`. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Method: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _MethodEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Route._Method.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _MethodEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Route._Method.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Method_Unspecified: Route._Method.ValueType # 0 """ Unspecified / unknown @@ -2491,11 +2368,11 @@ class Route(google.protobuf.message.Message): """ class _Direction: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _DirectionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Route._Direction.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _DirectionEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Route._Direction.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Direction_Unspecified: Route._Direction.ValueType # 0 """ Unspecified @@ -2527,76 +2404,79 @@ class Route(google.protobuf.message.Message): Exfiltration (egress) """ - @typing.final - class Link(google.protobuf.message.Message): + @_typing.final + class Link(_message.Message): """ Route waypoint or control point. Each link corresponds to one ATAK entry inside the b-m-r event. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - POINT_FIELD_NUMBER: builtins.int - UID_FIELD_NUMBER: builtins.int - CALLSIGN_FIELD_NUMBER: builtins.int - LINK_TYPE_FIELD_NUMBER: builtins.int - uid: builtins.str + POINT_FIELD_NUMBER: _builtins.int + UID_FIELD_NUMBER: _builtins.int + CALLSIGN_FIELD_NUMBER: _builtins.int + LINK_TYPE_FIELD_NUMBER: _builtins.int + uid: _builtins.str """ Optional UID (empty = receiver derives). """ - callsign: builtins.str + callsign: _builtins.str """ Optional display callsign (e.g. "CP1"). Empty for unnamed control points. """ - link_type: builtins.int + link_type: _builtins.int """ Link role: 0 = waypoint (b-m-p-w), 1 = checkpoint (b-m-p-c). """ - @property - def point(self) -> global___CotGeoPoint: + @_builtins.property + def point(self) -> Global___CotGeoPoint: """ - Waypoint position (delta-encoded from TAKPacketV2.latitude_i/longitude_i). + Waypoint position (delta-encoded from TAKPacket.latitude_i/longitude_i). """ def __init__( self, *, - point: global___CotGeoPoint | None = ..., - uid: builtins.str = ..., - callsign: builtins.str = ..., - link_type: builtins.int = ..., + point: Global___CotGeoPoint | None = ..., + uid: _builtins.str = ..., + callsign: _builtins.str = ..., + link_type: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["point", b"point"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["callsign", b"callsign", "link_type", b"link_type", "point", b"point", "uid", b"uid"]) -> None: ... - - METHOD_FIELD_NUMBER: builtins.int - DIRECTION_FIELD_NUMBER: builtins.int - PREFIX_FIELD_NUMBER: builtins.int - STROKE_WEIGHT_X10_FIELD_NUMBER: builtins.int - LINKS_FIELD_NUMBER: builtins.int - TRUNCATED_FIELD_NUMBER: builtins.int - method: global___Route.Method.ValueType + _HasFieldArgType: _TypeAlias = _typing.Literal["point", b"point"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["callsign", b"callsign", "link_type", b"link_type", "point", b"point", "uid", b"uid"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + + METHOD_FIELD_NUMBER: _builtins.int + DIRECTION_FIELD_NUMBER: _builtins.int + PREFIX_FIELD_NUMBER: _builtins.int + STROKE_WEIGHT_X10_FIELD_NUMBER: _builtins.int + LINKS_FIELD_NUMBER: _builtins.int + TRUNCATED_FIELD_NUMBER: _builtins.int + method: Global___Route.Method.ValueType """ Travel method """ - direction: global___Route.Direction.ValueType + direction: Global___Route.Direction.ValueType """ Direction (infil/exfil) """ - prefix: builtins.str + prefix: _builtins.str """ Waypoint name prefix (e.g. "CP"). """ - stroke_weight_x10: builtins.int + stroke_weight_x10: _builtins.int """ Stroke weight * 10 (e.g. 30 = 3.0). 0 = default. """ - truncated: builtins.bool + truncated: _builtins.bool """ True if the sender truncated `links` to fit the pool. """ - @property - def links(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Route.Link]: + @_builtins.property + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___Route.Link]: """ Ordered list of route control points. Capped at 16. """ @@ -2604,39 +2484,43 @@ class Route(google.protobuf.message.Message): def __init__( self, *, - method: global___Route.Method.ValueType = ..., - direction: global___Route.Direction.ValueType = ..., - prefix: builtins.str = ..., - stroke_weight_x10: builtins.int = ..., - links: collections.abc.Iterable[global___Route.Link] | None = ..., - truncated: builtins.bool = ..., + method: Global___Route.Method.ValueType = ..., + direction: Global___Route.Direction.ValueType = ..., + prefix: _builtins.str = ..., + stroke_weight_x10: _builtins.int = ..., + links: _abc.Iterable[Global___Route.Link] | None = ..., + truncated: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["direction", b"direction", "links", b"links", "method", b"method", "prefix", b"prefix", "stroke_weight_x10", b"stroke_weight_x10", "truncated", b"truncated"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["direction", b"direction", "links", b"links", "method", b"method", "prefix", b"prefix", "stroke_weight_x10", b"stroke_weight_x10", "truncated", b"truncated"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Route = Route +Global___Route: _TypeAlias = Route # noqa: Y015 -@typing.final -class CasevacReport(google.protobuf.message.Message): +@_typing.final +class CasevacReport(_message.Message): """ 9-line MEDEVAC request (CoT type b-r-f-h-c). Mirrors the ATAK MedLine tool's <_medevac_> detail element. Every field is optional (proto3 default); senders omit lines they don't have. The - envelope (TAKPacketV2.uid, cot_type_id=b-r-f-h-c, latitude_i/longitude_i, + envelope (TAKPacket.uid, cot_type_id=b-r-f-h-c, latitude_i/longitude_i, altitude, callsign) carries Line 1 (location) and Line 2 (callsign). All numeric fields are tight varints so a complete 9-line request fits in well under 100 bytes of proto on the wire. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Precedence: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _PrecedenceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[CasevacReport._Precedence.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _PrecedenceEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CasevacReport._Precedence.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Precedence_Unspecified: CasevacReport._Precedence.ValueType # 0 Precedence_Urgent: CasevacReport._Precedence.ValueType # 1 """A - immediate, life-threatening""" @@ -2667,11 +2551,11 @@ class CasevacReport(google.protobuf.message.Message): """E - convenience""" class _HlzMarking: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _HlzMarkingEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[CasevacReport._HlzMarking.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _HlzMarkingEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CasevacReport._HlzMarking.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor HlzMarking_Unspecified: CasevacReport._HlzMarking.ValueType # 0 HlzMarking_Panels: CasevacReport._HlzMarking.ValueType # 1 HlzMarking_PyroSignal: CasevacReport._HlzMarking.ValueType # 2 @@ -2692,11 +2576,11 @@ class CasevacReport(google.protobuf.message.Message): HlzMarking_Other: CasevacReport.HlzMarking.ValueType # 5 class _Security: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _SecurityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[CasevacReport._Security.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _SecurityEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CasevacReport._Security.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Security_Unspecified: CasevacReport._Security.ValueType # 0 Security_NoEnemy: CasevacReport._Security.ValueType # 1 """N - no enemy activity""" @@ -2722,103 +2606,170 @@ class CasevacReport(google.protobuf.message.Message): Security_EnemyInArmedContact: CasevacReport.Security.ValueType # 4 """X - armed escort required""" - PRECEDENCE_FIELD_NUMBER: builtins.int - EQUIPMENT_FLAGS_FIELD_NUMBER: builtins.int - LITTER_PATIENTS_FIELD_NUMBER: builtins.int - AMBULATORY_PATIENTS_FIELD_NUMBER: builtins.int - SECURITY_FIELD_NUMBER: builtins.int - HLZ_MARKING_FIELD_NUMBER: builtins.int - ZONE_MARKER_FIELD_NUMBER: builtins.int - US_MILITARY_FIELD_NUMBER: builtins.int - US_CIVILIAN_FIELD_NUMBER: builtins.int - NON_US_MILITARY_FIELD_NUMBER: builtins.int - NON_US_CIVILIAN_FIELD_NUMBER: builtins.int - EPW_FIELD_NUMBER: builtins.int - CHILD_FIELD_NUMBER: builtins.int - TERRAIN_FLAGS_FIELD_NUMBER: builtins.int - FREQUENCY_FIELD_NUMBER: builtins.int - TITLE_FIELD_NUMBER: builtins.int - MEDLINE_REMARKS_FIELD_NUMBER: builtins.int - URGENT_COUNT_FIELD_NUMBER: builtins.int - URGENT_SURGICAL_COUNT_FIELD_NUMBER: builtins.int - PRIORITY_COUNT_FIELD_NUMBER: builtins.int - ROUTINE_COUNT_FIELD_NUMBER: builtins.int - CONVENIENCE_COUNT_FIELD_NUMBER: builtins.int - EQUIPMENT_DETAIL_FIELD_NUMBER: builtins.int - ZONE_PROTECTED_COORD_FIELD_NUMBER: builtins.int - TERRAIN_SLOPE_DIR_FIELD_NUMBER: builtins.int - TERRAIN_OTHER_DETAIL_FIELD_NUMBER: builtins.int - MARKED_BY_FIELD_NUMBER: builtins.int - OBSTACLES_FIELD_NUMBER: builtins.int - WINDS_ARE_FROM_FIELD_NUMBER: builtins.int - FRIENDLIES_FIELD_NUMBER: builtins.int - ENEMY_FIELD_NUMBER: builtins.int - HLZ_REMARKS_FIELD_NUMBER: builtins.int - ZMIST_FIELD_NUMBER: builtins.int - precedence: global___CasevacReport.Precedence.ValueType + class _EquipmentFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _EquipmentFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CasevacReport._EquipmentFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + EQUIPMENT_UNSET: CasevacReport._EquipmentFlags.ValueType # 0 + """Not stated. Distinct from EQUIPMENT_NONE, which asserts none is needed.""" + EQUIPMENT_NONE: CasevacReport._EquipmentFlags.ValueType # 1 + """Explicitly no special equipment required""" + EQUIPMENT_HOIST: CasevacReport._EquipmentFlags.ValueType # 2 + """Hoist""" + EQUIPMENT_EXTRACTION: CasevacReport._EquipmentFlags.ValueType # 4 + """Extraction equipment""" + EQUIPMENT_VENTILATOR: CasevacReport._EquipmentFlags.ValueType # 8 + """Ventilator""" + EQUIPMENT_BLOOD: CasevacReport._EquipmentFlags.ValueType # 16 + """Blood""" + + class EquipmentFlags(_EquipmentFlags, metaclass=_EquipmentFlagsEnumTypeWrapper): + """ + Line 4: special equipment required, as a bitwise OR of EquipmentFlags values. + """ + + EQUIPMENT_UNSET: CasevacReport.EquipmentFlags.ValueType # 0 + """Not stated. Distinct from EQUIPMENT_NONE, which asserts none is needed.""" + EQUIPMENT_NONE: CasevacReport.EquipmentFlags.ValueType # 1 + """Explicitly no special equipment required""" + EQUIPMENT_HOIST: CasevacReport.EquipmentFlags.ValueType # 2 + """Hoist""" + EQUIPMENT_EXTRACTION: CasevacReport.EquipmentFlags.ValueType # 4 + """Extraction equipment""" + EQUIPMENT_VENTILATOR: CasevacReport.EquipmentFlags.ValueType # 8 + """Ventilator""" + EQUIPMENT_BLOOD: CasevacReport.EquipmentFlags.ValueType # 16 + """Blood""" + + class _TerrainFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _TerrainFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CasevacReport._TerrainFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + TERRAIN_NONE: CasevacReport._TerrainFlags.ValueType # 0 + """Nothing noted""" + TERRAIN_SLOPE: CasevacReport._TerrainFlags.ValueType # 1 + """Sloping ground""" + TERRAIN_ROUGH: CasevacReport._TerrainFlags.ValueType # 2 + """Rough ground""" + TERRAIN_LOOSE: CasevacReport._TerrainFlags.ValueType # 4 + """Loose surface""" + TERRAIN_TREES: CasevacReport._TerrainFlags.ValueType # 8 + """Trees""" + TERRAIN_WIRES: CasevacReport._TerrainFlags.ValueType # 16 + """Wires""" + TERRAIN_OTHER: CasevacReport._TerrainFlags.ValueType # 32 + """Other obstacle""" + + class TerrainFlags(_TerrainFlags, metaclass=_TerrainFlagsEnumTypeWrapper): + """ + Line 9: terrain and obstacles at the PZ, as a bitwise OR of TerrainFlags values. + """ + + TERRAIN_NONE: CasevacReport.TerrainFlags.ValueType # 0 + """Nothing noted""" + TERRAIN_SLOPE: CasevacReport.TerrainFlags.ValueType # 1 + """Sloping ground""" + TERRAIN_ROUGH: CasevacReport.TerrainFlags.ValueType # 2 + """Rough ground""" + TERRAIN_LOOSE: CasevacReport.TerrainFlags.ValueType # 4 + """Loose surface""" + TERRAIN_TREES: CasevacReport.TerrainFlags.ValueType # 8 + """Trees""" + TERRAIN_WIRES: CasevacReport.TerrainFlags.ValueType # 16 + """Wires""" + TERRAIN_OTHER: CasevacReport.TerrainFlags.ValueType # 32 + """Other obstacle""" + + PRECEDENCE_FIELD_NUMBER: _builtins.int + EQUIPMENT_FLAGS_FIELD_NUMBER: _builtins.int + LITTER_PATIENTS_FIELD_NUMBER: _builtins.int + AMBULATORY_PATIENTS_FIELD_NUMBER: _builtins.int + SECURITY_FIELD_NUMBER: _builtins.int + HLZ_MARKING_FIELD_NUMBER: _builtins.int + ZONE_MARKER_FIELD_NUMBER: _builtins.int + US_MILITARY_FIELD_NUMBER: _builtins.int + US_CIVILIAN_FIELD_NUMBER: _builtins.int + NON_US_MILITARY_FIELD_NUMBER: _builtins.int + NON_US_CIVILIAN_FIELD_NUMBER: _builtins.int + EPW_FIELD_NUMBER: _builtins.int + CHILD_FIELD_NUMBER: _builtins.int + TERRAIN_FLAGS_FIELD_NUMBER: _builtins.int + FREQUENCY_FIELD_NUMBER: _builtins.int + TITLE_FIELD_NUMBER: _builtins.int + MEDLINE_REMARKS_FIELD_NUMBER: _builtins.int + URGENT_COUNT_FIELD_NUMBER: _builtins.int + URGENT_SURGICAL_COUNT_FIELD_NUMBER: _builtins.int + PRIORITY_COUNT_FIELD_NUMBER: _builtins.int + ROUTINE_COUNT_FIELD_NUMBER: _builtins.int + CONVENIENCE_COUNT_FIELD_NUMBER: _builtins.int + EQUIPMENT_DETAIL_FIELD_NUMBER: _builtins.int + ZONE_PROTECTED_COORD_FIELD_NUMBER: _builtins.int + TERRAIN_SLOPE_DIR_FIELD_NUMBER: _builtins.int + TERRAIN_OTHER_DETAIL_FIELD_NUMBER: _builtins.int + MARKED_BY_FIELD_NUMBER: _builtins.int + OBSTACLES_FIELD_NUMBER: _builtins.int + WINDS_ARE_FROM_FIELD_NUMBER: _builtins.int + FRIENDLIES_FIELD_NUMBER: _builtins.int + ENEMY_FIELD_NUMBER: _builtins.int + HLZ_REMARKS_FIELD_NUMBER: _builtins.int + ZMIST_FIELD_NUMBER: _builtins.int + precedence: Global___CasevacReport.Precedence.ValueType """ Line 3: precedence / urgency. """ - equipment_flags: builtins.int + equipment_flags: _builtins.int """ - Line 4: special equipment required, as a bitfield. - bit 0: none - bit 1: hoist - bit 2: extraction equipment - bit 3: ventilator - bit 4: blood + Bitwise OR of EquipmentFlags values. """ - litter_patients: builtins.int + litter_patients: _builtins.int """ Line 5: number of litter (stretcher-bound) patients. """ - ambulatory_patients: builtins.int + ambulatory_patients: _builtins.int """ Line 5: number of ambulatory (walking-wounded) patients. """ - security: global___CasevacReport.Security.ValueType + security: Global___CasevacReport.Security.ValueType """ Line 6: security situation at the PZ. """ - hlz_marking: global___CasevacReport.HlzMarking.ValueType + hlz_marking: Global___CasevacReport.HlzMarking.ValueType """ Line 7: HLZ marking method. """ - zone_marker: builtins.str + zone_marker: _builtins.str """ Line 7 supplementary: short free-text describing the zone marker (e.g. "Green smoke", "VS-17 panel west"). Capped tight in options. """ - us_military: builtins.int + us_military: _builtins.int """--- Line 8: patient nationality counts ---""" - us_civilian: builtins.int - non_us_military: builtins.int - non_us_civilian: builtins.int - epw: builtins.int + us_civilian: _builtins.int + non_us_military: _builtins.int + non_us_civilian: _builtins.int + epw: _builtins.int """enemy prisoner of war""" - child: builtins.int - terrain_flags: builtins.int + child: _builtins.int + terrain_flags: _builtins.int """ - Line 9: terrain and obstacles at the PZ, as a bitfield. - bit 0: slope - bit 1: rough - bit 2: loose - bit 3: trees - bit 4: wires - bit 5: other + Bitwise OR of TerrainFlags values. """ - frequency: builtins.str + frequency: _builtins.str """ Line 2: radio frequency / callsign metadata (e.g. "38.90 Mhz" or "Victor 6"). Capped tight in options. """ - title: builtins.str - """--- v2.x medline extensions (tags 16-33) -------------------------------- + title: _builtins.str + """--- 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 populated CASEVAC with 13 free-text fields + 2 ZMIST entries can run - 200-400 bytes compressed, i.e. potentially over the 237 B LoRa MTU. + 200-400 bytes compressed, i.e. potentially over the room one LoRa frame leaves. Callers that hit the MTU on the `compressWithRemarksFallback` path SHOULD strip the tier-2 situational fields (tags 28-32 + terrain_other_detail) before dropping the packet entirely. See README "CASEVAC tier-2 stripping". @@ -2828,13 +2779,13 @@ class CasevacReport(google.protobuf.message.Message): same as the envelope callsign but ATAK sometimes carries a distinct ops-number here. """ - medline_remarks: builtins.str + medline_remarks: _builtins.str """ 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 + 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 @@ -2842,40 +2793,40 @@ class CasevacReport(google.protobuf.message.Message): set simultaneously. Senders populate whichever style(s) the source XML had; receivers prefer counts when non-zero. """ - urgent_surgical_count: builtins.int - priority_count: builtins.int - routine_count: builtins.int - convenience_count: builtins.int - equipment_detail: builtins.str + urgent_surgical_count: _builtins.int + priority_count: _builtins.int + routine_count: _builtins.int + convenience_count: _builtins.int + equipment_detail: _builtins.str """ Line 4 supplementary: free-text description of non-standard equipment (e.g. "Blood warmer"). Pairs with the `equipment_flags` bitfield. """ - zone_protected_coord: builtins.str + zone_protected_coord: _builtins.str """ Line 1 override: MGRS grid when distinct from the event anchor point (e.g. "34T CQ 12345 67890"). Event lat/lon/hae still carries the numeric location; this field preserves the exact MGRS string the medic entered. """ - terrain_slope_dir: builtins.str + terrain_slope_dir: _builtins.str """ Line 9 supplementary: slope direction (e.g. "N", "NE", "SSW") when `terrain_flags` bit 0 (slope) is set. """ - terrain_other_detail: builtins.str + terrain_other_detail: _builtins.str """ Line 9 supplementary: free-text description of "other" terrain hazards (e.g. "Loose debris on west edge") when `terrain_flags` bit 5 (other) is set. Tier-2 strippable under MTU pressure. """ - marked_by: builtins.str + marked_by: _builtins.str """ Line 7 supplementary: how the zone is being marked right now (e.g. "Orange smoke", "VS-17 panel"). Complements the structured `hlz_marking` enum with a specific human-readable description. """ - obstacles: builtins.str + obstacles: _builtins.str """--- Tier-2 situational awareness (stripped first under MTU pressure) --- These fields are free-text context that helps the receiver plan the approach but aren't strictly required to evacuate the patient. @@ -2883,132 +2834,140 @@ class CasevacReport(google.protobuf.message.Message): Nearby obstacles on the approach (e.g. "Power lines north of HLZ"). """ - winds_are_from: builtins.str + winds_are_from: _builtins.str """ Wind direction and speed (e.g. "270 at 12 kts"). """ - friendlies: builtins.str + friendlies: _builtins.str """ Friendly forces posture near the pickup zone (e.g. "Squad east of HLZ"). """ - enemy: builtins.str + enemy: _builtins.str """ Known or suspected enemy positions near the pickup zone (e.g. "Possible enemy on south ridge"). """ - hlz_remarks: builtins.str + hlz_remarks: _builtins.str """ Free-text description of the HLZ itself (e.g. "Primary HLZ is soccer field"). """ - @property - def zmist(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ZMistEntry]: + @_builtins.property + def zmist(self) -> _containers.RepeatedCompositeFieldContainer[Global___ZMistEntry]: """ Per-patient clinical records. Each entry is one patient's ZMIST card (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. + the room one LoRa frame leaves. """ def __init__( self, *, - precedence: global___CasevacReport.Precedence.ValueType = ..., - equipment_flags: builtins.int = ..., - litter_patients: builtins.int = ..., - ambulatory_patients: builtins.int = ..., - security: global___CasevacReport.Security.ValueType = ..., - hlz_marking: global___CasevacReport.HlzMarking.ValueType = ..., - zone_marker: builtins.str = ..., - us_military: builtins.int = ..., - us_civilian: builtins.int = ..., - non_us_military: builtins.int = ..., - non_us_civilian: builtins.int = ..., - epw: builtins.int = ..., - child: builtins.int = ..., - terrain_flags: builtins.int = ..., - frequency: builtins.str = ..., - title: builtins.str = ..., - medline_remarks: builtins.str = ..., - urgent_count: builtins.int = ..., - urgent_surgical_count: builtins.int = ..., - priority_count: builtins.int = ..., - routine_count: builtins.int = ..., - convenience_count: builtins.int = ..., - equipment_detail: builtins.str = ..., - zone_protected_coord: builtins.str = ..., - terrain_slope_dir: builtins.str = ..., - terrain_other_detail: builtins.str = ..., - marked_by: builtins.str = ..., - obstacles: builtins.str = ..., - winds_are_from: builtins.str = ..., - friendlies: builtins.str = ..., - enemy: builtins.str = ..., - hlz_remarks: builtins.str = ..., - zmist: collections.abc.Iterable[global___ZMistEntry] | None = ..., + precedence: Global___CasevacReport.Precedence.ValueType = ..., + equipment_flags: _builtins.int = ..., + litter_patients: _builtins.int = ..., + ambulatory_patients: _builtins.int = ..., + security: Global___CasevacReport.Security.ValueType = ..., + hlz_marking: Global___CasevacReport.HlzMarking.ValueType = ..., + zone_marker: _builtins.str = ..., + us_military: _builtins.int = ..., + us_civilian: _builtins.int = ..., + non_us_military: _builtins.int = ..., + non_us_civilian: _builtins.int = ..., + epw: _builtins.int = ..., + child: _builtins.int = ..., + terrain_flags: _builtins.int = ..., + frequency: _builtins.str = ..., + title: _builtins.str = ..., + medline_remarks: _builtins.str = ..., + urgent_count: _builtins.int = ..., + urgent_surgical_count: _builtins.int = ..., + priority_count: _builtins.int = ..., + routine_count: _builtins.int = ..., + convenience_count: _builtins.int = ..., + equipment_detail: _builtins.str = ..., + zone_protected_coord: _builtins.str = ..., + terrain_slope_dir: _builtins.str = ..., + terrain_other_detail: _builtins.str = ..., + marked_by: _builtins.str = ..., + obstacles: _builtins.str = ..., + winds_are_from: _builtins.str = ..., + friendlies: _builtins.str = ..., + enemy: _builtins.str = ..., + hlz_remarks: _builtins.str = ..., + zmist: _abc.Iterable[Global___ZMistEntry] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["ambulatory_patients", b"ambulatory_patients", "child", b"child", "convenience_count", b"convenience_count", "enemy", b"enemy", "epw", b"epw", "equipment_detail", b"equipment_detail", "equipment_flags", b"equipment_flags", "frequency", b"frequency", "friendlies", b"friendlies", "hlz_marking", b"hlz_marking", "hlz_remarks", b"hlz_remarks", "litter_patients", b"litter_patients", "marked_by", b"marked_by", "medline_remarks", b"medline_remarks", "non_us_civilian", b"non_us_civilian", "non_us_military", b"non_us_military", "obstacles", b"obstacles", "precedence", b"precedence", "priority_count", b"priority_count", "routine_count", b"routine_count", "security", b"security", "terrain_flags", b"terrain_flags", "terrain_other_detail", b"terrain_other_detail", "terrain_slope_dir", b"terrain_slope_dir", "title", b"title", "urgent_count", b"urgent_count", "urgent_surgical_count", b"urgent_surgical_count", "us_civilian", b"us_civilian", "us_military", b"us_military", "winds_are_from", b"winds_are_from", "zmist", b"zmist", "zone_marker", b"zone_marker", "zone_protected_coord", b"zone_protected_coord"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ambulatory_patients", b"ambulatory_patients", "child", b"child", "convenience_count", b"convenience_count", "enemy", b"enemy", "epw", b"epw", "equipment_detail", b"equipment_detail", "equipment_flags", b"equipment_flags", "frequency", b"frequency", "friendlies", b"friendlies", "hlz_marking", b"hlz_marking", "hlz_remarks", b"hlz_remarks", "litter_patients", b"litter_patients", "marked_by", b"marked_by", "medline_remarks", b"medline_remarks", "non_us_civilian", b"non_us_civilian", "non_us_military", b"non_us_military", "obstacles", b"obstacles", "precedence", b"precedence", "priority_count", b"priority_count", "routine_count", b"routine_count", "security", b"security", "terrain_flags", b"terrain_flags", "terrain_other_detail", b"terrain_other_detail", "terrain_slope_dir", b"terrain_slope_dir", "title", b"title", "urgent_count", b"urgent_count", "urgent_surgical_count", b"urgent_surgical_count", "us_civilian", b"us_civilian", "us_military", b"us_military", "winds_are_from", b"winds_are_from", "zmist", b"zmist", "zone_marker", b"zone_marker", "zone_protected_coord", b"zone_protected_coord"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___CasevacReport = CasevacReport +Global___CasevacReport: _TypeAlias = CasevacReport # noqa: Y015 -@typing.final -class ZMistEntry(google.protobuf.message.Message): +@_typing.final +class ZMistEntry(_message.Message): """ 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. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - TITLE_FIELD_NUMBER: builtins.int - Z_FIELD_NUMBER: builtins.int - M_FIELD_NUMBER: builtins.int - I_FIELD_NUMBER: builtins.int - S_FIELD_NUMBER: builtins.int - T_FIELD_NUMBER: builtins.int - title: builtins.str + TITLE_FIELD_NUMBER: _builtins.int + Z_FIELD_NUMBER: _builtins.int + M_FIELD_NUMBER: _builtins.int + I_FIELD_NUMBER: _builtins.int + S_FIELD_NUMBER: _builtins.int + T_FIELD_NUMBER: _builtins.int + title: _builtins.str """ Patient identifier / sequence label (e.g. "ZMIST-1", "ZMIST-2"). """ - z: builtins.str + z: _builtins.str """ Zap number - unique patient tracking ID (often a terse code like "Gunshot" or a serial). """ - m: builtins.str + m: _builtins.str """ Mechanism of injury (e.g. "Penetrating trauma", "Blast injury"). """ - i: builtins.str + i: _builtins.str """ Injuries observed (e.g. "Left thigh", "Concussion"). """ - s: builtins.str + s: _builtins.str """ Signs / vital stats (e.g. "Stable", "Priority", "BP 110/70"). """ - t: builtins.str + t: _builtins.str """ Treatment given (e.g. "Tourniquet 1810Z", "O2 administered"). """ def __init__( self, *, - title: builtins.str = ..., - z: builtins.str = ..., - m: builtins.str = ..., - i: builtins.str = ..., - s: builtins.str = ..., - t: builtins.str = ..., + title: _builtins.str = ..., + z: _builtins.str = ..., + m: _builtins.str = ..., + i: _builtins.str = ..., + s: _builtins.str = ..., + t: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["i", b"i", "m", b"m", "s", b"s", "t", b"t", "title", b"title", "z", b"z"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["i", b"i", "m", b"m", "s", b"s", "t", b"t", "title", b"title", "z", b"z"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ZMistEntry = ZMistEntry +Global___ZMistEntry: _TypeAlias = ZMistEntry # noqa: Y015 -@typing.final -class EmergencyAlert(google.protobuf.message.Message): +@_typing.final +class EmergencyAlert(_message.Message): """ Emergency alert / 911 beacon (CoT types b-a-o-tbl, b-a-o-pan, b-a-o-opn, b-a-o-can, b-a-o-c, b-a-g). @@ -3019,14 +2978,14 @@ class EmergencyAlert(google.protobuf.message.Message): the authoring unit and handle cancel-referencing without XML parsing. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Type: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _TypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[EmergencyAlert._Type.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _TypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[EmergencyAlert._Type.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Type_Unspecified: EmergencyAlert._Type.ValueType # 0 Type_Alert911: EmergencyAlert._Type.ValueType # 1 """b-a-o-tbl""" @@ -3056,20 +3015,20 @@ class EmergencyAlert(google.protobuf.message.Message): Type_Cancel: EmergencyAlert.Type.ValueType # 6 """b-a-o-can""" - TYPE_FIELD_NUMBER: builtins.int - AUTHORING_UID_FIELD_NUMBER: builtins.int - CANCEL_REFERENCE_UID_FIELD_NUMBER: builtins.int - type: global___EmergencyAlert.Type.ValueType + TYPE_FIELD_NUMBER: _builtins.int + AUTHORING_UID_FIELD_NUMBER: _builtins.int + CANCEL_REFERENCE_UID_FIELD_NUMBER: _builtins.int + type: Global___EmergencyAlert.Type.ValueType """ Alert discriminator. """ - authoring_uid: builtins.str + authoring_uid: _builtins.str """ UID of the unit that raised the alert. Often the same as - TAKPacketV2.uid but can be a parent device uid when a tracker raises + TAKPacket.uid but can be a parent device uid when a tracker raises an alert on behalf of a dismount. """ - cancel_reference_uid: builtins.str + cancel_reference_uid: _builtins.str """ For Type_Cancel: the uid of the alert being cancelled. Empty for non-cancel alert types. @@ -3077,16 +3036,20 @@ class EmergencyAlert(google.protobuf.message.Message): def __init__( self, *, - type: global___EmergencyAlert.Type.ValueType = ..., - authoring_uid: builtins.str = ..., - cancel_reference_uid: builtins.str = ..., + type: Global___EmergencyAlert.Type.ValueType = ..., + authoring_uid: _builtins.str = ..., + cancel_reference_uid: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["authoring_uid", b"authoring_uid", "cancel_reference_uid", b"cancel_reference_uid", "type", b"type"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["authoring_uid", b"authoring_uid", "cancel_reference_uid", b"cancel_reference_uid", "type", b"type"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___EmergencyAlert = EmergencyAlert +Global___EmergencyAlert: _TypeAlias = EmergencyAlert # noqa: Y015 -@typing.final -class TaskRequest(google.protobuf.message.Message): +@_typing.final +class TaskRequest(_message.Message): """ Task / engage request (CoT type t-s). @@ -3099,14 +3062,14 @@ class TaskRequest(google.protobuf.message.Message): than the others, so every string is capped in options. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Priority: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _PriorityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[TaskRequest._Priority.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _PriorityEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[TaskRequest._Priority.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Priority_Unspecified: TaskRequest._Priority.ValueType # 0 Priority_Low: TaskRequest._Priority.ValueType # 1 Priority_Normal: TaskRequest._Priority.ValueType # 2 @@ -3121,11 +3084,11 @@ class TaskRequest(google.protobuf.message.Message): Priority_Critical: TaskRequest.Priority.ValueType # 4 class _Status: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[TaskRequest._Status.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _StatusEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[TaskRequest._Status.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor Status_Unspecified: TaskRequest._Status.ValueType # 0 Status_Pending: TaskRequest._Status.ValueType # 1 """assigned, not yet acknowledged""" @@ -3151,29 +3114,29 @@ class TaskRequest(google.protobuf.message.Message): Status_Cancelled: TaskRequest.Status.ValueType # 5 """cancelled before completion""" - TASK_TYPE_FIELD_NUMBER: builtins.int - TARGET_UID_FIELD_NUMBER: builtins.int - ASSIGNEE_UID_FIELD_NUMBER: builtins.int - PRIORITY_FIELD_NUMBER: builtins.int - STATUS_FIELD_NUMBER: builtins.int - NOTE_FIELD_NUMBER: builtins.int - task_type: builtins.str + TASK_TYPE_FIELD_NUMBER: _builtins.int + TARGET_UID_FIELD_NUMBER: _builtins.int + ASSIGNEE_UID_FIELD_NUMBER: _builtins.int + PRIORITY_FIELD_NUMBER: _builtins.int + STATUS_FIELD_NUMBER: _builtins.int + NOTE_FIELD_NUMBER: _builtins.int + task_type: _builtins.str """ Short tag for the task category (e.g. "engage", "observe", "recon", "rescue"). Free text on the wire so ATAK-specific task taxonomies don't need proto coordination; capped tight in options. """ - target_uid: builtins.str + target_uid: _builtins.str """ UID of the target / map item being tasked. """ - assignee_uid: builtins.str + assignee_uid: _builtins.str """ UID of the assigned unit. Empty = unassigned / broadcast task. """ - priority: global___TaskRequest.Priority.ValueType - status: global___TaskRequest.Status.ValueType - note: builtins.str + priority: Global___TaskRequest.Priority.ValueType + status: Global___TaskRequest.Status.ValueType + note: _builtins.str """ Optional short note (reason, constraints, grid reference). Capped tight in options to keep the worst-case under the LoRa MTU. @@ -3181,23 +3144,27 @@ class TaskRequest(google.protobuf.message.Message): def __init__( self, *, - task_type: builtins.str = ..., - target_uid: builtins.str = ..., - assignee_uid: builtins.str = ..., - priority: global___TaskRequest.Priority.ValueType = ..., - status: global___TaskRequest.Status.ValueType = ..., - note: builtins.str = ..., + task_type: _builtins.str = ..., + target_uid: _builtins.str = ..., + assignee_uid: _builtins.str = ..., + priority: Global___TaskRequest.Priority.ValueType = ..., + status: Global___TaskRequest.Status.ValueType = ..., + note: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["assignee_uid", b"assignee_uid", "note", b"note", "priority", b"priority", "status", b"status", "target_uid", b"target_uid", "task_type", b"task_type"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["assignee_uid", b"assignee_uid", "note", b"note", "priority", b"priority", "status", b"status", "target_uid", b"target_uid", "task_type", b"task_type"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___TaskRequest = TaskRequest +Global___TaskRequest: _TypeAlias = TaskRequest # noqa: Y015 -@typing.final -class TAKEnvironment(google.protobuf.message.Message): +@_typing.final +class TAKEnvironment(_message.Message): """ Weather annotation from CoT detail element. - Attaches to any TAKPacketV2 regardless of payload_variant - an Aircraft, + Attaches to any TAKPacket 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 @@ -3210,45 +3177,51 @@ class TAKEnvironment(google.protobuf.message.Message): 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 - outer `TAKPacketV2` wrapper and is unambiguous across all target + outer `TAKPacket` wrapper and is unambiguous across all target languages (Swift, Kotlin, Python, TypeScript, C#). """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - TEMPERATURE_C_X10_FIELD_NUMBER: builtins.int - WIND_DIRECTION_DEG_FIELD_NUMBER: builtins.int - WIND_SPEED_CM_S_FIELD_NUMBER: builtins.int - temperature_c_x10: builtins.int + TEMPERATURE_C_CENTI_FIELD_NUMBER: _builtins.int + WIND_DIRECTION_DEG_FIELD_NUMBER: _builtins.int + WIND_SPEED_CM_S_FIELD_NUMBER: _builtins.int + temperature_c_centi: _builtins.int """ - Temperature in deci-degrees Celsius. 225 = 22.5°C. - Range covers -50°C to +50°C (-500 to +500) which spans every realistic - outdoor TAK deployment. sint32 because negative temps are common in + Temperature in centi-degrees Celsius, the scale SensorReadings uses for + AIR_TEMPERATURE_C_CENTI: 2250 = 22.50°C. CoT carries temperature as a plain + decimal attribute, so the scale is Meshtastic's alone. -50°C to +50°C + (-5000 to +5000) spans every realistic outdoor TAK deployment and still + encodes in two varint bytes. sint32 because negative temps are common in cold-weather ops. """ - wind_direction_deg: builtins.int + wind_direction_deg: _builtins.int """ Wind direction in whole degrees, 0-359. "Direction FROM" per meteorological convention (matches CoT / ATAK). """ - wind_speed_cm_s: builtins.int + wind_speed_cm_s: _builtins.int """ - Wind speed in cm/s. Matches the unit of TAKPacketV2.speed for + Wind speed in cm/s. Matches the unit of TAKPacket.speed for consistency. 1200 = 12.00 m/s = ~27 mph. """ def __init__( self, *, - temperature_c_x10: builtins.int = ..., - wind_direction_deg: builtins.int = ..., - wind_speed_cm_s: builtins.int = ..., + temperature_c_centi: _builtins.int = ..., + wind_direction_deg: _builtins.int = ..., + wind_speed_cm_s: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["temperature_c_x10", b"temperature_c_x10", "wind_direction_deg", b"wind_direction_deg", "wind_speed_cm_s", b"wind_speed_cm_s"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["temperature_c_centi", b"temperature_c_centi", "wind_direction_deg", b"wind_direction_deg", "wind_speed_cm_s", b"wind_speed_cm_s"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___TAKEnvironment = TAKEnvironment +Global___TAKEnvironment: _TypeAlias = TAKEnvironment # noqa: Y015 -@typing.final -class SensorFov(google.protobuf.message.Message): +@_typing.final +class SensorFov(_message.Message): """ Sensor field-of-view cone from CoT detail element. @@ -3259,19 +3232,19 @@ 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 TAKPacket - 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). """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _SensorType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _SensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SensorFov._SensorType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _SensorTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SensorFov._SensorType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor SensorType_Unspecified: SensorFov._SensorType.ValueType # 0 SensorType_Camera: SensorFov._SensorType.ValueType # 1 """daylight / general optical""" @@ -3305,47 +3278,47 @@ class SensorFov(google.protobuf.message.Message): """radio/radar direction-finding""" SensorType_Other: SensorFov.SensorType.ValueType # 6 - TYPE_FIELD_NUMBER: builtins.int - AZIMUTH_DEG_FIELD_NUMBER: builtins.int - RANGE_M_FIELD_NUMBER: builtins.int - FOV_HORIZONTAL_DEG_FIELD_NUMBER: builtins.int - FOV_VERTICAL_DEG_FIELD_NUMBER: builtins.int - ELEVATION_DEG_FIELD_NUMBER: builtins.int - ROLL_DEG_FIELD_NUMBER: builtins.int - MODEL_FIELD_NUMBER: builtins.int - type: global___SensorFov.SensorType.ValueType - azimuth_deg: builtins.int + TYPE_FIELD_NUMBER: _builtins.int + AZIMUTH_DEG_FIELD_NUMBER: _builtins.int + RANGE_M_FIELD_NUMBER: _builtins.int + FOV_HORIZONTAL_DEG_FIELD_NUMBER: _builtins.int + FOV_VERTICAL_DEG_FIELD_NUMBER: _builtins.int + ELEVATION_DEG_FIELD_NUMBER: _builtins.int + ROLL_DEG_FIELD_NUMBER: _builtins.int + MODEL_FIELD_NUMBER: _builtins.int + type: Global___SensorFov.SensorType.ValueType + azimuth_deg: _builtins.int """ Azimuth in whole degrees, 0-359. "Pointing direction" of the cone axis, measured clockwise from true north. Whole degrees match ATAK-CIV's SensorDetailHandler default (270°) and save varint bytes over centi-deg. """ - range_m: builtins.int + range_m: _builtins.int """ Maximum range of the cone in meters. Optional - if unset, receivers should use the ATAK-CIV default of 100m. """ - fov_horizontal_deg: builtins.int + fov_horizontal_deg: _builtins.int """ Horizontal field of view in whole degrees (cone's angular width). ATAK-CIV default is 45°. """ - fov_vertical_deg: builtins.int + 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". """ - elevation_deg: builtins.int + elevation_deg: _builtins.int """ Elevation angle in whole degrees. Positive = up, negative = down. Range -90 to +90. sint32 for varint efficiency on small negatives. """ - roll_deg: builtins.int + roll_deg: _builtins.int """ Roll (camera tilt) in whole degrees, -180 to +180. Optional - use 0 if the sensor doesn't track roll. """ - model: builtins.str + model: _builtins.str """ Free-form device model identifier, e.g. "FLIR-Boson-640", "SEEK". Optional - empty string means "unknown model" (ATAK-CIV default). @@ -3353,23 +3326,27 @@ class SensorFov(google.protobuf.message.Message): def __init__( self, *, - type: global___SensorFov.SensorType.ValueType = ..., - azimuth_deg: builtins.int = ..., - range_m: builtins.int | None = ..., - fov_horizontal_deg: builtins.int = ..., - fov_vertical_deg: builtins.int = ..., - elevation_deg: builtins.int = ..., - roll_deg: builtins.int = ..., - model: builtins.str = ..., + type: Global___SensorFov.SensorType.ValueType = ..., + azimuth_deg: _builtins.int = ..., + range_m: _builtins.int | None = ..., + fov_horizontal_deg: _builtins.int = ..., + fov_vertical_deg: _builtins.int = ..., + elevation_deg: _builtins.int = ..., + roll_deg: _builtins.int = ..., + model: _builtins.str = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_range_m", b"_range_m", "range_m", b"range_m"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_range_m", b"_range_m", "azimuth_deg", b"azimuth_deg", "elevation_deg", b"elevation_deg", "fov_horizontal_deg", b"fov_horizontal_deg", "fov_vertical_deg", b"fov_vertical_deg", "model", b"model", "range_m", b"range_m", "roll_deg", b"roll_deg", "type", b"type"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_range_m", b"_range_m"]) -> typing.Literal["range_m"] | None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_range_m", b"_range_m", "range_m", b"range_m"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_range_m", b"_range_m", "azimuth_deg", b"azimuth_deg", "elevation_deg", b"elevation_deg", "fov_horizontal_deg", b"fov_horizontal_deg", "fov_vertical_deg", b"fov_vertical_deg", "model", b"model", "range_m", b"range_m", "roll_deg", b"roll_deg", "type", b"type"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__range_m: _TypeAlias = _typing.Literal["range_m"] # noqa: Y015 + _WhichOneofArgType__range_m: _TypeAlias = _typing.Literal["_range_m", b"_range_m"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__range_m) -> _WhichOneofReturnType__range_m | None: ... -global___SensorFov = SensorFov +Global___SensorFov: _TypeAlias = SensorFov # noqa: Y015 -@typing.final -class TakTalkMessage(google.protobuf.message.Message): +@_typing.final +class TakTalkMessage(_message.Message): """ TAKTALK chat message payload (CoT type m-t-t). @@ -3380,37 +3357,37 @@ class TakTalkMessage(google.protobuf.message.Message): next to the text. Wire shape inside /: - ... - mapped to TAKPacketV2.callsign + ... - mapped to TAKPacket.callsign English - lang ... - text 1 - chatroom_id - presence sets from_voice = true """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - TEXT_FIELD_NUMBER: builtins.int - CHATROOM_ID_FIELD_NUMBER: builtins.int - LANG_FIELD_NUMBER: builtins.int - FROM_VOICE_FIELD_NUMBER: builtins.int - text: builtins.str + TEXT_FIELD_NUMBER: _builtins.int + CHATROOM_ID_FIELD_NUMBER: _builtins.int + LANG_FIELD_NUMBER: _builtins.int + FROM_VOICE_FIELD_NUMBER: _builtins.int + text: _builtins.str """ The text body of the TAKTALK message (speech-to-text transcript when from_voice = true, typed message otherwise). """ - chatroom_id: builtins.str + chatroom_id: _builtins.str """ TAKTALK chatroom identifier. May be a short id like "1" for the default room or a UUID like "30b2755c-c547-44ef-a0cc-cdbd8a15616f" for custom rooms (resolved by TakTalkRoomData broadcasts). Empty = broadcast room. """ - lang: builtins.str + lang: _builtins.str """ BCP-47-ish language tag or human-readable name (e.g. "en", "English"). Empty = unspecified. """ - from_voice: builtins.bool + from_voice: _builtins.bool """ True when the source CoT carried a marker, i.e. the message originated as push-to-talk speech-to-text. Lets receivers show a mic @@ -3419,17 +3396,21 @@ class TakTalkMessage(google.protobuf.message.Message): def __init__( self, *, - text: builtins.str = ..., - chatroom_id: builtins.str = ..., - lang: builtins.str = ..., - from_voice: builtins.bool = ..., + text: _builtins.str = ..., + chatroom_id: _builtins.str = ..., + lang: _builtins.str = ..., + from_voice: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["chatroom_id", b"chatroom_id", "from_voice", b"from_voice", "lang", b"lang", "text", b"text"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["chatroom_id", b"chatroom_id", "from_voice", b"from_voice", "lang", b"lang", "text", b"text"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___TakTalkMessage = TakTalkMessage +Global___TakTalkMessage: _TypeAlias = TakTalkMessage # noqa: Y015 -@typing.final -class TakTalkRoomData(google.protobuf.message.Message): +@_typing.final +class TakTalkRoomData(_message.Message): """ TAKTALK room/membership broadcast (CoT type y-). @@ -3440,33 +3421,49 @@ class TakTalkRoomData(google.protobuf.message.Message): created or memberships change. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - SENDER_CALLSIGN_FIELD_NUMBER: builtins.int - ROOM_ID_FIELD_NUMBER: builtins.int - ROOM_NAME_FIELD_NUMBER: builtins.int - PARTICIPANTS_FIELD_NUMBER: builtins.int - sender_callsign: builtins.str - """ - Callsign of the device broadcasting the room state (typically the - room owner / latest writer). + SENDER_CALLSIGN_FIELD_NUMBER: _builtins.int + ROOM_ID_FIELD_NUMBER: _builtins.int + ROOM_NAME_FIELD_NUMBER: _builtins.int + PARTICIPANTS_FIELD_NUMBER: _builtins.int + @_builtins.property + @_deprecated("""This field has been marked as deprecated using proto field options.""") + def sender_callsign(self) -> _builtins.str: + """ + Callsign of the device broadcasting the room state (typically the + room owner / latest writer). - DEPRECATED in v0.3.2: always equals TAKPacketV2.callsign, so the wire - byte was redundant. Builders stop emitting this field in v0.3.2; - parsers still read it for one release so v0.3.1-encoded packets decode - cleanly. To be removed entirely in v0.4.x. - """ - room_id: builtins.str + DEPRECATED in v0.3.2: always equals TAKPacket.callsign, so the wire + byte was redundant. Builders stop emitting this field in v0.3.2; + parsers still read it for one release so v0.3.1-encoded packets decode + cleanly. To be removed entirely in v0.4.x. + """ + + @sender_callsign.setter + @_deprecated("""This field has been marked as deprecated using proto field options.""") + def sender_callsign(self, value: _builtins.str) -> None: + """ + Callsign of the device broadcasting the room state (typically the + room owner / latest writer). + + DEPRECATED in v0.3.2: always equals TAKPacket.callsign, so the wire + byte was redundant. Builders stop emitting this field in v0.3.2; + parsers still read it for one release so v0.3.1-encoded packets decode + cleanly. To be removed entirely in v0.4.x. + """ + + room_id: _builtins.str """ Room UUID, matches TakTalkMessage.chatroom_id / GeoChat.room_id on messages routed into this room. """ - room_name: builtins.str + room_name: _builtins.str """ Friendly display name for the room (e.g. "test", "Alpha Team"). """ - @property - def participants(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + @_builtins.property + def participants(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: """ Member callsigns. Wire-encoded as repeated strings; the underlying CoT carries them as a single A,B,C element @@ -3476,17 +3473,21 @@ class TakTalkRoomData(google.protobuf.message.Message): def __init__( self, *, - sender_callsign: builtins.str = ..., - room_id: builtins.str = ..., - room_name: builtins.str = ..., - participants: collections.abc.Iterable[builtins.str] | None = ..., + sender_callsign: _builtins.str = ..., + room_id: _builtins.str = ..., + room_name: _builtins.str = ..., + participants: _abc.Iterable[_builtins.str] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["participants", b"participants", "room_id", b"room_id", "room_name", b"room_name", "sender_callsign", b"sender_callsign"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["participants", b"participants", "room_id", b"room_id", "room_name", b"room_name", "sender_callsign", b"sender_callsign"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___TakTalkRoomData = TakTalkRoomData +Global___TakTalkRoomData: _TypeAlias = TakTalkRoomData # noqa: Y015 -@typing.final -class Marti(google.protobuf.message.Message): +@_typing.final +class Marti(_message.Message): """ ATAK directed-routing recipient list (CoT …). @@ -3502,16 +3503,16 @@ class Marti(google.protobuf.message.Message): dest_callsign on emit. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - DEST_CALLSIGN_FIELD_NUMBER: builtins.int - @property - def dest_callsign(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + DEST_CALLSIGN_FIELD_NUMBER: _builtins.int + @_builtins.property + def dest_callsign(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: """ Recipient callsigns. Order is preserved end-to-end so receivers can show primary-vs-cc distinction the same way ATAK does. - If dest_callsign is [TAKPacketV2.callsign] (self-addressed, unusual but + If dest_callsign is [TAKPacket.callsign] (self-addressed, unusual but legal - e.g. ATAK echoing back to its own room), the builder still emits the element so loopback shapes round-trip cleanly. """ @@ -3519,92 +3520,97 @@ class Marti(google.protobuf.message.Message): def __init__( self, *, - dest_callsign: collections.abc.Iterable[builtins.str] | None = ..., + dest_callsign: _abc.Iterable[_builtins.str] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["dest_callsign", b"dest_callsign"]) -> None: ... - -global___Marti = Marti - -@typing.final -class TAKPacketV2(google.protobuf.message.Message): - """ - ATAK v2 packet with expanded CoT field support and zstd dictionary compression. - Sent on ATAK_PLUGIN_V2 port. The wire payload is: - [1 byte flags][zstd-compressed TAKPacketV2 protobuf] - Flags byte: bits 0-5 = dictionary ID, bits 6-7 = reserved. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - COT_TYPE_ID_FIELD_NUMBER: builtins.int - HOW_FIELD_NUMBER: builtins.int - CALLSIGN_FIELD_NUMBER: builtins.int - TEAM_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - ALTITUDE_FIELD_NUMBER: builtins.int - SPEED_FIELD_NUMBER: builtins.int - COURSE_FIELD_NUMBER: builtins.int - BATTERY_FIELD_NUMBER: builtins.int - GEO_SRC_FIELD_NUMBER: builtins.int - ALT_SRC_FIELD_NUMBER: builtins.int - UID_FIELD_NUMBER: builtins.int - DEVICE_CALLSIGN_FIELD_NUMBER: builtins.int - STALE_SECONDS_FIELD_NUMBER: builtins.int - TAK_VERSION_FIELD_NUMBER: builtins.int - TAK_DEVICE_FIELD_NUMBER: builtins.int - TAK_PLATFORM_FIELD_NUMBER: builtins.int - TAK_OS_FIELD_NUMBER: builtins.int - ENDPOINT_FIELD_NUMBER: builtins.int - PHONE_FIELD_NUMBER: builtins.int - COT_TYPE_STR_FIELD_NUMBER: builtins.int - REMARKS_FIELD_NUMBER: builtins.int - ENVIRONMENT_FIELD_NUMBER: builtins.int - SENSOR_FOV_FIELD_NUMBER: builtins.int - MARTI_FIELD_NUMBER: builtins.int - CHAT_FIELD_NUMBER: builtins.int - AIRCRAFT_FIELD_NUMBER: builtins.int - RAW_DETAIL_FIELD_NUMBER: builtins.int - SHAPE_FIELD_NUMBER: builtins.int - MARKER_FIELD_NUMBER: builtins.int - RAB_FIELD_NUMBER: builtins.int - ROUTE_FIELD_NUMBER: builtins.int - CASEVAC_FIELD_NUMBER: builtins.int - EMERGENCY_FIELD_NUMBER: builtins.int - TASK_FIELD_NUMBER: builtins.int - TAKTALK_FIELD_NUMBER: builtins.int - TAKTALK_ROOM_FIELD_NUMBER: builtins.int - cot_type_id: global___CotType.ValueType + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["dest_callsign", b"dest_callsign"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___Marti: _TypeAlias = Marti # noqa: Y015 + +@_typing.final +class TAKPacket(_message.Message): + """ + A Cursor on Target event from the ATAK plugin, an app or a TAK tracker node, sent + on the ATAK_PLUGIN port. The wire payload is a flags byte, then this message: + [1 byte flags][TAKPacket protobuf] + Flags 0xFF: the protobuf is uncompressed. Otherwise bits 0-5 are the zstd + dictionary ID the protobuf is compressed with, and bits 6-7 are reserved. + """ + + DESCRIPTOR: _descriptor.Descriptor + + COT_TYPE_ID_FIELD_NUMBER: _builtins.int + HOW_FIELD_NUMBER: _builtins.int + CALLSIGN_FIELD_NUMBER: _builtins.int + TEAM_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + LATITUDE_I_FIELD_NUMBER: _builtins.int + LONGITUDE_I_FIELD_NUMBER: _builtins.int + ALTITUDE_FIELD_NUMBER: _builtins.int + SPEED_FIELD_NUMBER: _builtins.int + COURSE_FIELD_NUMBER: _builtins.int + BATTERY_FIELD_NUMBER: _builtins.int + GEO_SRC_FIELD_NUMBER: _builtins.int + ALT_SRC_FIELD_NUMBER: _builtins.int + UID_FIELD_NUMBER: _builtins.int + DEVICE_CALLSIGN_FIELD_NUMBER: _builtins.int + STALE_SECONDS_FIELD_NUMBER: _builtins.int + TAK_VERSION_FIELD_NUMBER: _builtins.int + TAK_DEVICE_FIELD_NUMBER: _builtins.int + TAK_PLATFORM_FIELD_NUMBER: _builtins.int + TAK_OS_FIELD_NUMBER: _builtins.int + ENDPOINT_FIELD_NUMBER: _builtins.int + PHONE_FIELD_NUMBER: _builtins.int + COT_TYPE_STR_FIELD_NUMBER: _builtins.int + REMARKS_FIELD_NUMBER: _builtins.int + ENVIRONMENT_FIELD_NUMBER: _builtins.int + SENSOR_FOV_FIELD_NUMBER: _builtins.int + MARTI_FIELD_NUMBER: _builtins.int + CHAT_FIELD_NUMBER: _builtins.int + AIRCRAFT_FIELD_NUMBER: _builtins.int + RAW_DETAIL_FIELD_NUMBER: _builtins.int + SHAPE_FIELD_NUMBER: _builtins.int + MARKER_FIELD_NUMBER: _builtins.int + RAB_FIELD_NUMBER: _builtins.int + ROUTE_FIELD_NUMBER: _builtins.int + CASEVAC_FIELD_NUMBER: _builtins.int + EMERGENCY_FIELD_NUMBER: _builtins.int + TASK_FIELD_NUMBER: _builtins.int + TAKTALK_FIELD_NUMBER: _builtins.int + TAKTALK_ROOM_FIELD_NUMBER: _builtins.int + cot_type_id: Global___CotType.ValueType """ Well-known CoT event type enum. Use CotType_Other with cot_type_str for unknown types. """ - how: global___CotHow.ValueType + how: Global___CotHow.ValueType """ How the coordinates were generated """ - callsign: builtins.str + callsign: _builtins.str """ Callsign """ - team: global___Team.ValueType + team: Global___Team.ValueType """ Team color assignment """ - role: global___MemberRole.ValueType + role: Global___MemberRole.ValueType """ Role of the group member """ - latitude_i: builtins.int + latitude_i: _builtins.int """ Latitude, multiply by 1e-7 to get degrees in floating point """ - longitude_i: builtins.int + longitude_i: _builtins.int """ Longitude, multiply by 1e-7 to get degrees in floating point """ - altitude: builtins.int + altitude: _builtins.int """ Altitude in meters (HAE). ATAK's "no altitude" sentinel is hae=9999999.0. @@ -3615,67 +3621,67 @@ class TAKPacketV2(google.protobuf.message.Message): carry hae="0.0" or omit hae → parsed as 0) to encode explicitly (+2 bytes), which REGRESSED the worst-case route fixture. Kept as a plain field. """ - speed: builtins.int + speed: _builtins.int """ Speed in cm/s """ - course: builtins.int + course: _builtins.int """ Course in degrees * 100 (0-36000) """ - battery: builtins.int + battery: _builtins.int """ Battery level 0-100 """ - geo_src: global___GeoPointSource.ValueType + geo_src: Global___GeoPointSource.ValueType """ Geopoint source """ - alt_src: global___GeoPointSource.ValueType + alt_src: Global___GeoPointSource.ValueType """ Altitude source """ - uid: builtins.str + uid: _builtins.str """ Device UID (UUID string or device ID like "ANDROID-xxxx") """ - device_callsign: builtins.str + device_callsign: _builtins.str """ Device callsign """ - stale_seconds: builtins.int + stale_seconds: _builtins.int """ Stale time as seconds offset from event time """ - tak_version: builtins.str + tak_version: _builtins.str """ TAK client version string """ - tak_device: builtins.str + tak_device: _builtins.str """ TAK device model """ - tak_platform: builtins.str + tak_platform: _builtins.str """ TAK platform (ATAK-CIV, WebTAK, etc.) """ - tak_os: builtins.str + tak_os: _builtins.str """ TAK OS version """ - endpoint: builtins.str + endpoint: _builtins.str """ Connection endpoint """ - phone: builtins.str + phone: _builtins.str """ Phone number """ - cot_type_str: builtins.str + cot_type_str: _builtins.str """ CoT event type string, only populated when cot_type_id is CotType_Other """ - remarks: builtins.str + remarks: _builtins.str """ Optional remarks / free-text annotation from the element. Populated for non-GeoChat payload types (shapes, markers, routes, etc.) @@ -3683,14 +3689,14 @@ class TAKPacketV2(google.protobuf.message.Message): GeoChat messages carry their text in GeoChat.message instead. Empty string (proto3 default) means no remarks were present. """ - raw_detail: builtins.bytes + raw_detail: _builtins.bytes """ Generic CoT detail XML for unmapped types. Kept as a fallback for CoT types not yet promoted to a typed variant; drawings, markers, ranging tools, and routes have dedicated variants below and should not land here. """ - @property - def environment(self) -> global___TAKEnvironment: + @_builtins.property + def environment(self) -> Global___TAKEnvironment: """--- Sensor / environment annotations ---------------------------------- Both fields are OPTIONAL and attach to any payload_variant. They @@ -3704,14 +3710,14 @@ class TAKPacketV2(google.protobuf.message.Message): SwiftUI's `@Environment` property wrapper in iOS consumers. """ - @property - def sensor_fov(self) -> global___SensorFov: + @_builtins.property + def sensor_fov(self) -> Global___SensorFov: """ Sensor field-of-view cone (camera, FLIR, laser, etc.). From . """ - @property - def marti(self) -> global___Marti: + @_builtins.property + def marti(self) -> Global___Marti: """ Directed-routing recipient list (CoT …). Empty / unset = broadcast to all peers (the default for situational-awareness @@ -3723,72 +3729,72 @@ class TAKPacketV2(google.protobuf.message.Message): See Marti. """ - @property - def chat(self) -> global___GeoChat: + @_builtins.property + def chat(self) -> Global___GeoChat: """ ATAK GeoChat message """ - @property - def aircraft(self) -> global___AircraftTrack: + @_builtins.property + def aircraft(self) -> Global___AircraftTrack: """ Aircraft track data (ADS-B, military air) """ - @property - def shape(self) -> global___DrawnShape: + @_builtins.property + def shape(self) -> Global___DrawnShape: """ User-drawn tactical graphic: circle, rectangle, polygon, polyline, telestration, ranging circle, or bullseye. See DrawnShape. """ - @property - def marker(self) -> global___Marker: + @_builtins.property + def marker(self) -> Global___Marker: """ Fixed point of interest: spot marker, waypoint, checkpoint, 2525 symbol, or custom icon. See Marker. """ - @property - def rab(self) -> global___RangeAndBearing: + @_builtins.property + def rab(self) -> Global___RangeAndBearing: """ Range and bearing measurement line. See RangeAndBearing. """ - @property - def route(self) -> global___Route: + @_builtins.property + def route(self) -> Global___Route: """ Named route with ordered waypoints and control points. See Route. """ - @property - def casevac(self) -> global___CasevacReport: + @_builtins.property + def casevac(self) -> Global___CasevacReport: """ 9-line MEDEVAC request. See CasevacReport. """ - @property - def emergency(self) -> global___EmergencyAlert: + @_builtins.property + def emergency(self) -> Global___EmergencyAlert: """ Emergency beacon / 911 alert. See EmergencyAlert. """ - @property - def task(self) -> global___TaskRequest: + @_builtins.property + def task(self) -> Global___TaskRequest: """ Task / engage request. See TaskRequest. """ - @property - def taktalk(self) -> global___TakTalkMessage: + @_builtins.property + def taktalk(self) -> Global___TakTalkMessage: """ TAKTALK chat message (CoT type m-t-t). See TakTalkMessage. Voice audio itself rides UDP/RTP outside the mesh; this carries the text envelope plus a from_voice marker for receiver UX. """ - @property - def taktalk_room(self) -> global___TakTalkRoomData: + @_builtins.property + def taktalk_room(self) -> Global___TakTalkRoomData: """ TAKTALK room/membership broadcast (CoT type y-). See TakTalkRoomData. Resolves room UUIDs (used in TakTalkMessage.chatroom_id and @@ -3798,55 +3804,65 @@ class TAKPacketV2(google.protobuf.message.Message): def __init__( self, *, - cot_type_id: global___CotType.ValueType = ..., - how: global___CotHow.ValueType = ..., - callsign: builtins.str = ..., - team: global___Team.ValueType = ..., - role: global___MemberRole.ValueType = ..., - latitude_i: builtins.int = ..., - longitude_i: builtins.int = ..., - altitude: builtins.int = ..., - speed: builtins.int = ..., - course: builtins.int = ..., - battery: builtins.int = ..., - geo_src: global___GeoPointSource.ValueType = ..., - alt_src: global___GeoPointSource.ValueType = ..., - uid: builtins.str = ..., - device_callsign: builtins.str = ..., - stale_seconds: builtins.int = ..., - tak_version: builtins.str = ..., - tak_device: builtins.str = ..., - tak_platform: builtins.str = ..., - tak_os: builtins.str = ..., - endpoint: builtins.str = ..., - phone: builtins.str = ..., - cot_type_str: builtins.str = ..., - remarks: builtins.str = ..., - environment: global___TAKEnvironment | None = ..., - sensor_fov: global___SensorFov | None = ..., - marti: global___Marti | None = ..., - chat: global___GeoChat | None = ..., - aircraft: global___AircraftTrack | None = ..., - raw_detail: builtins.bytes = ..., - shape: global___DrawnShape | None = ..., - marker: global___Marker | None = ..., - rab: global___RangeAndBearing | None = ..., - route: global___Route | None = ..., - casevac: global___CasevacReport | None = ..., - emergency: global___EmergencyAlert | None = ..., - task: global___TaskRequest | None = ..., - taktalk: global___TakTalkMessage | None = ..., - taktalk_room: global___TakTalkRoomData | None = ..., + cot_type_id: Global___CotType.ValueType = ..., + how: Global___CotHow.ValueType = ..., + callsign: _builtins.str = ..., + team: Global___Team.ValueType = ..., + role: Global___MemberRole.ValueType = ..., + latitude_i: _builtins.int = ..., + longitude_i: _builtins.int = ..., + altitude: _builtins.int = ..., + speed: _builtins.int = ..., + course: _builtins.int = ..., + battery: _builtins.int = ..., + geo_src: Global___GeoPointSource.ValueType = ..., + alt_src: Global___GeoPointSource.ValueType = ..., + uid: _builtins.str = ..., + device_callsign: _builtins.str = ..., + stale_seconds: _builtins.int = ..., + tak_version: _builtins.str = ..., + tak_device: _builtins.str = ..., + tak_platform: _builtins.str = ..., + tak_os: _builtins.str = ..., + endpoint: _builtins.str = ..., + phone: _builtins.str = ..., + cot_type_str: _builtins.str = ..., + remarks: _builtins.str = ..., + environment: Global___TAKEnvironment | None = ..., + sensor_fov: Global___SensorFov | None = ..., + marti: Global___Marti | None = ..., + chat: Global___GeoChat | None = ..., + aircraft: Global___AircraftTrack | None = ..., + raw_detail: _builtins.bytes = ..., + shape: Global___DrawnShape | None = ..., + marker: Global___Marker | None = ..., + rab: Global___RangeAndBearing | None = ..., + route: Global___Route | None = ..., + casevac: Global___CasevacReport | None = ..., + emergency: Global___EmergencyAlert | None = ..., + task: Global___TaskRequest | None = ..., + taktalk: Global___TakTalkMessage | None = ..., + taktalk_room: Global___TakTalkRoomData | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_environment", b"_environment", "_marti", b"_marti", "_sensor_fov", b"_sensor_fov", "aircraft", b"aircraft", "casevac", b"casevac", "chat", b"chat", "emergency", b"emergency", "environment", b"environment", "marker", b"marker", "marti", b"marti", "payload_variant", b"payload_variant", "rab", b"rab", "raw_detail", b"raw_detail", "route", b"route", "sensor_fov", b"sensor_fov", "shape", b"shape", "taktalk", b"taktalk", "taktalk_room", b"taktalk_room", "task", b"task"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_environment", b"_environment", "_marti", b"_marti", "_sensor_fov", b"_sensor_fov", "aircraft", b"aircraft", "alt_src", b"alt_src", "altitude", b"altitude", "battery", b"battery", "callsign", b"callsign", "casevac", b"casevac", "chat", b"chat", "cot_type_id", b"cot_type_id", "cot_type_str", b"cot_type_str", "course", b"course", "device_callsign", b"device_callsign", "emergency", b"emergency", "endpoint", b"endpoint", "environment", b"environment", "geo_src", b"geo_src", "how", b"how", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "marker", b"marker", "marti", b"marti", "payload_variant", b"payload_variant", "phone", b"phone", "rab", b"rab", "raw_detail", b"raw_detail", "remarks", b"remarks", "role", b"role", "route", b"route", "sensor_fov", b"sensor_fov", "shape", b"shape", "speed", b"speed", "stale_seconds", b"stale_seconds", "tak_device", b"tak_device", "tak_os", b"tak_os", "tak_platform", b"tak_platform", "tak_version", b"tak_version", "taktalk", b"taktalk", "taktalk_room", b"taktalk_room", "task", b"task", "team", b"team", "uid", b"uid"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_environment", b"_environment"]) -> typing.Literal["environment"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_marti", b"_marti"]) -> typing.Literal["marti"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_sensor_fov", b"_sensor_fov"]) -> typing.Literal["sensor_fov"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["chat", "aircraft", "raw_detail", "shape", "marker", "rab", "route", "casevac", "emergency", "task", "taktalk", "taktalk_room"] | None: ... - -global___TAKPacketV2 = TAKPacketV2 + _HasFieldArgType: _TypeAlias = _typing.Literal["_environment", b"_environment", "_marti", b"_marti", "_sensor_fov", b"_sensor_fov", "aircraft", b"aircraft", "casevac", b"casevac", "chat", b"chat", "emergency", b"emergency", "environment", b"environment", "marker", b"marker", "marti", b"marti", "payload_variant", b"payload_variant", "rab", b"rab", "raw_detail", b"raw_detail", "route", b"route", "sensor_fov", b"sensor_fov", "shape", b"shape", "taktalk", b"taktalk", "taktalk_room", b"taktalk_room", "task", b"task"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_environment", b"_environment", "_marti", b"_marti", "_sensor_fov", b"_sensor_fov", "aircraft", b"aircraft", "alt_src", b"alt_src", "altitude", b"altitude", "battery", b"battery", "callsign", b"callsign", "casevac", b"casevac", "chat", b"chat", "cot_type_id", b"cot_type_id", "cot_type_str", b"cot_type_str", "course", b"course", "device_callsign", b"device_callsign", "emergency", b"emergency", "endpoint", b"endpoint", "environment", b"environment", "geo_src", b"geo_src", "how", b"how", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "marker", b"marker", "marti", b"marti", "payload_variant", b"payload_variant", "phone", b"phone", "rab", b"rab", "raw_detail", b"raw_detail", "remarks", b"remarks", "role", b"role", "route", b"route", "sensor_fov", b"sensor_fov", "shape", b"shape", "speed", b"speed", "stale_seconds", b"stale_seconds", "tak_device", b"tak_device", "tak_os", b"tak_os", "tak_platform", b"tak_platform", "tak_version", b"tak_version", "taktalk", b"taktalk", "taktalk_room", b"taktalk_room", "task", b"task", "team", b"team", "uid", b"uid"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__environment: _TypeAlias = _typing.Literal["environment"] # noqa: Y015 + _WhichOneofArgType__environment: _TypeAlias = _typing.Literal["_environment", b"_environment"] # noqa: Y015 + _WhichOneofReturnType__marti: _TypeAlias = _typing.Literal["marti"] # noqa: Y015 + _WhichOneofArgType__marti: _TypeAlias = _typing.Literal["_marti", b"_marti"] # noqa: Y015 + _WhichOneofReturnType__sensor_fov: _TypeAlias = _typing.Literal["sensor_fov"] # noqa: Y015 + _WhichOneofArgType__sensor_fov: _TypeAlias = _typing.Literal["_sensor_fov", b"_sensor_fov"] # noqa: Y015 + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["chat", "aircraft", "raw_detail", "shape", "marker", "rab", "route", "casevac", "emergency", "task", "taktalk", "taktalk_room"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__environment) -> _WhichOneofReturnType__environment | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__marti) -> _WhichOneofReturnType__marti | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__sensor_fov) -> _WhichOneofReturnType__sensor_fov | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___TAKPacket: _TypeAlias = TAKPacket # noqa: Y015 diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py new file mode 100644 index 000000000..8e59e45c7 --- /dev/null +++ b/meshtastic/protobuf/bitfields.py @@ -0,0 +1,204 @@ +"""Generated by bin/gen_bitfields.py from the protobufs submodule -- do not edit. + +The named bits of every packed bitfield: {message: {bit name: (field, mask)}}, with the +message named by its path inside the package. Names match the firmware accessors. +""" + +BITFIELDS = {'CannedMessageConfig': {'rotary1': ('flags', 1), + 'send_bell': ('flags', 4), + 'updown1': ('flags', 2)}, + 'CasevacReport': {'blood': ('equipment_flags', 16), + 'extraction': ('equipment_flags', 4), + 'hoist': ('equipment_flags', 2), + 'loose': ('terrain_flags', 4), + 'none': ('equipment_flags', 1), + 'other': ('terrain_flags', 32), + 'rough': ('terrain_flags', 2), + 'slope': ('terrain_flags', 1), + 'trees': ('terrain_flags', 8), + 'ventilator': ('equipment_flags', 8), + 'wires': ('terrain_flags', 16)}, + 'Data': {'ok_to_mqtt': ('bitfield', 1), 'want_response': ('bitfield', 2)}, + 'DetectionSensorConfig': {'enabled': ('flags', 1), + 'send_bell': ('flags', 2), + 'use_pullup': ('flags', 4)}, + 'DeviceConfig': {'auto_mute_disabled': ('flags', 8), + 'disable_triple_click': ('flags', 2), + 'double_tap_as_button_press': ('flags', 1), + 'led_heartbeat_disabled': ('flags', 4), + 'no_taper': ('discovery_flags', 2), + 'serve': ('discovery_flags', 1)}, + 'DeviceMetadata': {'altitude': ('position_flags', 1), + 'can_shutdown': ('capabilities', 1), + 'dop': ('position_flags', 8), + 'geoidal_separation': ('position_flags', 4), + 'has_bluetooth': ('capabilities', 4), + 'has_ethernet': ('capabilities', 8), + 'has_pkc': ('capabilities', 32), + 'has_remote_hardware': ('capabilities', 16), + 'has_wifi': ('capabilities', 2), + 'has_xeddsa': ('capabilities', 64), + 'heading': ('position_flags', 256), + 'satinview': ('position_flags', 32), + 'seq_no': ('position_flags', 64), + 'speed': ('position_flags', 512)}, + 'DeviceUIConfig': {'alert_enabled': ('flags', 4), + 'banner_enabled': ('flags', 8), + 'is_clockface_analog': ('flags', 16), + 'screen_lock': ('flags', 1), + 'settings_lock': ('flags', 2)}, + 'DisplayConfig': {'enable_message_bubbles': ('flags', 32), + 'flip_screen': ('flags', 1), + 'heading_bold': ('flags', 2), + 'imperial_units': ('flags', 64), + 'use_12h_clock': ('flags', 8), + 'use_long_node_name': ('flags', 16), + 'wake_on_tap_or_motion': ('flags', 4)}, + 'DrawnShape': {'edge_to_center': ('bullseye_flags', 4), + 'has_range_rings': ('bullseye_flags', 2), + 'mils': ('bullseye_flags', 8), + 'range_ring_visible': ('bullseye_flags', 1)}, + 'ExternalNotificationConfig': {'active': ('alert_flags', 1), + 'bell': ('alert_flags', 16), + 'bell_buzzer': ('alert_flags', 64), + 'bell_vibra': ('alert_flags', 32), + 'message': ('alert_flags', 2), + 'message_buzzer': ('alert_flags', 8), + 'message_vibra': ('alert_flags', 4), + 'use_i2s_as_buzzer': ('alert_flags', 256), + 'use_pwm': ('alert_flags', 128)}, + 'HeaderOptions': {'anycast': ('hop_flags', 4), + 'no_learn': ('hop_flags', 1), + 'store': ('hop_flags', 2)}, + 'LoRaConfig': {'config_ok_to_mqtt': ('flags', 64), + 'ignore_mqtt': ('flags', 32), + 'override_duty_cycle': ('flags', 4), + 'pa_fan_disabled': ('flags', 16), + 'serial_hal_only': ('flags', 128), + 'sx126x_rx_boosted_gain': ('flags', 8), + 'tx_enabled': ('flags', 2), + 'use_preset': ('flags', 1)}, + 'LoRaWANBridge.Downlink': {'immediate': ('flags', 1), + 'invert_polarity': ('flags', 2), + 'may_defer': ('flags', 8), + 'no_crc': ('flags', 4)}, + 'MQTTConfig': {'enabled': ('flags', 1), + 'encryption': ('flags', 2), + 'map_reporting': ('flags', 16), + 'proxy_to_client': ('flags', 8), + 'tls': ('flags', 4)}, + 'MeshBeaconConfig': {'broadcast_enabled': ('flags', 2), + 'listen_enabled': ('flags', 1), + 'text_split': ('flags', 4)}, + 'MeshPacket': {'anycast': ('flags', 128), + 'pki_encrypted': ('flags', 16), + 'ratchet_encrypted': ('flags', 64), + 'record_path': ('flags', 1), + 'via_mqtt': ('flags', 4), + 'want_ack': ('flags', 8), + 'xeddsa_signed': ('flags', 32)}, + 'NetworkConfig': {'eth': ('flags', 2), + 'ipv6': ('flags', 4), + 'udp_broadcast': ('enabled_protocols', 1), + 'wifi': ('flags', 1)}, + 'NodeFilter': {'offline': ('flags', 2), + 'position': ('flags', 8), + 'public_key': ('flags', 4), + 'unknown': ('flags', 1)}, + 'NodeHighlight': {'chat': ('flags', 1), + 'iaq': ('flags', 8), + 'position': ('flags', 2), + 'telemetry': ('flags', 4)}, + 'NodeInfo': {'has_is_unmessagable': ('flags', 256), + 'has_rf_hear': ('flags', 2048), + 'has_snr': ('flags', 1024), + 'has_user': ('flags', 32), + 'has_xeddsa_signed': ('flags', 512), + 'heard_on_current_lora': ('flags', 16777216), + 'is_favorite': ('flags', 8), + 'is_ignored': ('flags', 16), + 'is_key_manually_verified': ('flags', 1), + 'is_licensed': ('flags', 64), + 'is_muted': ('flags', 2), + 'is_unmessagable': ('flags', 128), + 'via_mqtt': ('flags', 4)}, + 'NodeInfoLite': {'has_is_unmessagable': ('bitfield', 256), + 'has_rf_hear': ('bitfield', 2048), + 'has_snr': ('bitfield', 1024), + 'has_user': ('bitfield', 32), + 'has_xeddsa_signed': ('bitfield', 512), + 'heard_on_current_lora': ('bitfield', 16777216), + 'is_favorite': ('bitfield', 8), + 'is_ignored': ('bitfield', 16), + 'is_key_manually_verified': ('bitfield', 1), + 'is_licensed': ('bitfield', 64), + 'is_muted': ('bitfield', 2), + 'is_unmessagable': ('bitfield', 128), + 'via_mqtt': ('bitfield', 4)}, + 'NodeRecord': {'has_is_unmessagable': ('flags', 256), + 'has_rf_hear': ('flags', 2048), + 'has_snr': ('flags', 1024), + 'has_user': ('flags', 32), + 'has_xeddsa_signed': ('flags', 512), + 'heard_on_current_lora': ('flags', 16777216), + 'is_favorite': ('flags', 8), + 'is_ignored': ('flags', 16), + 'is_key_manually_verified': ('flags', 1), + 'is_licensed': ('flags', 64), + 'is_muted': ('flags', 2), + 'is_unmessagable': ('flags', 128), + 'via_mqtt': ('flags', 4)}, + 'PositionConfig': {'altitude': ('position_flags', 1), + 'dop': ('position_flags', 8), + 'geoidal_separation': ('position_flags', 4), + 'heading': ('position_flags', 256), + 'satinview': ('position_flags', 32), + 'seq_no': ('position_flags', 64), + 'speed': ('position_flags', 512)}, + 'PowerConfig': {'bt_on': ('powermon_enables', 64), + 'cpu_deepsleep': ('powermon_enables', 1), + 'cpu_lightsleep': ('powermon_enables', 2), + 'gps_active': ('powermon_enables', 2048), + 'led_on': ('powermon_enables', 128), + 'lora_rxactive': ('powermon_enables', 32), + 'lora_rxon': ('powermon_enables', 8), + 'lora_txon': ('powermon_enables', 16), + 'screen_drawing': ('powermon_enables', 512), + 'screen_on': ('powermon_enables', 256), + 'vext1_on': ('powermon_enables', 4), + 'wifi_on': ('powermon_enables', 1024)}, + 'RemoteShell': {'grant': ('flags', 1), 'more': ('flags', 2), 'rts': ('flags', 4)}, + 'SecurityConfig': {'admin_channel_enabled': ('flags', 8), + 'debug_log_api_enabled': ('flags', 4), + 'enabled': ('ratchet_flags', 1), + 'is_managed': ('flags', 1), + 'require_when_known': ('ratchet_flags', 2), + 'serial_enabled': ('flags', 2)}, + 'SerialConfig': {'echo': ('flags', 2), + 'enabled': ('flags', 1), + 'override_console_port': ('flags', 4)}, + 'StoreAndForward.Announce': {'announce_serves_discovery': ('flags', 1)}, + 'StoreForwardConfig': {'enabled': ('flags', 1), + 'heartbeat': ('flags', 2), + 'is_server': ('flags', 4), + 'keep_filler': ('flags', 8), + 'no_direct': ('flags', 16)}, + 'StoredFrame': {'anycast': ('flags', 128), + 'pki_encrypted': ('flags', 16), + 'ratchet_encrypted': ('flags', 64), + 'record_path': ('flags', 1), + 'via_mqtt': ('flags', 4), + 'want_ack': ('flags', 8), + 'xeddsa_signed': ('flags', 32)}, + 'TelemetryConfig': {'air_quality': ('flags', 8), + 'air_quality_screen': ('flags', 16), + 'device': ('flags', 512), + 'environment_measurement': ('flags', 1), + 'environment_screen': ('flags', 2), + 'health_measurement': ('flags', 128), + 'health_screen': ('flags', 256), + 'power_measurement': ('flags', 32), + 'power_screen': ('flags', 64)}, + 'Waypoint': {'favorites_only': ('notify_flags', 4), + 'on_enter': ('notify_flags', 1), + 'on_exit': ('notify_flags', 2)}} diff --git a/meshtastic/protobuf/cannedmessages_pb2.py b/meshtastic/protobuf/cannedmessages_pb2.py index d3e5a691f..4e9037fa4 100644 --- a/meshtastic/protobuf/cannedmessages_pb2.py +++ b/meshtastic/protobuf/cannedmessages_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/cannedmessages.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,16 +15,16 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/cannedmessages.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"5\n\x19\x43\x61nnedMessageModuleConfig\x12\x18\n\x08messages\x18\x01 \x01(\tB\x06\x92?\x03\x08\xc9\x01\x42o\n\x14org.meshtastic.protoB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/cannedmessages.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"5\n\x19\x43\x61nnedMessageModuleConfig\x12\x18\n\x08messages\x18\x01 \x01(\tB\x06\x92?\x03\x08\xe7\x01\x42o\n\x14org.meshtastic.protoB\x19\x43\x61nnedMessageConfigProtosZ\"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.cannedmessages_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _CANNEDMESSAGEMODULECONFIG.fields_by_name['messages']._options = None - _CANNEDMESSAGEMODULECONFIG.fields_by_name['messages']._serialized_options = b'\222?\003\010\311\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_CANNEDMESSAGEMODULECONFIG'].fields_by_name['messages']._options = None + _globals['_CANNEDMESSAGEMODULECONFIG'].fields_by_name['messages']._serialized_options = b'\222?\003\010\347\001' _globals['_CANNEDMESSAGEMODULECONFIG']._serialized_start=99 _globals['_CANNEDMESSAGEMODULECONFIG']._serialized_end=152 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/cannedmessages_pb2.pyi b/meshtastic/protobuf/cannedmessages_pb2.pyi index 33c5e2baa..d47e1f7ad 100644 --- a/meshtastic/protobuf/cannedmessages_pb2.pyi +++ b/meshtastic/protobuf/cannedmessages_pb2.pyi @@ -3,31 +3,41 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import typing +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -@typing.final -class CannedMessageModuleConfig(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class CannedMessageModuleConfig(_message.Message): """ Canned message module configuration. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int - messages: builtins.str + MESSAGES_FIELD_NUMBER: _builtins.int + messages: _builtins.str """ Predefined messages for canned message module separated by '|' characters. """ def __init__( self, *, - messages: builtins.str = ..., + messages: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["messages", b"messages"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["messages", b"messages"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___CannedMessageModuleConfig = CannedMessageModuleConfig +Global___CannedMessageModuleConfig: _TypeAlias = CannedMessageModuleConfig # noqa: Y015 diff --git a/meshtastic/protobuf/channel_pb2.py b/meshtastic/protobuf/channel_pb2.py index 76eb834b3..5160e8c04 100644 --- a/meshtastic/protobuf/channel_pb2.py +++ b/meshtastic/protobuf/channel_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/channel.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,28 +15,26 @@ 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xc2\x02\n\x0f\x43hannelSettings\x12\x12\n\x03psk\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x13\n\x04name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x0c\x12\n\n\x02id\x18\x03 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x04 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x05 \x01(\x08\x12<\n\x0fmodule_settings\x18\x06 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\x12\x39\n\x05scope\x18\x07 \x01(\x0e\x32*.meshtastic.protobuf.ChannelSettings.Scope\"O\n\x05Scope\x12\x0f\n\x0bSCOPE_UNSET\x10\x00\x12\x0f\n\x0bSCOPE_LOCAL\x10\x01\x12\x12\n\x0eSCOPE_REGIONAL\x10\x02\x12\x10\n\x0cSCOPE_GLOBAL\x10\x03\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"W\n\x07\x43hannel\x12\x14\n\x05index\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettingsBc\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.channel_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _CHANNELSETTINGS.fields_by_name['channel_num']._options = None - _CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001' - _CHANNELSETTINGS.fields_by_name['psk']._options = None - _CHANNELSETTINGS.fields_by_name['psk']._serialized_options = b'\222?\002\010 ' - _CHANNELSETTINGS.fields_by_name['name']._options = None - _CHANNELSETTINGS.fields_by_name['name']._serialized_options = b'\222?\002\010\014' - _CHANNEL.fields_by_name['index']._options = None - _CHANNEL.fields_by_name['index']._serialized_options = b'\222?\0028\010' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_CHANNELSETTINGS'].fields_by_name['psk']._options = None + _globals['_CHANNELSETTINGS'].fields_by_name['psk']._serialized_options = b'\222?\002\010 ' + _globals['_CHANNELSETTINGS'].fields_by_name['name']._options = None + _globals['_CHANNELSETTINGS'].fields_by_name['name']._serialized_options = b'\222?\002\010\014' + _globals['_CHANNEL'].fields_by_name['index']._options = None + _globals['_CHANNEL'].fields_by_name['index']._serialized_options = b'\222?\0028\010' _globals['_CHANNELSETTINGS']._serialized_start=93 - _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 + _globals['_CHANNELSETTINGS']._serialized_end=415 + _globals['_CHANNELSETTINGS_SCOPE']._serialized_start=336 + _globals['_CHANNELSETTINGS_SCOPE']._serialized_end=415 + _globals['_MODULESETTINGS']._serialized_start=417 + _globals['_MODULESETTINGS']._serialized_end=479 + _globals['_CHANNEL']._serialized_start=481 + _globals['_CHANNEL']._serialized_end=568 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/channel_pb2.pyi b/meshtastic/protobuf/channel_pb2.pyi index 01db545e8..b6c5aafd9 100644 --- a/meshtastic/protobuf/channel_pb2.pyi +++ b/meshtastic/protobuf/channel_pb2.pyi @@ -3,22 +3,22 @@ isort:skip_file trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH)""" -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class ChannelSettings(google.protobuf.message.Message): +@_typing.final +class ChannelSettings(_message.Message): """ This information can be encoded as a QRcode/url so that other users can configure their radio to join the same channel. @@ -32,26 +32,74 @@ class ChannelSettings(google.protobuf.message.Message): The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26" This also allows the option of someday if people have the PSK off (zero), the users COULD type in a channel name and be able to talk. - FIXME: Add description of multi-channel support and how primary vs secondary channels are used. - FIXME: explain how apps use channels for security. - explain how remote settings and remote gpio are managed as an example - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + A node holds up to sixteen channels. Index 0 is the primary: its name feeds the frequency + slot hash, so it decides where the radio listens, and every other index is an additional key + for traffic on that same frequency. An index with no settings is disabled. Position and + presence carry that distinction, so there is no role field. - CHANNEL_NUM_FIELD_NUMBER: builtins.int - PSK_FIELD_NUMBER: builtins.int - NAME_FIELD_NUMBER: builtins.int - ID_FIELD_NUMBER: builtins.int - UPLINK_ENABLED_FIELD_NUMBER: builtins.int - DOWNLINK_ENABLED_FIELD_NUMBER: builtins.int - MODULE_SETTINGS_FIELD_NUMBER: builtins.int - USE_AEAD_FIELD_NUMBER: builtins.int - channel_num: builtins.int - """ - Deprecated in favor of LoraConfig.channel_num + What a channel key buys is confidentiality and integrity for everyone who holds it, and + nothing more. It cannot say which member sent a frame, so per-sender attribution is XEdDSA + (Data.xeddsa_signature), and anything that must be authorised to one node rather than to a + group travels as a PKI direct message instead: remote administration and remote hardware + both work that way. """ - psk: builtins.bytes + + DESCRIPTOR: _descriptor.Descriptor + + class _Scope: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _ScopeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[ChannelSettings._Scope.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + SCOPE_UNSET: ChannelSettings._Scope.ValueType # 0 + """Treated as REGIONAL""" + SCOPE_LOCAL: ChannelSettings._Scope.ValueType # 1 + """One or two hops: a site, an event, a household""" + SCOPE_REGIONAL: ChannelSettings._Scope.ValueType # 2 + """The region's default hop cap""" + SCOPE_GLOBAL: ChannelSettings._Scope.ValueType # 3 + """Up to the full 15-hop budget, and the only scope that may uplink""" + + class Scope(_Scope, metaclass=_ScopeEnumTypeWrapper): + """ + Intended reach of this channel. It travels in the channel URL, so everyone who + joins the channel launches its traffic the same way. + + Scope caps the hop_start a node launches with on this channel, decides whether + uplink_enabled may be set, and tells congestion control whether it may raise that + cap. It is a sender-side rule: a relay cannot read it, and enforces reach with + RelayConfig instead. + + | scope | launch hop_start | uplink_enabled | congestion control may raise | + |----------|------------------|----------------|------------------------------| + | LOCAL | 2 | refused | no | + | REGIONAL | region default | refused | yes, to the region maximum | + | GLOBAL | 15 | allowed | yes | + + A direct message launches with the sender's primary-channel scope unless the client + sets hop_start itself; after the first flood it steers by next_hop, so the same + rule bounds its reach. + """ + + SCOPE_UNSET: ChannelSettings.Scope.ValueType # 0 + """Treated as REGIONAL""" + SCOPE_LOCAL: ChannelSettings.Scope.ValueType # 1 + """One or two hops: a site, an event, a household""" + SCOPE_REGIONAL: ChannelSettings.Scope.ValueType # 2 + """The region's default hop cap""" + SCOPE_GLOBAL: ChannelSettings.Scope.ValueType # 3 + """Up to the full 15-hop budget, and the only scope that may uplink""" + + PSK_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + ID_FIELD_NUMBER: _builtins.int + UPLINK_ENABLED_FIELD_NUMBER: _builtins.int + DOWNLINK_ENABLED_FIELD_NUMBER: _builtins.int + MODULE_SETTINGS_FIELD_NUMBER: _builtins.int + SCOPE_FIELD_NUMBER: _builtins.int + psk: _builtins.bytes """ A simple pre-shared key for now for crypto. Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256). @@ -64,18 +112,17 @@ class ChannelSettings(google.protobuf.message.Message): `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. Shown to user as simple1 through 10 """ - name: builtins.str + name: _builtins.str """ - A SHORT name that will be packed into the URL. + A short name for end users to call the channel by, packed into the sharing URL. Less than 12 bytes. - Something for end users to call the channel - If this is the empty string it is assumed that this channel - is the special (minimally secure) "Default"channel. - In user interfaces it should be rendered as a local language translation of "X". - For channel_num hashing empty string will be treated as "X". - Where "X" is selected based on the English words listed above for ModemPreset + + Empty means the minimally secure default channel: it is named by the modem preset + (ModemPresetInfo.name), which is also the name hashed for the frequency slot when + LoRaConfig.channel_num is 0. A user interface renders that name, translated where + it has a translation. """ - id: builtins.int + id: _builtins.int """ Used to construct a globally unique channel ID. The full globally unique ID will be: "name.id" where ID is shown as base36. @@ -84,29 +131,23 @@ class ChannelSettings(google.protobuf.message.Message): And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to try multiple candidate channels. Any time a non wire compatible change is made to a channel, this field should be regenerated. - There are a small number of 'special' globally known (and fairly) insecure standard channels. - Those channels do not have a numeric id included in the settings, but instead it is pulled from - a table of well known IDs. - (see Well Known Channels FIXME) + A channel shared by name alone, with no id and the default PSK, is as insecure as its name + is public; a sender that wants privacy generates both. """ - uplink_enabled: builtins.bool + uplink_enabled: _builtins.bool """ If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe """ - downlink_enabled: builtins.bool + downlink_enabled: _builtins.bool """ If true, messages seen on the internet will be forwarded to the local mesh. """ - use_aead: builtins.bool + scope: Global___ChannelSettings.Scope.ValueType """ - 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). + Intended reach of this channel, enforced by senders. """ - @property - def module_settings(self) -> global___ModuleSettings: + @_builtins.property + def module_settings(self) -> Global___ModuleSettings: """ Per-channel module settings. """ @@ -114,35 +155,37 @@ class ChannelSettings(google.protobuf.message.Message): def __init__( self, *, - channel_num: builtins.int = ..., - psk: builtins.bytes = ..., - name: builtins.str = ..., - id: builtins.int = ..., - uplink_enabled: builtins.bool = ..., - downlink_enabled: builtins.bool = ..., - module_settings: global___ModuleSettings | None = ..., - use_aead: builtins.bool = ..., + psk: _builtins.bytes = ..., + name: _builtins.str = ..., + id: _builtins.int = ..., + uplink_enabled: _builtins.bool = ..., + downlink_enabled: _builtins.bool = ..., + module_settings: Global___ModuleSettings | None = ..., + scope: Global___ChannelSettings.Scope.ValueType = ..., ) -> 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", "use_aead", b"use_aead"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["module_settings", b"module_settings"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "scope", b"scope", "uplink_enabled", b"uplink_enabled"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ChannelSettings = ChannelSettings +Global___ChannelSettings: _TypeAlias = ChannelSettings # noqa: Y015 -@typing.final -class ModuleSettings(google.protobuf.message.Message): +@_typing.final +class ModuleSettings(_message.Message): """ This message is specifically for modules to store per-channel configuration data. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - POSITION_PRECISION_FIELD_NUMBER: builtins.int - IS_MUTED_FIELD_NUMBER: builtins.int - position_precision: builtins.int + POSITION_PRECISION_FIELD_NUMBER: _builtins.int + IS_MUTED_FIELD_NUMBER: _builtins.int + position_precision: _builtins.int """ Bits of precision for the location sent in position packets. """ - is_muted: builtins.bool + is_muted: _builtins.bool """ Controls whether or not the client / device should mute the current channel Useful for noisy public channels you don't necessarily want to disable @@ -150,95 +193,53 @@ class ModuleSettings(google.protobuf.message.Message): def __init__( self, *, - position_precision: builtins.int = ..., - is_muted: builtins.bool = ..., + position_precision: _builtins.int = ..., + is_muted: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["is_muted", b"is_muted", "position_precision", b"position_precision"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["is_muted", b"is_muted", "position_precision", b"position_precision"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ModuleSettings = ModuleSettings +Global___ModuleSettings: _TypeAlias = ModuleSettings # noqa: Y015 -@typing.final -class Channel(google.protobuf.message.Message): +@_typing.final +class Channel(_message.Message): """ A pair of a channel number, mode and the (sharable) settings for that channel """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - class _Role: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _RoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Channel._Role.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DISABLED: Channel._Role.ValueType # 0 - """ - This channel is not in use right now - """ - PRIMARY: Channel._Role.ValueType # 1 - """ - This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY - """ - SECONDARY: Channel._Role.ValueType # 2 - """ - Secondary channels are only used for encryption/decryption/authentication purposes. - Their radio settings (freq etc) are ignored, only psk is used. - """ - - class Role(_Role, metaclass=_RoleEnumTypeWrapper): - """ - How this channel is being used (or not). - Note: this field is an enum to give us options for the future. - In particular, someday we might make a 'SCANNING' option. - SCANNING channels could have different frequencies and the radio would - occasionally check that freq to see if anything is being transmitted. - For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow - cross band routing as needed. - If a device has only a single radio (the common case) only one channel can be PRIMARY at a time - (but any number of SECONDARY channels can't be sent received on that common frequency) - """ - - DISABLED: Channel.Role.ValueType # 0 - """ - This channel is not in use right now - """ - PRIMARY: Channel.Role.ValueType # 1 - """ - This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY - """ - SECONDARY: Channel.Role.ValueType # 2 - """ - Secondary channels are only used for encryption/decryption/authentication purposes. - Their radio settings (freq etc) are ignored, only psk is used. + INDEX_FIELD_NUMBER: _builtins.int + SETTINGS_FIELD_NUMBER: _builtins.int + index: _builtins.int """ + The index of this channel in the channel table, 0 to MAX_NUM_CHANNELS-1. + MAX_NUM_CHANNELS is 16 in 3.0, up from 8. - INDEX_FIELD_NUMBER: builtins.int - SETTINGS_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - index: builtins.int - """ - The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1) - (Someday - not currently implemented) An index of -1 could be used to mean "set by name", - in which case the target node will find and set the channel by settings.name. - """ - role: global___Channel.Role.ValueType - """ - TODO: REPLACE + Index 0 is the primary channel: it is the one whose name LoRaConfig.channel_num + can hash, so it decides where the radio listens. Every other index is a key for + decrypting traffic on that same frequency. Position carries this distinction, so + no role field states it. """ - @property - def settings(self) -> global___ChannelSettings: + @_builtins.property + def settings(self) -> Global___ChannelSettings: """ - The new settings, or NULL to disable that channel + The settings for this channel. Absent means the channel is disabled. """ def __init__( self, *, - index: builtins.int = ..., - settings: global___ChannelSettings | None = ..., - role: global___Channel.Role.ValueType = ..., + index: _builtins.int = ..., + settings: Global___ChannelSettings | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["settings", b"settings"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["index", b"index", "role", b"role", "settings", b"settings"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["settings", b"settings"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["index", b"index", "settings", b"settings"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Channel = Channel +Global___Channel: _TypeAlias = Channel # noqa: Y015 diff --git a/meshtastic/protobuf/clientonly_pb2.py b/meshtastic/protobuf/clientonly_pb2.py index 0f25e756b..a2949951f 100644 --- a/meshtastic/protobuf/clientonly_pb2.py +++ b/meshtastic/protobuf/clientonly_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/clientonly.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -12,26 +13,26 @@ from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2 -from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 +from meshtastic.protobuf import wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/wire.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\xe7\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.clientonly_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - 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\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 - _DEVICEPROFILE.fields_by_name['ringtone']._serialized_options = b'\222?\003\010\347\001' - _DEVICEPROFILE.fields_by_name['canned_messages']._options = None - _DEVICEPROFILE.fields_by_name['canned_messages']._serialized_options = b'\222?\003\010\311\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_DEVICEPROFILE'].fields_by_name['long_name']._options = None + _globals['_DEVICEPROFILE'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _globals['_DEVICEPROFILE'].fields_by_name['short_name']._options = None + _globals['_DEVICEPROFILE'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_DEVICEPROFILE'].fields_by_name['ringtone']._options = None + _globals['_DEVICEPROFILE'].fields_by_name['ringtone']._serialized_options = b'\222?\003\010\347\001' + _globals['_DEVICEPROFILE'].fields_by_name['canned_messages']._options = None + _globals['_DEVICEPROFILE'].fields_by_name['canned_messages']._serialized_options = b'\222?\003\010\347\001' _globals['_DEVICEPROFILE']._serialized_start=165 _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 3938d8f65..240c43a63 100644 --- a/meshtastic/protobuf/clientonly_pb2.pyi +++ b/meshtastic/protobuf/clientonly_pb2.pyi @@ -3,76 +3,82 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import meshtastic.protobuf.localonly_pb2 -import meshtastic.protobuf.mesh_pb2 -import typing +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from . import localonly_pb2 as _localonly_pb2 +from . import wire_pb2 as _wire_pb2 +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 10): + from typing import TypeAlias as _TypeAlias +else: + from typing_extensions import TypeAlias as _TypeAlias -@typing.final -class DeviceProfile(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class DeviceProfile(_message.Message): """ This abstraction is used to contain any configuration for provisioning a node on any client. It is useful for importing and exporting configurations. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - LONG_NAME_FIELD_NUMBER: builtins.int - SHORT_NAME_FIELD_NUMBER: builtins.int - CHANNEL_URL_FIELD_NUMBER: builtins.int - CONFIG_FIELD_NUMBER: builtins.int - MODULE_CONFIG_FIELD_NUMBER: builtins.int - 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_FIELD_NUMBER: _builtins.int + SHORT_NAME_FIELD_NUMBER: _builtins.int + CHANNEL_URL_FIELD_NUMBER: _builtins.int + CONFIG_FIELD_NUMBER: _builtins.int + MODULE_CONFIG_FIELD_NUMBER: _builtins.int + 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 """ - short_name: builtins.str + short_name: _builtins.str """ Short name of the node """ - channel_url: builtins.str + channel_url: _builtins.str """ The url of the channels from our node """ - ringtone: builtins.str + ringtone: _builtins.str """ Ringtone for ExternalNotification """ - canned_messages: builtins.str + canned_messages: _builtins.str """ Predefined messages for CannedMessage """ - is_unmessagable: builtins.bool + is_unmessagable: _builtins.bool """ Is the node unmessagable """ - is_licensed: builtins.bool + is_licensed: _builtins.bool """ Is this node in licensed user mode """ - @property - def config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig: + @_builtins.property + def config(self) -> _localonly_pb2.LocalConfig: """ The Config of the node """ - @property - def module_config(self) -> meshtastic.protobuf.localonly_pb2.LocalModuleConfig: + @_builtins.property + def module_config(self) -> _localonly_pb2.LocalModuleConfig: """ The ModuleConfig of the node """ - @property - def fixed_position(self) -> meshtastic.protobuf.mesh_pb2.Position: + @_builtins.property + def fixed_position(self) -> _wire_pb2.Position: """ Fixed position data """ @@ -80,38 +86,60 @@ class DeviceProfile(google.protobuf.message.Message): def __init__( self, *, - long_name: builtins.str | None = ..., - short_name: builtins.str | None = ..., - channel_url: builtins.str | None = ..., - config: meshtastic.protobuf.localonly_pb2.LocalConfig | None = ..., - module_config: meshtastic.protobuf.localonly_pb2.LocalModuleConfig | None = ..., - 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 = ..., + long_name: _builtins.str | None = ..., + short_name: _builtins.str | None = ..., + channel_url: _builtins.str | None = ..., + config: _localonly_pb2.LocalConfig | None = ..., + module_config: _localonly_pb2.LocalModuleConfig | None = ..., + fixed_position: _wire_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", "_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 - def WhichOneof(self, oneof_group: typing.Literal["_channel_url", b"_channel_url"]) -> typing.Literal["channel_url"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_config", b"_config"]) -> typing.Literal["config"] | None: ... - @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: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ringtone", b"_ringtone"]) -> typing.Literal["ringtone"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_short_name", b"_short_name"]) -> typing.Literal["short_name"] | None: ... + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__canned_messages: _TypeAlias = _typing.Literal["canned_messages"] # noqa: Y015 + _WhichOneofArgType__canned_messages: _TypeAlias = _typing.Literal["_canned_messages", b"_canned_messages"] # noqa: Y015 + _WhichOneofReturnType__channel_url: _TypeAlias = _typing.Literal["channel_url"] # noqa: Y015 + _WhichOneofArgType__channel_url: _TypeAlias = _typing.Literal["_channel_url", b"_channel_url"] # noqa: Y015 + _WhichOneofReturnType__config: _TypeAlias = _typing.Literal["config"] # noqa: Y015 + _WhichOneofArgType__config: _TypeAlias = _typing.Literal["_config", b"_config"] # noqa: Y015 + _WhichOneofReturnType__fixed_position: _TypeAlias = _typing.Literal["fixed_position"] # noqa: Y015 + _WhichOneofArgType__fixed_position: _TypeAlias = _typing.Literal["_fixed_position", b"_fixed_position"] # noqa: Y015 + _WhichOneofReturnType__is_licensed: _TypeAlias = _typing.Literal["is_licensed"] # noqa: Y015 + _WhichOneofArgType__is_licensed: _TypeAlias = _typing.Literal["_is_licensed", b"_is_licensed"] # noqa: Y015 + _WhichOneofReturnType__is_unmessagable: _TypeAlias = _typing.Literal["is_unmessagable"] # noqa: Y015 + _WhichOneofArgType__is_unmessagable: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable"] # noqa: Y015 + _WhichOneofReturnType__long_name: _TypeAlias = _typing.Literal["long_name"] # noqa: Y015 + _WhichOneofArgType__long_name: _TypeAlias = _typing.Literal["_long_name", b"_long_name"] # noqa: Y015 + _WhichOneofReturnType__module_config: _TypeAlias = _typing.Literal["module_config"] # noqa: Y015 + _WhichOneofArgType__module_config: _TypeAlias = _typing.Literal["_module_config", b"_module_config"] # noqa: Y015 + _WhichOneofReturnType__ringtone: _TypeAlias = _typing.Literal["ringtone"] # noqa: Y015 + _WhichOneofArgType__ringtone: _TypeAlias = _typing.Literal["_ringtone", b"_ringtone"] # noqa: Y015 + _WhichOneofReturnType__short_name: _TypeAlias = _typing.Literal["short_name"] # noqa: Y015 + _WhichOneofArgType__short_name: _TypeAlias = _typing.Literal["_short_name", b"_short_name"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__canned_messages) -> _WhichOneofReturnType__canned_messages | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_url) -> _WhichOneofReturnType__channel_url | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__config) -> _WhichOneofReturnType__config | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__fixed_position) -> _WhichOneofReturnType__fixed_position | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__is_licensed) -> _WhichOneofReturnType__is_licensed | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__is_unmessagable) -> _WhichOneofReturnType__is_unmessagable | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__long_name) -> _WhichOneofReturnType__long_name | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__module_config) -> _WhichOneofReturnType__module_config | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__ringtone) -> _WhichOneofReturnType__ringtone | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__short_name) -> _WhichOneofReturnType__short_name | None: ... -global___DeviceProfile = DeviceProfile +Global___DeviceProfile: _TypeAlias = DeviceProfile # noqa: Y015 diff --git a/meshtastic/protobuf/common_pb2.py b/meshtastic/protobuf/common_pb2.py new file mode 100644 index 000000000..1c4c5445c --- /dev/null +++ b/meshtastic/protobuf/common_pb2.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/common.proto +# Protobuf Python Version: 4.25.1 +"""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 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/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf4\t\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xb0\x01\n\x06ROUTER\x10\x02\x1a\xa3\x01\xca\xf3\x18\x9e\x01:\x06RouterB\x93\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12H\n\x07TRACKER\x10\x03\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x04\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x05\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x06\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x89\x01\n\x0eLOST_AND_FOUND\x10\x07\x1au\xca\xf3\x18q:\x0eLost and FoundB_Broadcasts location as message to default channel regularly for to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\x08\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\t\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\x85\x01\n\x0b\x43LIENT_BASE\x10\n\x1at\xca\xf3\x18p:\x0b\x43lient BaseBaUsed for rooftop nodes to distribute messages more widely from multiple nearby client mute nodes.*\xe5\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12\'\n\rREGION_UA_433\x10\x0e\x1a\x14\xca\xf3\x18\x10:\x0eUkraine 433MHz\x12(\n\rREGION_MY_433\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x11\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x14\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x15\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x17\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x18\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x19\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1b\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1e\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1f\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10 \x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10#\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10$\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xa1\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08*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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"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.common_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\014CommonProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_ROLE'].values_by_name["CLIENT"]._options = None + _globals['_ROLE'].values_by_name["CLIENT"]._serialized_options = b'\312\363\0308:\006ClientB.App connected or stand alone messaging device.' + _globals['_ROLE'].values_by_name["CLIENT_MUTE"]._options = None + _globals['_ROLE'].values_by_name["CLIENT_MUTE"]._serialized_options = b'\312\363\030G:\013Client MuteB8Device that does not forward packets from other devices.' + _globals['_ROLE'].values_by_name["ROUTER"]._options = None + _globals['_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.' + _globals['_ROLE'].values_by_name["TRACKER"]._options = None + _globals['_ROLE'].values_by_name["TRACKER"]._serialized_options = b'\312\363\0307:\007TrackerB,Broadcasts GPS position packets as priority.' + _globals['_ROLE'].values_by_name["SENSOR"]._options = None + _globals['_ROLE'].values_by_name["SENSOR"]._serialized_options = b'\312\363\0303:\006SensorB)Broadcasts telemetry packets as priority.' + _globals['_ROLE'].values_by_name["TAK"]._options = None + _globals['_ROLE'].values_by_name["TAK"]._serialized_options = b'\312\363\030K:\003TAKBDOptimized for ATAK system communication, reduces routine broadcasts.' + _globals['_ROLE'].values_by_name["CLIENT_HIDDEN"]._options = None + _globals['_ROLE'].values_by_name["CLIENT_HIDDEN"]._serialized_options = b'\312\363\030T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.' + _globals['_ROLE'].values_by_name["LOST_AND_FOUND"]._options = None + _globals['_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.' + _globals['_ROLE'].values_by_name["TAK_TRACKER"]._options = None + _globals['_ROLE'].values_by_name["TAK_TRACKER"]._serialized_options = b'\312\363\030S:\013TAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.' + _globals['_ROLE'].values_by_name["ROUTER_LATE"]._options = None + _globals['_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.' + _globals['_ROLE'].values_by_name["CLIENT_BASE"]._options = None + _globals['_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.' + _globals['_REGIONCODE'].values_by_name["REGION_UNSET"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_UNSET"]._serialized_options = b'\312\363\030\025:\023Please set a region' + _globals['_REGIONCODE'].values_by_name["REGION_US"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_US"]._serialized_options = b'\312\363\030\017:\rUnited States' + _globals['_REGIONCODE'].values_by_name["REGION_EU_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_433"]._serialized_options = b'\312\363\030\027:\025European Union 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_EU_868"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_868"]._serialized_options = b'\312\363\030\027:\025European Union 868MHz' + _globals['_REGIONCODE'].values_by_name["REGION_CN"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_CN"]._serialized_options = b'\312\363\030\007:\005China' + _globals['_REGIONCODE'].values_by_name["REGION_JP"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_JP"]._serialized_options = b'\312\363\030\007:\005Japan' + _globals['_REGIONCODE'].values_by_name["REGION_ANZ"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ANZ"]._serialized_options = b'\312\363\030\031:\027Australia / New Zealand' + _globals['_REGIONCODE'].values_by_name["REGION_KR"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_KR"]._serialized_options = b'\312\363\030\007:\005Korea' + _globals['_REGIONCODE'].values_by_name["REGION_TW"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_TW"]._serialized_options = b'\312\363\030\010:\006Taiwan' + _globals['_REGIONCODE'].values_by_name["REGION_RU"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_RU"]._serialized_options = b'\312\363\030\010:\006Russia' + _globals['_REGIONCODE'].values_by_name["REGION_IN"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_IN"]._serialized_options = b'\312\363\030\007:\005India' + _globals['_REGIONCODE'].values_by_name["REGION_NZ_865"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_NZ_865"]._serialized_options = b'\312\363\030\024:\022New Zealand 865MHz' + _globals['_REGIONCODE'].values_by_name["REGION_TH"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_TH"]._serialized_options = b'\312\363\030\n:\010Thailand' + _globals['_REGIONCODE'].values_by_name["REGION_LORA_24"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_LORA_24"]._serialized_options = b'\312\363\030\t:\0072.4 Ghz' + _globals['_REGIONCODE'].values_by_name["REGION_UA_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_UA_433"]._serialized_options = b'\312\363\030\020:\016Ukraine 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_MY_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_MY_433"]._serialized_options = b'\312\363\030\021:\017Malaysia 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_MY_919"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_MY_919"]._serialized_options = b'\312\363\030\021:\017Malaysia 919MHz' + _globals['_REGIONCODE'].values_by_name["REGION_SG_923"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_SG_923"]._serialized_options = b'\312\363\030\022:\020Singapore 923MHz' + _globals['_REGIONCODE'].values_by_name["REGION_PH_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_PH_433"]._serialized_options = b'\312\363\030\024:\022Philippines 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_PH_868"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_PH_868"]._serialized_options = b'\312\363\030\024:\022Philippines 868MHz' + _globals['_REGIONCODE'].values_by_name["REGION_PH_915"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_PH_915"]._serialized_options = b'\312\363\030\024:\022Philippines 915MHz' + _globals['_REGIONCODE'].values_by_name["REGION_ANZ_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ANZ_433"]._serialized_options = b'\312\363\030 :\036Australia / New Zealand 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_KZ_433"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_KZ_433"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 433MHz' + _globals['_REGIONCODE'].values_by_name["REGION_KZ_863"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_KZ_863"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 863MHz' + _globals['_REGIONCODE'].values_by_name["REGION_NP_865"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_NP_865"]._serialized_options = b'\312\363\030\016:\014Nepal 865MHz' + _globals['_REGIONCODE'].values_by_name["REGION_BR_902"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_BR_902"]._serialized_options = b'\312\363\030\017:\rBrazil 902MHz' + _globals['_REGIONCODE'].values_by_name["REGION_ITU1_2M"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU1_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 1 / Amateur 2m' + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_2M"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 2 / Amateur 2m' + _globals['_REGIONCODE'].values_by_name["REGION_EU_866"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_866"]._serialized_options = b'\312\363\030\027:\025European Union 866MHz' + _globals['_REGIONCODE'].values_by_name["REGION_EU_874"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_874"]._serialized_options = b'\312\363\030\027:\025European Union 874MHz' + _globals['_REGIONCODE'].values_by_name["REGION_EU_917"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_917"]._serialized_options = b'\312\363\030\027:\025European Union 917MHz' + _globals['_REGIONCODE'].values_by_name["REGION_EU_N_868"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_EU_N_868"]._serialized_options = b'\312\363\030 :\036European Union 868MHz (Narrow)' + _globals['_REGIONCODE'].values_by_name["REGION_ITU3_2M"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU3_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 3 / Amateur 2m' + _globals['_REGIONCODE'].values_by_name["REGION_ITU1_70CM"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU1_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 1 / Amateur 70cm' + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_70CM"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 2 / Amateur 70cm' + _globals['_REGIONCODE'].values_by_name["REGION_ITU3_70CM"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU3_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 3 / Amateur 70cm' + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_125CM"]._options = None + _globals['_REGIONCODE'].values_by_name["REGION_ITU2_125CM"]._serialized_options = b'\312\363\030\036:\034ITU Region 2 / Amateur 1.25m' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_NONE"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_NONE"]._serialized_options = b'\312\363\030\006:\004None' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_SELECT"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_SELECT"]._serialized_options = b'\312\363\030\010:\006Select' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_UP"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_UP"]._serialized_options = b'\312\363\030\004:\002Up' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_DOWN"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_DOWN"]._serialized_options = b'\312\363\030\006:\004Down' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_LEFT"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_LEFT"]._serialized_options = b'\312\363\030\006:\004Left' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_RIGHT"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_RIGHT"]._serialized_options = b'\312\363\030\007:\005Right' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_CANCEL"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_CANCEL"]._serialized_options = b'\312\363\030\010:\006Cancel' + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_BACK"]._options = None + _globals['_INPUTBROKEREVENT'].values_by_name["INPUT_BACK"]._serialized_options = b'\312\363\030\006:\004Back' + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_FAST"]._serialized_options = b'\312\363\030%:\021Long Range - FastJ\020longfast|default' + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_SLOW"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_SLOW"]._serialized_options = b'\312\363\030\025:\023Medium Range - Slow' + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_FAST"]._serialized_options = b'\312\363\030\025:\023Medium Range - Fast' + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_SLOW"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_SLOW"]._serialized_options = b'\312\363\030\024:\022Short Range - Slow' + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_FAST"]._serialized_options = b'\312\363\030\024:\022Short Range - Fast' + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_MODERATE"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_MODERATE"]._serialized_options = b'\312\363\030\027:\025Long Range - Moderate' + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_TURBO"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_SHORT_TURBO"]._serialized_options = b'\312\363\030\025:\023Short Range - Turbo' + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_TURBO"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_LONG_TURBO"]._serialized_options = b'\312\363\030\024:\022Long Range - Turbo' + _globals['_MODEMPRESET'].values_by_name["MODEM_LITE_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_LITE_FAST"]._serialized_options = b'\312\363\030\r:\013Lite - Fast' + _globals['_MODEMPRESET'].values_by_name["MODEM_LITE_SLOW"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_LITE_SLOW"]._serialized_options = b'\312\363\030\r:\013Lite - Slow' + _globals['_MODEMPRESET'].values_by_name["MODEM_NARROW_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_NARROW_FAST"]._serialized_options = b'\312\363\030\017:\rNarrow - Fast' + _globals['_MODEMPRESET'].values_by_name["MODEM_NARROW_SLOW"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_NARROW_SLOW"]._serialized_options = b'\312\363\030\017:\rNarrow - Slow' + _globals['_MODEMPRESET'].values_by_name["MODEM_TINY_FAST"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_TINY_FAST"]._serialized_options = b'\312\363\030\r:\013Tiny - Fast' + _globals['_MODEMPRESET'].values_by_name["MODEM_TINY_SLOW"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_TINY_SLOW"]._serialized_options = b'\312\363\030\r:\013Tiny - Slow' + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_TURBO"]._options = None + _globals['_MODEMPRESET'].values_by_name["MODEM_MEDIUM_TURBO"]._serialized_options = b'\312\363\030\026:\024Medium Range - Turbo' + _globals['_DEVICEMETADATA'].fields_by_name['firmware_version']._options = None + _globals['_DEVICEMETADATA'].fields_by_name['firmware_version']._serialized_options = b'\222?\002\010\022' + _globals['_DEVICEMETADATA'].fields_by_name['capabilities']._options = None + _globals['_DEVICEMETADATA'].fields_by_name['capabilities']._serialized_options = b'\222?\0028\010' + _globals['_DEVICEMETADATA'].fields_by_name['role']._options = None + _globals['_DEVICEMETADATA'].fields_by_name['role']._serialized_options = b'\222?\0028\010' + _globals['_ROLE']._serialized_start=599 + _globals['_ROLE']._serialized_end=1867 + _globals['_REGIONCODE']._serialized_start=1870 + _globals['_REGIONCODE']._serialized_end=3507 + _globals['_INPUTBROKEREVENT']._serialized_start=3510 + _globals['_INPUTBROKEREVENT']._serialized_end=4134 + _globals['_MODEMPRESET']._serialized_start=4137 + _globals['_MODEMPRESET']._serialized_end=4862 + _globals['_NODEFLAGS']._serialized_start=4865 + _globals['_NODEFLAGS']._serialized_end=5282 + _globals['_LOCSOURCE']._serialized_start=5284 + _globals['_LOCSOURCE']._serialized_end=5362 + _globals['_ERRORCODE']._serialized_start=5365 + _globals['_ERRORCODE']._serialized_end=5791 + _globals['_FIRMWAREEDITION']._serialized_start=5794 + _globals['_FIRMWAREEDITION']._serialized_end=6027 + _globals['_DEVICEMETADATA']._serialized_start=134 + _globals['_DEVICEMETADATA']._serialized_end=596 + _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_start=361 + _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_end=596 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/common_pb2.pyi b/meshtastic/protobuf/common_pb2.pyi new file mode 100644 index 000000000..363639226 --- /dev/null +++ b/meshtastic/protobuf/common_pb2.pyi @@ -0,0 +1,1018 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +class _Role: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _RoleEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Role.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CLIENT: _Role.ValueType # 0 + """ + Description: App connected or stand alone messaging device. + Technical Details: Default Role + """ + CLIENT_MUTE: _Role.ValueType # 1 + """ + Description: Device that does not forward packets from other devices. + """ + ROUTER: _Role.ValueType # 2 + """ + Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. + Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. + The wifi radio and the oled screen will be put to sleep. + This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. + """ + TRACKER: _Role.ValueType # 3 + """ + Description: Broadcasts GPS position packets as priority. + Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. + When used in conjunction with power.is_power_saving = true, nodes will wake up, + send position, and then sleep for position.position_broadcast_secs seconds. + """ + SENSOR: _Role.ValueType # 4 + """ + Description: Broadcasts telemetry packets as priority. + Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. + When used in conjunction with power.is_power_saving = true, nodes will wake up, + send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. + """ + TAK: _Role.ValueType # 5 + """ + Description: Optimized for ATAK system communication and reduces routine broadcasts. + Technical Details: Used for nodes dedicated for connection to an ATAK EUD. + Turns off many of the routine broadcasts to favor CoT packet stream + from the Meshtastic ATAK plugin -> IMeshService -> Node + """ + CLIENT_HIDDEN: _Role.ValueType # 6 + """ + Description: Device that only broadcasts as needed for stealth or power savings. + Technical Details: Used for nodes that "only speak when spoken to" + Turns all of the routine broadcasts but allows for ad-hoc communication + Still rebroadcasts, but with local only rebroadcast mode (known meshes only) + Can be used for clandestine operation or to dramatically reduce airtime / power consumption + """ + LOST_AND_FOUND: _Role.ValueType # 7 + """ + Description: Broadcasts location as message to default channel regularly for to assist with device recovery. + Technical Details: Used to automatically send a text message to the mesh + with the current position of the device on a frequent interval: + "I'm lost! Position: lat / long" + """ + TAK_TRACKER: _Role.ValueType # 8 + """ + Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. + Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream + and automatic TAK PLI (position location information) broadcasts. + Uses position module configuration to determine TAK PLI broadcast interval. + """ + ROUTER_LATE: _Role.ValueType # 9 + """ + Description: Will always rebroadcast packets, but will do so after all other modes. + Technical Details: Used for router nodes that are intended to provide additional coverage + in areas not already covered by other routers, or to bridge around problematic terrain, + but should not be given priority over other routers in order to avoid unnecessarily + consuming hops. + """ + CLIENT_BASE: _Role.ValueType # 10 + """ + Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. + Technical Details: Used for stronger attic/roof nodes to distribute messages more widely + from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes + where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. + """ + +class Role(_Role, metaclass=_RoleEnumTypeWrapper): + """ + Defines the device's role on the Mesh network + """ + +CLIENT: Role.ValueType # 0 +""" +Description: App connected or stand alone messaging device. +Technical Details: Default Role +""" +CLIENT_MUTE: Role.ValueType # 1 +""" +Description: Device that does not forward packets from other devices. +""" +ROUTER: Role.ValueType # 2 +""" +Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. +Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. + The wifi radio and the oled screen will be put to sleep. + This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. +""" +TRACKER: Role.ValueType # 3 +""" +Description: Broadcasts GPS position packets as priority. +Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. + When used in conjunction with power.is_power_saving = true, nodes will wake up, + send position, and then sleep for position.position_broadcast_secs seconds. +""" +SENSOR: Role.ValueType # 4 +""" +Description: Broadcasts telemetry packets as priority. +Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. + When used in conjunction with power.is_power_saving = true, nodes will wake up, + send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. +""" +TAK: Role.ValueType # 5 +""" +Description: Optimized for ATAK system communication and reduces routine broadcasts. +Technical Details: Used for nodes dedicated for connection to an ATAK EUD. + Turns off many of the routine broadcasts to favor CoT packet stream + from the Meshtastic ATAK plugin -> IMeshService -> Node +""" +CLIENT_HIDDEN: Role.ValueType # 6 +""" +Description: Device that only broadcasts as needed for stealth or power savings. +Technical Details: Used for nodes that "only speak when spoken to" + Turns all of the routine broadcasts but allows for ad-hoc communication + Still rebroadcasts, but with local only rebroadcast mode (known meshes only) + Can be used for clandestine operation or to dramatically reduce airtime / power consumption +""" +LOST_AND_FOUND: Role.ValueType # 7 +""" +Description: Broadcasts location as message to default channel regularly for to assist with device recovery. +Technical Details: Used to automatically send a text message to the mesh + with the current position of the device on a frequent interval: + "I'm lost! Position: lat / long" +""" +TAK_TRACKER: Role.ValueType # 8 +""" +Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. +Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream + and automatic TAK PLI (position location information) broadcasts. + Uses position module configuration to determine TAK PLI broadcast interval. +""" +ROUTER_LATE: Role.ValueType # 9 +""" +Description: Will always rebroadcast packets, but will do so after all other modes. +Technical Details: Used for router nodes that are intended to provide additional coverage + in areas not already covered by other routers, or to bridge around problematic terrain, + but should not be given priority over other routers in order to avoid unnecessarily + consuming hops. +""" +CLIENT_BASE: Role.ValueType # 10 +""" +Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. +Technical Details: Used for stronger attic/roof nodes to distribute messages more widely + from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes + where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. +""" +Global___Role: _TypeAlias = Role # noqa: Y015 + +class _RegionCode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _RegionCodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_RegionCode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + REGION_UNSET: _RegionCode.ValueType # 0 + """Region is not set""" + REGION_US: _RegionCode.ValueType # 1 + """United States (902-928 MHz)""" + REGION_EU_433: _RegionCode.ValueType # 2 + """European Union 433 MHz band""" + REGION_EU_868: _RegionCode.ValueType # 3 + """European Union 868 MHz band""" + REGION_CN: _RegionCode.ValueType # 4 + """China""" + REGION_JP: _RegionCode.ValueType # 5 + """Japan""" + REGION_ANZ: _RegionCode.ValueType # 6 + """Australia / New Zealand (915-928 MHz)""" + REGION_KR: _RegionCode.ValueType # 7 + """South Korea""" + REGION_TW: _RegionCode.ValueType # 8 + """Taiwan""" + REGION_RU: _RegionCode.ValueType # 9 + """Russia""" + REGION_IN: _RegionCode.ValueType # 10 + """India""" + REGION_NZ_865: _RegionCode.ValueType # 11 + """New Zealand 865 MHz band""" + REGION_TH: _RegionCode.ValueType # 12 + """Thailand""" + REGION_LORA_24: _RegionCode.ValueType # 13 + """2.4 GHz wide LoRa (worldwide)""" + REGION_UA_433: _RegionCode.ValueType # 14 + """Ukraine 433 MHz band""" + REGION_MY_433: _RegionCode.ValueType # 15 + """Malaysia 433 MHz band""" + REGION_MY_919: _RegionCode.ValueType # 16 + """Malaysia 919 MHz band""" + REGION_SG_923: _RegionCode.ValueType # 17 + """Singapore 923 MHz band""" + REGION_PH_433: _RegionCode.ValueType # 18 + """Philippines 433 MHz band""" + REGION_PH_868: _RegionCode.ValueType # 19 + """Philippines 868 MHz band""" + REGION_PH_915: _RegionCode.ValueType # 20 + """Philippines 915 MHz band""" + REGION_ANZ_433: _RegionCode.ValueType # 21 + """Australia / New Zealand 433 MHz band""" + REGION_KZ_433: _RegionCode.ValueType # 22 + """Kazakhstan 433 MHz band""" + REGION_KZ_863: _RegionCode.ValueType # 23 + """Kazakhstan 863 MHz band""" + REGION_NP_865: _RegionCode.ValueType # 24 + """Nepal 865 MHz band""" + REGION_BR_902: _RegionCode.ValueType # 25 + """Brazil 902 MHz band""" + REGION_ITU1_2M: _RegionCode.ValueType # 26 + """ITU Region 1 Amateur Radio 2m band (144-146 MHz)""" + REGION_ITU2_2M: _RegionCode.ValueType # 27 + """ITU Region 2 Amateur Radio 2m band (144-148 MHz)""" + REGION_EU_866: _RegionCode.ValueType # 28 + """EU 866 MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" + REGION_EU_874: _RegionCode.ValueType # 29 + """EU 874 MHz band (Band no. 1 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" + REGION_EU_917: _RegionCode.ValueType # 30 + """EU 917 MHz band (Band no. 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" + REGION_EU_N_868: _RegionCode.ValueType # 31 + """EU 868 MHz band, with narrow presets""" + REGION_ITU3_2M: _RegionCode.ValueType # 32 + """ITU Region 3 Amateur Radio 2m band (144-148 MHz)""" + REGION_ITU1_70CM: _RegionCode.ValueType # 33 + """ITU Region 1 Amateur Radio 70cm band (430-440 MHz)""" + REGION_ITU2_70CM: _RegionCode.ValueType # 34 + """ + 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! + """ + REGION_ITU3_70CM: _RegionCode.ValueType # 35 + """ + ITU Region 3 Amateur Radio 70cm band (430-450 MHz) + Note: Some countries do not allocate 440-450 MHz. Check local law! + """ + REGION_ITU2_125CM: _RegionCode.ValueType # 36 + """ + 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): + """ + Regulatory region codes for LoRa radio configuration + + Ukrainian law is harmonised with the EU, so a Ukrainian node uses REGION_EU_868 and + there is no separate 868 MHz Ukrainian region. + """ + +REGION_UNSET: RegionCode.ValueType # 0 +"""Region is not set""" +REGION_US: RegionCode.ValueType # 1 +"""United States (902-928 MHz)""" +REGION_EU_433: RegionCode.ValueType # 2 +"""European Union 433 MHz band""" +REGION_EU_868: RegionCode.ValueType # 3 +"""European Union 868 MHz band""" +REGION_CN: RegionCode.ValueType # 4 +"""China""" +REGION_JP: RegionCode.ValueType # 5 +"""Japan""" +REGION_ANZ: RegionCode.ValueType # 6 +"""Australia / New Zealand (915-928 MHz)""" +REGION_KR: RegionCode.ValueType # 7 +"""South Korea""" +REGION_TW: RegionCode.ValueType # 8 +"""Taiwan""" +REGION_RU: RegionCode.ValueType # 9 +"""Russia""" +REGION_IN: RegionCode.ValueType # 10 +"""India""" +REGION_NZ_865: RegionCode.ValueType # 11 +"""New Zealand 865 MHz band""" +REGION_TH: RegionCode.ValueType # 12 +"""Thailand""" +REGION_LORA_24: RegionCode.ValueType # 13 +"""2.4 GHz wide LoRa (worldwide)""" +REGION_UA_433: RegionCode.ValueType # 14 +"""Ukraine 433 MHz band""" +REGION_MY_433: RegionCode.ValueType # 15 +"""Malaysia 433 MHz band""" +REGION_MY_919: RegionCode.ValueType # 16 +"""Malaysia 919 MHz band""" +REGION_SG_923: RegionCode.ValueType # 17 +"""Singapore 923 MHz band""" +REGION_PH_433: RegionCode.ValueType # 18 +"""Philippines 433 MHz band""" +REGION_PH_868: RegionCode.ValueType # 19 +"""Philippines 868 MHz band""" +REGION_PH_915: RegionCode.ValueType # 20 +"""Philippines 915 MHz band""" +REGION_ANZ_433: RegionCode.ValueType # 21 +"""Australia / New Zealand 433 MHz band""" +REGION_KZ_433: RegionCode.ValueType # 22 +"""Kazakhstan 433 MHz band""" +REGION_KZ_863: RegionCode.ValueType # 23 +"""Kazakhstan 863 MHz band""" +REGION_NP_865: RegionCode.ValueType # 24 +"""Nepal 865 MHz band""" +REGION_BR_902: RegionCode.ValueType # 25 +"""Brazil 902 MHz band""" +REGION_ITU1_2M: RegionCode.ValueType # 26 +"""ITU Region 1 Amateur Radio 2m band (144-146 MHz)""" +REGION_ITU2_2M: RegionCode.ValueType # 27 +"""ITU Region 2 Amateur Radio 2m band (144-148 MHz)""" +REGION_EU_866: RegionCode.ValueType # 28 +"""EU 866 MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" +REGION_EU_874: RegionCode.ValueType # 29 +"""EU 874 MHz band (Band no. 1 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" +REGION_EU_917: RegionCode.ValueType # 30 +"""EU 917 MHz band (Band no. 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" +REGION_EU_N_868: RegionCode.ValueType # 31 +"""EU 868 MHz band, with narrow presets""" +REGION_ITU3_2M: RegionCode.ValueType # 32 +"""ITU Region 3 Amateur Radio 2m band (144-148 MHz)""" +REGION_ITU1_70CM: RegionCode.ValueType # 33 +"""ITU Region 1 Amateur Radio 70cm band (430-440 MHz)""" +REGION_ITU2_70CM: RegionCode.ValueType # 34 +""" +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! +""" +REGION_ITU3_70CM: RegionCode.ValueType # 35 +""" +ITU Region 3 Amateur Radio 70cm band (430-450 MHz) +Note: Some countries do not allocate 440-450 MHz. Check local law! +""" +REGION_ITU2_125CM: RegionCode.ValueType # 36 +""" +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! +""" +Global___RegionCode: _TypeAlias = RegionCode # noqa: Y015 + +class _InputBrokerEvent: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _InputBrokerEventEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_InputBrokerEvent.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + INPUT_NONE: _InputBrokerEvent.ValueType # 0 + """No event""" + INPUT_SELECT: _InputBrokerEvent.ValueType # 10 + """Select or confirm, the newline character""" + INPUT_SELECT_LONG: _InputBrokerEvent.ValueType # 11 + """Select held down""" + INPUT_UP_LONG: _InputBrokerEvent.ValueType # 12 + """Up held down""" + INPUT_DOWN_LONG: _InputBrokerEvent.ValueType # 13 + """Down held down""" + INPUT_UP: _InputBrokerEvent.ValueType # 17 + """Navigate up, the DC1 character""" + INPUT_DOWN: _InputBrokerEvent.ValueType # 18 + """Navigate down, the DC2 character""" + INPUT_LEFT: _InputBrokerEvent.ValueType # 19 + """Navigate left, the DC3 character""" + INPUT_RIGHT: _InputBrokerEvent.ValueType # 20 + """Navigate right, the DC4 character""" + INPUT_CANCEL: _InputBrokerEvent.ValueType # 24 + """Cancel, the CAN character""" + INPUT_BACK: _InputBrokerEvent.ValueType # 27 + """Go back, the ESC character""" + INPUT_USER_PRESS: _InputBrokerEvent.ValueType # 28 + """The user button was pressed""" + INPUT_ALT_PRESS: _InputBrokerEvent.ValueType # 29 + """The alternate button was pressed""" + INPUT_ALT_LONG: _InputBrokerEvent.ValueType # 30 + """The alternate button was held down""" + INPUT_FACTORY_RESET: _InputBrokerEvent.ValueType # 154 + """Factory reset""" + INPUT_SHUTDOWN: _InputBrokerEvent.ValueType # 155 + """Shut down""" + INPUT_GPS_TOGGLE: _InputBrokerEvent.ValueType # 158 + """Toggle the GPS""" + INPUT_PRIVACY_TOGGLE: _InputBrokerEvent.ValueType # 159 + """Toggle GPS and buzzer together""" + INPUT_SEND_PING: _InputBrokerEvent.ValueType # 175 + """Send a node info ping""" + INPUT_FN_F1: _InputBrokerEvent.ValueType # 241 + """Function key 1""" + INPUT_FN_F2: _InputBrokerEvent.ValueType # 242 + """Function key 2""" + INPUT_FN_F3: _InputBrokerEvent.ValueType # 243 + """Function key 3""" + INPUT_FN_F4: _InputBrokerEvent.ValueType # 244 + """Function key 4""" + INPUT_FN_F5: _InputBrokerEvent.ValueType # 245 + """Function key 5""" + INPUT_MATRIXKEY: _InputBrokerEvent.ValueType # 254 + """A matrix keypad key""" + INPUT_ANYKEY: _InputBrokerEvent.ValueType # 255 + """Any key, for a wake-on-input binding""" + +class InputBrokerEvent(_InputBrokerEvent, metaclass=_InputBrokerEventEnumTypeWrapper): + """ + An input event the input broker delivers: a button, a rotary encoder, a key or a + synthetic event injected over the admin channel. The one list of these codes. + Values are the character codes where an event corresponds to one (SELECT is '\\n', + BACK is ESC), which is why the list is not dense. + """ + +INPUT_NONE: InputBrokerEvent.ValueType # 0 +"""No event""" +INPUT_SELECT: InputBrokerEvent.ValueType # 10 +"""Select or confirm, the newline character""" +INPUT_SELECT_LONG: InputBrokerEvent.ValueType # 11 +"""Select held down""" +INPUT_UP_LONG: InputBrokerEvent.ValueType # 12 +"""Up held down""" +INPUT_DOWN_LONG: InputBrokerEvent.ValueType # 13 +"""Down held down""" +INPUT_UP: InputBrokerEvent.ValueType # 17 +"""Navigate up, the DC1 character""" +INPUT_DOWN: InputBrokerEvent.ValueType # 18 +"""Navigate down, the DC2 character""" +INPUT_LEFT: InputBrokerEvent.ValueType # 19 +"""Navigate left, the DC3 character""" +INPUT_RIGHT: InputBrokerEvent.ValueType # 20 +"""Navigate right, the DC4 character""" +INPUT_CANCEL: InputBrokerEvent.ValueType # 24 +"""Cancel, the CAN character""" +INPUT_BACK: InputBrokerEvent.ValueType # 27 +"""Go back, the ESC character""" +INPUT_USER_PRESS: InputBrokerEvent.ValueType # 28 +"""The user button was pressed""" +INPUT_ALT_PRESS: InputBrokerEvent.ValueType # 29 +"""The alternate button was pressed""" +INPUT_ALT_LONG: InputBrokerEvent.ValueType # 30 +"""The alternate button was held down""" +INPUT_FACTORY_RESET: InputBrokerEvent.ValueType # 154 +"""Factory reset""" +INPUT_SHUTDOWN: InputBrokerEvent.ValueType # 155 +"""Shut down""" +INPUT_GPS_TOGGLE: InputBrokerEvent.ValueType # 158 +"""Toggle the GPS""" +INPUT_PRIVACY_TOGGLE: InputBrokerEvent.ValueType # 159 +"""Toggle GPS and buzzer together""" +INPUT_SEND_PING: InputBrokerEvent.ValueType # 175 +"""Send a node info ping""" +INPUT_FN_F1: InputBrokerEvent.ValueType # 241 +"""Function key 1""" +INPUT_FN_F2: InputBrokerEvent.ValueType # 242 +"""Function key 2""" +INPUT_FN_F3: InputBrokerEvent.ValueType # 243 +"""Function key 3""" +INPUT_FN_F4: InputBrokerEvent.ValueType # 244 +"""Function key 4""" +INPUT_FN_F5: InputBrokerEvent.ValueType # 245 +"""Function key 5""" +INPUT_MATRIXKEY: InputBrokerEvent.ValueType # 254 +"""A matrix keypad key""" +INPUT_ANYKEY: InputBrokerEvent.ValueType # 255 +"""Any key, for a wake-on-input binding""" +Global___InputBrokerEvent: _TypeAlias = InputBrokerEvent # noqa: Y015 + +class _ModemPreset: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _ModemPresetEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_ModemPreset.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + MODEM_LONG_FAST: _ModemPreset.ValueType # 0 + """Long range, fast data rate (default)""" + MODEM_MEDIUM_SLOW: _ModemPreset.ValueType # 1 + """Medium range, slow data rate""" + MODEM_MEDIUM_FAST: _ModemPreset.ValueType # 2 + """Medium range, fast data rate""" + MODEM_SHORT_SLOW: _ModemPreset.ValueType # 3 + """Short range, slow data rate""" + MODEM_SHORT_FAST: _ModemPreset.ValueType # 4 + """Short range, fast data rate""" + MODEM_LONG_MODERATE: _ModemPreset.ValueType # 5 + """Long range, moderate data rate""" + MODEM_SHORT_TURBO: _ModemPreset.ValueType # 6 + """Short range, turbo data rate (highest throughput)""" + MODEM_LONG_TURBO: _ModemPreset.ValueType # 7 + """Long range, turbo data rate""" + MODEM_LITE_FAST: _ModemPreset.ValueType # 8 + """ + Medium range preset optimized for the EU 866 MHz SRD band with 125 kHz bandwidth. + Comparable link budget to MODEM_MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. + """ + MODEM_LITE_SLOW: _ModemPreset.ValueType # 9 + """ + Medium-to-moderate range preset optimized for the EU 866 MHz SRD band with 125 kHz bandwidth. + Comparable link budget to MODEM_LONG_FAST but compliant with Band no. 47b of 2006/771/EC. + """ + MODEM_NARROW_FAST: _ModemPreset.ValueType # 10 + """ + Medium-to-moderate range preset optimized for the EU 868 MHz band with 62.5 kHz bandwidth. + Comparable link budget to MODEM_SHORT_SLOW, but with half the data rate. + Intended to avoid interference with other devices. + """ + MODEM_NARROW_SLOW: _ModemPreset.ValueType # 11 + """ + Moderate range preset optimized for the EU 868 MHz band with 62.5 kHz bandwidth. + Comparable link budget and data rate to MODEM_LONG_FAST. + """ + MODEM_TINY_FAST: _ModemPreset.ValueType # 12 + """ + Preset optimized for compliance with Amateur Radio restrictions: a 15.6 kHz LoRa slot within a 20 kHz raster. + 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 MODEM_LONG_FAST. + """ + MODEM_TINY_SLOW: _ModemPreset.ValueType # 13 + """ + Preset optimized for compliance with Amateur Radio restrictions: a 15.6 kHz LoRa slot within a 20 kHz raster. + 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 MODEM_LONG_MODERATE. + """ + MODEM_MEDIUM_TURBO: _ModemPreset.ValueType # 14 + """ + Medium range, turbo data rate. + Performs similarly to MODEM_MEDIUM_FAST, but with 500 kHz bandwidth. + It is not legal to use in all regions due to this wider bandwidth. + """ + +class ModemPreset(_ModemPreset, metaclass=_ModemPresetEnumTypeWrapper): + """ + Standard predefined channel/modem settings. + Note: these mappings must match ModemPreset choice in the device code. + """ + +MODEM_LONG_FAST: ModemPreset.ValueType # 0 +"""Long range, fast data rate (default)""" +MODEM_MEDIUM_SLOW: ModemPreset.ValueType # 1 +"""Medium range, slow data rate""" +MODEM_MEDIUM_FAST: ModemPreset.ValueType # 2 +"""Medium range, fast data rate""" +MODEM_SHORT_SLOW: ModemPreset.ValueType # 3 +"""Short range, slow data rate""" +MODEM_SHORT_FAST: ModemPreset.ValueType # 4 +"""Short range, fast data rate""" +MODEM_LONG_MODERATE: ModemPreset.ValueType # 5 +"""Long range, moderate data rate""" +MODEM_SHORT_TURBO: ModemPreset.ValueType # 6 +"""Short range, turbo data rate (highest throughput)""" +MODEM_LONG_TURBO: ModemPreset.ValueType # 7 +"""Long range, turbo data rate""" +MODEM_LITE_FAST: ModemPreset.ValueType # 8 +""" +Medium range preset optimized for the EU 866 MHz SRD band with 125 kHz bandwidth. +Comparable link budget to MODEM_MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. +""" +MODEM_LITE_SLOW: ModemPreset.ValueType # 9 +""" +Medium-to-moderate range preset optimized for the EU 866 MHz SRD band with 125 kHz bandwidth. +Comparable link budget to MODEM_LONG_FAST but compliant with Band no. 47b of 2006/771/EC. +""" +MODEM_NARROW_FAST: ModemPreset.ValueType # 10 +""" +Medium-to-moderate range preset optimized for the EU 868 MHz band with 62.5 kHz bandwidth. +Comparable link budget to MODEM_SHORT_SLOW, but with half the data rate. +Intended to avoid interference with other devices. +""" +MODEM_NARROW_SLOW: ModemPreset.ValueType # 11 +""" +Moderate range preset optimized for the EU 868 MHz band with 62.5 kHz bandwidth. +Comparable link budget and data rate to MODEM_LONG_FAST. +""" +MODEM_TINY_FAST: ModemPreset.ValueType # 12 +""" +Preset optimized for compliance with Amateur Radio restrictions: a 15.6 kHz LoRa slot within a 20 kHz raster. +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 MODEM_LONG_FAST. +""" +MODEM_TINY_SLOW: ModemPreset.ValueType # 13 +""" +Preset optimized for compliance with Amateur Radio restrictions: a 15.6 kHz LoRa slot within a 20 kHz raster. +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 MODEM_LONG_MODERATE. +""" +MODEM_MEDIUM_TURBO: ModemPreset.ValueType # 14 +""" +Medium range, turbo data rate. +Performs similarly to MODEM_MEDIUM_FAST, but with 500 kHz bandwidth. +It is not legal to use in all regions due to this wider bandwidth. +""" +Global___ModemPreset: _TypeAlias = ModemPreset # noqa: Y015 + +class _NodeFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _NodeFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_NodeFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + NODE_FLAG_NONE: _NodeFlags.ValueType # 0 + """No flags set""" + NODE_FLAG_IS_KEY_MANUALLY_VERIFIED: _NodeFlags.ValueType # 1 + """The node's public key has been manually verified by the user""" + NODE_FLAG_IS_MUTED: _NodeFlags.ValueType # 2 + """The node has been muted""" + NODE_FLAG_VIA_MQTT: _NodeFlags.ValueType # 4 + """The node was witnessed over MQTT rather than LoRa""" + NODE_FLAG_IS_FAVORITE: _NodeFlags.ValueType # 8 + """The node is in our favorites list""" + NODE_FLAG_IS_IGNORED: _NodeFlags.ValueType # 16 + """The node is in our ignored list""" + NODE_FLAG_HAS_USER: _NodeFlags.ValueType # 32 + """User details for this node have been received (storage only)""" + NODE_FLAG_IS_LICENSED: _NodeFlags.ValueType # 64 + """The node is a licensed amateur operator""" + NODE_FLAG_IS_UNMESSAGABLE: _NodeFlags.ValueType # 128 + """The node cannot be messaged""" + NODE_FLAG_HAS_IS_UNMESSAGABLE: _NodeFlags.ValueType # 256 + """IS_UNMESSAGABLE carries a real value rather than a default (storage only)""" + NODE_FLAG_HAS_XEDDSA_SIGNED: _NodeFlags.ValueType # 512 + """The node signs its packets via XEdDSA""" + NODE_FLAG_HAS_SNR: _NodeFlags.ValueType # 1024 + """An SNR reading has been taken, so a stored 0 means 0 dB (storage only)""" + NODE_FLAG_HAS_RF_HEAR: _NodeFlags.ValueType # 2048 + """ + Heard over our own radio since the current LoRa configuration took effect. + Cleared for every node when the region, modem preset (or the custom + bandwidth, spread factor and coding rate when use_preset is false), + override_frequency, channel_num or the primary channel name changes, since + the frequency slot derives from that name. Never set for a node heard only + over MQTT, which reaches us over the internet rather than over the air - + see NODE_FLAG_VIA_MQTT. + """ + NODE_FLAG_HEARD_ON_CURRENT_LORA: _NodeFlags.ValueType # 16777216 + """ + Bits 12 to 23 are not flags: they hold a fingerprint of the LoRa slot this node was last + heard on, and they exist only in the stored NodeInfoLite.bitfield. Nothing may assign a + flag there. + + + This node has been heard over RF on the LoRa configuration the radio is using right now. + + Derived rather than stored, and set only on NodeInfo.flags: the device compares the slot + fingerprint it recorded for the node against the slot the radio is currently committed + to. The slot covers the region, the modem preset (or the custom bandwidth, spread factor + and coding rate when LORA_USE_PRESET is clear), 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. Never set for a node heard only over MQTT, which reaches us over the internet + rather than over the air - see NODE_FLAG_VIA_MQTT - nor for one added as a shared + contact, which has never been heard over RF at all. + """ + +class NodeFlags(_NodeFlags, metaclass=_NodeFlagsEnumTypeWrapper): + """ + Per-node boolean flags, packed as a bitmask. + + One definition shared by the stored NodeInfoLite.bitfield and the client-facing + NodeInfo.flags, so the two can never drift and firmware converts between them by + copying the word rather than shuffling bits. Values match NODEINFO_BITFIELD_* in + the firmware's src/mesh/NodeDB.h. + + The HAS_* entries are presence bits: they say a value was actually observed, which + a plain false cannot express. HAS_SNR in particular distinguishes a genuine 0 dB + reading from "never measured". + """ + +NODE_FLAG_NONE: NodeFlags.ValueType # 0 +"""No flags set""" +NODE_FLAG_IS_KEY_MANUALLY_VERIFIED: NodeFlags.ValueType # 1 +"""The node's public key has been manually verified by the user""" +NODE_FLAG_IS_MUTED: NodeFlags.ValueType # 2 +"""The node has been muted""" +NODE_FLAG_VIA_MQTT: NodeFlags.ValueType # 4 +"""The node was witnessed over MQTT rather than LoRa""" +NODE_FLAG_IS_FAVORITE: NodeFlags.ValueType # 8 +"""The node is in our favorites list""" +NODE_FLAG_IS_IGNORED: NodeFlags.ValueType # 16 +"""The node is in our ignored list""" +NODE_FLAG_HAS_USER: NodeFlags.ValueType # 32 +"""User details for this node have been received (storage only)""" +NODE_FLAG_IS_LICENSED: NodeFlags.ValueType # 64 +"""The node is a licensed amateur operator""" +NODE_FLAG_IS_UNMESSAGABLE: NodeFlags.ValueType # 128 +"""The node cannot be messaged""" +NODE_FLAG_HAS_IS_UNMESSAGABLE: NodeFlags.ValueType # 256 +"""IS_UNMESSAGABLE carries a real value rather than a default (storage only)""" +NODE_FLAG_HAS_XEDDSA_SIGNED: NodeFlags.ValueType # 512 +"""The node signs its packets via XEdDSA""" +NODE_FLAG_HAS_SNR: NodeFlags.ValueType # 1024 +"""An SNR reading has been taken, so a stored 0 means 0 dB (storage only)""" +NODE_FLAG_HAS_RF_HEAR: NodeFlags.ValueType # 2048 +""" +Heard over our own radio since the current LoRa configuration took effect. +Cleared for every node when the region, modem preset (or the custom +bandwidth, spread factor and coding rate when use_preset is false), +override_frequency, channel_num or the primary channel name changes, since +the frequency slot derives from that name. Never set for a node heard only +over MQTT, which reaches us over the internet rather than over the air - +see NODE_FLAG_VIA_MQTT. +""" +NODE_FLAG_HEARD_ON_CURRENT_LORA: NodeFlags.ValueType # 16777216 +""" +Bits 12 to 23 are not flags: they hold a fingerprint of the LoRa slot this node was last +heard on, and they exist only in the stored NodeInfoLite.bitfield. Nothing may assign a +flag there. + + +This node has been heard over RF on the LoRa configuration the radio is using right now. + +Derived rather than stored, and set only on NodeInfo.flags: the device compares the slot +fingerprint it recorded for the node against the slot the radio is currently committed +to. The slot covers the region, the modem preset (or the custom bandwidth, spread factor +and coding rate when LORA_USE_PRESET is clear), 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. Never set for a node heard only over MQTT, which reaches us over the internet +rather than over the air - see NODE_FLAG_VIA_MQTT - nor for one added as a shared +contact, which has never been heard over RF at all. +""" +Global___NodeFlags: _TypeAlias = NodeFlags # noqa: Y015 + +class _LocSource: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _LocSourceEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_LocSource.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + LOC_UNSET: _LocSource.ValueType # 0 + """Location source not set""" + LOC_MANUAL: _LocSource.ValueType # 1 + """Location was manually entered by the user""" + LOC_INTERNAL: _LocSource.ValueType # 2 + """Location from the device's onboard GPS""" + LOC_EXTERNAL: _LocSource.ValueType # 3 + """Location from an external device (e.g. phone GPS)""" + +class LocSource(_LocSource, metaclass=_LocSourceEnumTypeWrapper): + """ + How the location was acquired: manual, onboard GPS, external (EUD) GPS + """ + +LOC_UNSET: LocSource.ValueType # 0 +"""Location source not set""" +LOC_MANUAL: LocSource.ValueType # 1 +"""Location was manually entered by the user""" +LOC_INTERNAL: LocSource.ValueType # 2 +"""Location from the device's onboard GPS""" +LOC_EXTERNAL: LocSource.ValueType # 3 +"""Location from an external device (e.g. phone GPS)""" +Global___LocSource: _TypeAlias = LocSource # noqa: Y015 + +class _ErrorCode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _ErrorCodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_ErrorCode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CRITICAL_NONE: _ErrorCode.ValueType # 0 + """No critical error""" + CRITICAL_TX_WATCHDOG: _ErrorCode.ValueType # 1 + """Transmit watchdog timer expired""" + CRITICAL_SLEEP_ENTER_WAIT: _ErrorCode.ValueType # 2 + """Timed out waiting to enter sleep mode""" + CRITICAL_NO_RADIO: _ErrorCode.ValueType # 3 + """No LoRa radio detected""" + CRITICAL_UNSPECIFIED: _ErrorCode.ValueType # 4 + """Unspecified critical error""" + CRITICAL_UBLOX_UNIT_FAILED: _ErrorCode.ValueType # 5 + """u-blox GPS unit failed to initialize""" + CRITICAL_NO_AXP192: _ErrorCode.ValueType # 6 + """AXP192 power management chip not found""" + CRITICAL_INVALID_RADIO_SETTING: _ErrorCode.ValueType # 7 + """Invalid LoRa radio configuration""" + CRITICAL_TRANSMIT_FAILED: _ErrorCode.ValueType # 8 + """LoRa radio transmission failed""" + CRITICAL_BROWNOUT: _ErrorCode.ValueType # 9 + """Brownout voltage detected""" + CRITICAL_SX1262_FAILURE: _ErrorCode.ValueType # 10 + """SX1262 LoRa radio failure""" + CRITICAL_RADIO_SPI_BUG: _ErrorCode.ValueType # 11 + """SPI bus communication error with radio""" + CRITICAL_FLASH_CORRUPTION_RECOVERABLE: _ErrorCode.ValueType # 12 + """Flash filesystem corruption (recoverable)""" + CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE: _ErrorCode.ValueType # 13 + """Flash filesystem corruption (unrecoverable, factory reset required)""" + +class ErrorCode(_ErrorCode, metaclass=_ErrorCodeEnumTypeWrapper): + """ + Error codes for critical errors. + The device might report these fault codes on the screen. + """ + +CRITICAL_NONE: ErrorCode.ValueType # 0 +"""No critical error""" +CRITICAL_TX_WATCHDOG: ErrorCode.ValueType # 1 +"""Transmit watchdog timer expired""" +CRITICAL_SLEEP_ENTER_WAIT: ErrorCode.ValueType # 2 +"""Timed out waiting to enter sleep mode""" +CRITICAL_NO_RADIO: ErrorCode.ValueType # 3 +"""No LoRa radio detected""" +CRITICAL_UNSPECIFIED: ErrorCode.ValueType # 4 +"""Unspecified critical error""" +CRITICAL_UBLOX_UNIT_FAILED: ErrorCode.ValueType # 5 +"""u-blox GPS unit failed to initialize""" +CRITICAL_NO_AXP192: ErrorCode.ValueType # 6 +"""AXP192 power management chip not found""" +CRITICAL_INVALID_RADIO_SETTING: ErrorCode.ValueType # 7 +"""Invalid LoRa radio configuration""" +CRITICAL_TRANSMIT_FAILED: ErrorCode.ValueType # 8 +"""LoRa radio transmission failed""" +CRITICAL_BROWNOUT: ErrorCode.ValueType # 9 +"""Brownout voltage detected""" +CRITICAL_SX1262_FAILURE: ErrorCode.ValueType # 10 +"""SX1262 LoRa radio failure""" +CRITICAL_RADIO_SPI_BUG: ErrorCode.ValueType # 11 +"""SPI bus communication error with radio""" +CRITICAL_FLASH_CORRUPTION_RECOVERABLE: ErrorCode.ValueType # 12 +"""Flash filesystem corruption (recoverable)""" +CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE: ErrorCode.ValueType # 13 +"""Flash filesystem corruption (unrecoverable, factory reset required)""" +Global___ErrorCode: _TypeAlias = ErrorCode # noqa: Y015 + +class _FirmwareEdition: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _FirmwareEditionEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_FirmwareEdition.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + EDITION_VANILLA: _FirmwareEdition.ValueType # 0 + """Standard / default firmware build""" + EDITION_SMART_CITIZEN: _FirmwareEdition.ValueType # 1 + """Smart Citizen science event firmware""" + EDITION_OPEN_SAUCE: _FirmwareEdition.ValueType # 16 + """Open Sauce event firmware""" + EDITION_DEFCON: _FirmwareEdition.ValueType # 17 + """DEF CON event firmware""" + EDITION_BURNING_MAN: _FirmwareEdition.ValueType # 18 + """Burning Man event firmware""" + EDITION_HAMVENTION: _FirmwareEdition.ValueType # 19 + """Hamvention event firmware""" + EDITION_FAB: _FirmwareEdition.ValueType # 20 + """FAB, the international Fab Lab digital fabrication conference""" + EDITION_DRAGON_CON: _FirmwareEdition.ValueType # 21 + """Dragon Con, the yearly pop culture convention in Atlanta, GA""" + EDITION_CCC: _FirmwareEdition.ValueType # 22 + """Chaos Communication Congress, the hacker conference held yearly in Germany""" + EDITION_DIY: _FirmwareEdition.ValueType # 127 + """DIY / maker community firmware""" + +class FirmwareEdition(_FirmwareEdition, metaclass=_FirmwareEditionEnumTypeWrapper): + """ + Enum to indicate to clients whether this firmware is a special firmware build, like an event. + """ + +EDITION_VANILLA: FirmwareEdition.ValueType # 0 +"""Standard / default firmware build""" +EDITION_SMART_CITIZEN: FirmwareEdition.ValueType # 1 +"""Smart Citizen science event firmware""" +EDITION_OPEN_SAUCE: FirmwareEdition.ValueType # 16 +"""Open Sauce event firmware""" +EDITION_DEFCON: FirmwareEdition.ValueType # 17 +"""DEF CON event firmware""" +EDITION_BURNING_MAN: FirmwareEdition.ValueType # 18 +"""Burning Man event firmware""" +EDITION_HAMVENTION: FirmwareEdition.ValueType # 19 +"""Hamvention event firmware""" +EDITION_FAB: FirmwareEdition.ValueType # 20 +"""FAB, the international Fab Lab digital fabrication conference""" +EDITION_DRAGON_CON: FirmwareEdition.ValueType # 21 +"""Dragon Con, the yearly pop culture convention in Atlanta, GA""" +EDITION_CCC: FirmwareEdition.ValueType # 22 +"""Chaos Communication Congress, the hacker conference held yearly in Germany""" +EDITION_DIY: FirmwareEdition.ValueType # 127 +"""DIY / maker community firmware""" +Global___FirmwareEdition: _TypeAlias = FirmwareEdition # noqa: Y015 + +@_typing.final +class DeviceMetadata(_message.Message): + """ + Device metadata response + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Capabilities: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _CapabilitiesEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceMetadata._Capabilities.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CAPABILITY_NONE: DeviceMetadata._Capabilities.ValueType # 0 + """No capabilities reported""" + CAPABILITY_CAN_SHUTDOWN: DeviceMetadata._Capabilities.ValueType # 1 + """Can shut the CPU down natively or via a power management chip""" + CAPABILITY_HAS_WIFI: DeviceMetadata._Capabilities.ValueType # 2 + """Has native wifi""" + CAPABILITY_HAS_BLUETOOTH: DeviceMetadata._Capabilities.ValueType # 4 + """Has a working Bluetooth stack in this build""" + CAPABILITY_HAS_ETHERNET: DeviceMetadata._Capabilities.ValueType # 8 + """Has an ethernet peripheral""" + CAPABILITY_HAS_REMOTE_HARDWARE: DeviceMetadata._Capabilities.ValueType # 16 + """Remote Hardware is enabled""" + CAPABILITY_HAS_PKC: DeviceMetadata._Capabilities.ValueType # 32 + """Has public key cryptography""" + CAPABILITY_HAS_XEDDSA: DeviceMetadata._Capabilities.ValueType # 64 + """Build includes XEdDSA packet signature verification; clear when not compiled in""" + + class Capabilities(_Capabilities, metaclass=_CapabilitiesEnumTypeWrapper): + """ + What this device and firmware build can do: a bitwise OR of Capabilities values. + Read-only; a client must not attempt to set these. + """ + + CAPABILITY_NONE: DeviceMetadata.Capabilities.ValueType # 0 + """No capabilities reported""" + CAPABILITY_CAN_SHUTDOWN: DeviceMetadata.Capabilities.ValueType # 1 + """Can shut the CPU down natively or via a power management chip""" + CAPABILITY_HAS_WIFI: DeviceMetadata.Capabilities.ValueType # 2 + """Has native wifi""" + CAPABILITY_HAS_BLUETOOTH: DeviceMetadata.Capabilities.ValueType # 4 + """Has a working Bluetooth stack in this build""" + CAPABILITY_HAS_ETHERNET: DeviceMetadata.Capabilities.ValueType # 8 + """Has an ethernet peripheral""" + CAPABILITY_HAS_REMOTE_HARDWARE: DeviceMetadata.Capabilities.ValueType # 16 + """Remote Hardware is enabled""" + CAPABILITY_HAS_PKC: DeviceMetadata.Capabilities.ValueType # 32 + """Has public key cryptography""" + CAPABILITY_HAS_XEDDSA: DeviceMetadata.Capabilities.ValueType # 64 + """Build includes XEdDSA packet signature verification; clear when not compiled in""" + + FIRMWARE_VERSION_FIELD_NUMBER: _builtins.int + DEVICE_STATE_VERSION_FIELD_NUMBER: _builtins.int + CAPABILITIES_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + POSITION_FLAGS_FIELD_NUMBER: _builtins.int + HW_MODEL_FIELD_NUMBER: _builtins.int + EXCLUDED_MODULES_FIELD_NUMBER: _builtins.int + firmware_version: _builtins.str + """ + Device firmware version string + """ + device_state_version: _builtins.int + """ + Device state version + """ + capabilities: _builtins.int + """ + Bitwise OR of Capabilities values. + """ + role: Global___Role.ValueType + """ + Indicates the device's role in the mesh + """ + position_flags: _builtins.int + """ + The device's currently enabled position flags: + a bitwise OR of PositionConfig.PositionFlags values (config.proto). + """ + hw_model: _builtins.int + """ + Device hardware model, packed as VID/DID + """ + excluded_modules: _builtins.int + """ + Modules compiled out of this build. Bit N is set when the module whose + AdminMessage.ModuleConfigType value is N is excluded, so a module's mask is + 1 << ModuleConfigType. The Bluetooth and network config sections are not modules + and have no bit: a client hides them when CAPABILITY_HAS_BLUETOOTH is clear, or + when CAPABILITY_HAS_WIFI and CAPABILITY_HAS_ETHERNET are both clear. + """ + def __init__( + self, + *, + firmware_version: _builtins.str = ..., + device_state_version: _builtins.int = ..., + capabilities: _builtins.int = ..., + role: Global___Role.ValueType = ..., + position_flags: _builtins.int = ..., + hw_model: _builtins.int = ..., + excluded_modules: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["capabilities", b"capabilities", "device_state_version", b"device_state_version", "excluded_modules", b"excluded_modules", "firmware_version", b"firmware_version", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___DeviceMetadata: _TypeAlias = DeviceMetadata # noqa: Y015 diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index c1ba64d3e..c0a58c5b3 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/config.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,477 +12,367 @@ _sym_db = _symbol_database.Default() -from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 +from meshtastic.protobuf import common_pb2 as meshtastic_dot_protobuf_dot_common__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/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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xec\x16\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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^\n\x13gps_update_interval\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.config_pb2', _globals) 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\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\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\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\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 \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 \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\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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["ALL"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["ALL_SKIP_DECODING"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["LOCAL_ONLY"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["KNOWN_ONLY"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["NONE"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["CORE_PORTNUMS_ONLY"]._options = None + _globals['_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.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS"]._serialized_options = b'\312\363\030\\:\024Double Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_DISABLE_TRIPLE_CLICK"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_DISABLE_TRIPLE_CLICK"]._serialized_options = b'\312\363\030G:\024Disable Triple ClickB/Disables the user button triple-press shortcut.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_LED_HEARTBEAT_DISABLED"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_LED_HEARTBEAT_DISABLED"]._serialized_options = b'\312\363\030\246\001:\rLED HeartbeatB\224\001Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_AUTO_MUTE_DISABLED"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_AUTO_MUTE_DISABLED"]._serialized_options = b'\312\363\030\214\001:\030Disable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.' + _globals['_DEVICECONFIG'].fields_by_name['role']._options = None + _globals['_DEVICECONFIG'].fields_by_name['role']._serialized_options = b'\312\363\030\r:\013Device Role' + _globals['_DEVICECONFIG'].fields_by_name['button_gpio']._options = None + _globals['_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' + _globals['_DEVICECONFIG'].fields_by_name['buzzer_gpio']._options = None + _globals['_DEVICECONFIG'].fields_by_name['buzzer_gpio']._serialized_options = b'\312\363\030*:\013Buzzer GPIOB\033GPIO pin for the PWM buzzer' + _globals['_DEVICECONFIG'].fields_by_name['rebroadcast_mode']._options = None + _globals['_DEVICECONFIG'].fields_by_name['rebroadcast_mode']._serialized_options = b'\312\363\030\022:\020Rebroadcast Mode' + _globals['_DEVICECONFIG'].fields_by_name['node_info_broadcast_secs']._options = None + _globals['_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' + _globals['_LORACONFIG'].fields_by_name['channel_num']._options = None + _globals['_LORACONFIG'].fields_by_name['channel_num']._serialized_options = b'\222?\0028\020\312\363\030\312\001:\016Frequency SlotB\267\001Your node\303\242\342\202\254\342\204\242s 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.' + _globals['_LORACONFIG'].fields_by_name['override_frequency']._options = None + _globals['_LORACONFIG'].fields_by_name['override_frequency']._serialized_options = b'\312\363\030\024:\022Frequency Override' + _globals['_LORACONFIG'].fields_by_name['fem_lna_mode']._options = None + _globals['_LORACONFIG'].fields_by_name['fem_lna_mode']._serialized_options = b'\222?\0028\010\312\363\030\010R\0062.7.20' + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["RANDOM_PIN"]._options = None + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["RANDOM_PIN"]._serialized_options = b'\312\363\030\014:\nRandom Pin' + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["FIXED_PIN"]._options = None + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["FIXED_PIN"]._serialized_options = b'\312\363\030\013:\tFixed Pin' + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["NO_PIN"]._options = None + _globals['_BLUETOOTHCONFIG_PAIRINGMODE'].values_by_name["NO_PIN"]._serialized_options = b'\312\363\030\025:\023No PIN (Just Works)' + _globals['_BLUETOOTHCONFIG'].fields_by_name['enabled']._options = None + _globals['_BLUETOOTHCONFIG'].fields_by_name['enabled']._serialized_options = b'\312\363\0303:\021Bluetooth EnabledB\036Enable Bluetooth on the device' + _globals['_BLUETOOTHCONFIG'].fields_by_name['mode']._options = None + _globals['_BLUETOOTHCONFIG'].fields_by_name['mode']._serialized_options = b'\312\363\030*:\014Pairing ModeB\032Bluetooth pairing strategy' + _globals['_BLUETOOTHCONFIG'].fields_by_name['fixed_pin']._options = None + _globals['_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' + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY'].values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._options = None + _globals['_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.' + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY'].values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._options = None + _globals['_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.' + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY'].values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._options = None + _globals['_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.' + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_IS_MANAGED"]._options = None + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_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.' + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_SERIAL_ENABLED"]._options = None + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_SERIAL_ENABLED"]._serialized_options = b'\312\363\0305:\016Serial ConsoleB#Serial Console over the Stream API.' + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_DEBUG_LOG_API_ENABLED"]._options = None + _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_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.' + _globals['_SECURITYCONFIG'].fields_by_name['public_key']._options = None + _globals['_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' + _globals['_SECURITYCONFIG'].fields_by_name['private_key']._options = None + _globals['_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' + _globals['_SECURITYCONFIG'].fields_by_name['admin_key']._options = None + _globals['_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' + _globals['_SECURITYCONFIG'].fields_by_name['flags']._options = None + _globals['_SECURITYCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_SECURITYCONFIG'].fields_by_name['packet_signature_policy']._options = None + _globals['_SECURITYCONFIG'].fields_by_name['packet_signature_policy']._serialized_options = b'\222?\0028\010\312\363\030\007R\0052.8.0' + _globals['_SECURITYCONFIG'].fields_by_name['ratchet_flags']._options = None + _globals['_SECURITYCONFIG'].fields_by_name['ratchet_flags']._serialized_options = b'\222?\0028\010' + _globals['_SECURITYCONFIG'].fields_by_name['group_private_key']._options = None + _globals['_SECURITYCONFIG'].fields_by_name['group_private_key']._serialized_options = b'\222?\004\010 \020\004' + _globals['_GROUPCONFIG_GROUP'].fields_by_name['name']._options = None + _globals['_GROUPCONFIG_GROUP'].fields_by_name['name']._serialized_options = b'\222?\002\010\014' + _globals['_GROUPCONFIG_GROUP'].fields_by_name['public_key']._options = None + _globals['_GROUPCONFIG_GROUP'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _globals['_GROUPCONFIG'].fields_by_name['groups']._options = None + _globals['_GROUPCONFIG'].fields_by_name['groups']._serialized_options = b'\222?\002\020\004' + _globals['_RELAYCONFIG_RULE'].fields_by_name['channel_hash']._options = None + _globals['_RELAYCONFIG_RULE'].fields_by_name['channel_hash']._serialized_options = b'\222?\0028\010' + _globals['_RELAYCONFIG_RULE'].fields_by_name['hop_cap']._options = None + _globals['_RELAYCONFIG_RULE'].fields_by_name['hop_cap']._serialized_options = b'\222?\0028\010' + _globals['_RELAYCONFIG'].fields_by_name['rules']._options = None + _globals['_RELAYCONFIG'].fields_by_name['rules']._serialized_options = b'\222?\002\020\020' + _globals['_RELAYCONFIG'].fields_by_name['regions']._options = None + _globals['_RELAYCONFIG'].fields_by_name['regions']._serialized_options = b'\222?\004\010\020\020\004' + _globals['_DEVICECONFIG']._serialized_start=168 + _globals['_DEVICECONFIG']._serialized_end=3092 + _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1140 + _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_end=2237 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_start=2239 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_end=2344 + _globals['_DEVICECONFIG_FLAGS']._serialized_start=2347 + _globals['_DEVICECONFIG_FLAGS']._serialized_end=3009 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_start=3011 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_end=3092 + _globals['_POSITIONCONFIG']._serialized_start=3095 + _globals['_POSITIONCONFIG']._serialized_end=4801 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=4275 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=4696 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_start=4698 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_end=4801 + _globals['_POWERCONFIG']._serialized_start=4804 + _globals['_POWERCONFIG']._serialized_end=5507 + _globals['_NETWORKCONFIG']._serialized_start=5510 + _globals['_NETWORKCONFIG']._serialized_end=6663 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_start=6120 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_end=6240 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_start=6242 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_end=6303 + _globals['_NETWORKCONFIG_FLAGS']._serialized_start=6306 + _globals['_NETWORKCONFIG_FLAGS']._serialized_end=6576 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=6578 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=6663 + _globals['_DISPLAYCONFIG']._serialized_start=6666 + _globals['_DISPLAYCONFIG']._serialized_end=8809 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_start=7420 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_end=7667 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_start=7670 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_end=8253 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=8256 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=8470 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=8473 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=8809 + _globals['_LORACONFIG']._serialized_start=8812 + _globals['_LORACONFIG']._serialized_end=10912 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_start=10150 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_end=10208 + _globals['_LORACONFIG_FLAGS']._serialized_start=10211 + _globals['_LORACONFIG_FLAGS']._serialized_end=10912 + _globals['_BLUETOOTHCONFIG']._serialized_start=10915 + _globals['_BLUETOOTHCONFIG']._serialized_end=11351 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11233 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11351 + _globals['_SECURITYCONFIG']._serialized_start=11354 + _globals['_SECURITYCONFIG']._serialized_end=13107 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=11967 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=12561 + _globals['_SECURITYCONFIG_FLAGS']._serialized_start=12564 + _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13020 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13022 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13107 + _globals['_SESSIONKEYCONFIG']._serialized_start=13109 + _globals['_SESSIONKEYCONFIG']._serialized_end=13127 + _globals['_GROUPCONFIG']._serialized_start=13130 + _globals['_GROUPCONFIG']._serialized_end=13287 + _globals['_GROUPCONFIG_GROUP']._serialized_start=13208 + _globals['_GROUPCONFIG_GROUP']._serialized_end=13287 + _globals['_RELAYCONFIG']._serialized_start=13290 + _globals['_RELAYCONFIG']._serialized_end=13701 + _globals['_RELAYCONFIG_RULE']._serialized_start=13525 + _globals['_RELAYCONFIG_RULE']._serialized_end=13641 + _globals['_RELAYCONFIG_ACTION']._serialized_start=13643 + _globals['_RELAYCONFIG_ACTION']._serialized_end=13701 + _globals['_CONFIGPAYLOAD']._serialized_start=13704 + _globals['_CONFIGPAYLOAD']._serialized_end=14337 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index dda77f3ea..55818d1e1 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -3,2222 +3,1940 @@ isort:skip_file """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import meshtastic.protobuf.device_ui_pb2 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import common_pb2 as _common_pb2 +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -@typing.final -class Config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - @typing.final - class DeviceConfig(google.protobuf.message.Message): - """ - Configuration - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _Role: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _RoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._Role.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - CLIENT: Config.DeviceConfig._Role.ValueType # 0 - """ - Description: App connected or stand alone messaging device. - Technical Details: Default Role - """ - CLIENT_MUTE: Config.DeviceConfig._Role.ValueType # 1 - """ - Description: Device that does not forward packets from other devices. - """ - ROUTER: Config.DeviceConfig._Role.ValueType # 2 - """ - Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. - Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. - The wifi radio and the oled screen will be put to sleep. - This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. - """ - ROUTER_CLIENT: Config.DeviceConfig._Role.ValueType # 3 - """ - Description: Combination of both ROUTER and CLIENT. Not for mobile devices. - Deprecated in v2.3.15 because improper usage is impacting public meshes: Use ROUTER or CLIENT instead. - """ - REPEATER: Config.DeviceConfig._Role.ValueType # 4 - """ - Description: Infrastructure node for extending network coverage by relaying messages with minimal overhead. Not visible in Nodes list. - Technical Details: Mesh packets will simply be rebroadcasted over this node. Nodes configured with this role will not originate NodeInfo, Position, Telemetry - or any other packet type. They will simply rebroadcast any mesh packets on the same frequency, channel num, spread factor, and coding rate. - Deprecated in v2.7.11 because it creates "holes" in the mesh rebroadcast chain. - """ - TRACKER: Config.DeviceConfig._Role.ValueType # 5 - """ - Description: Broadcasts GPS position packets as priority. - Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send position, and then sleep for position.position_broadcast_secs seconds. - """ - SENSOR: Config.DeviceConfig._Role.ValueType # 6 - """ - Description: Broadcasts telemetry packets as priority. - Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. - """ - TAK: Config.DeviceConfig._Role.ValueType # 7 - """ - Description: Optimized for ATAK system communication and reduces routine broadcasts. - Technical Details: Used for nodes dedicated for connection to an ATAK EUD. - Turns off many of the routine broadcasts to favor CoT packet stream - from the Meshtastic ATAK plugin -> IMeshService -> Node - """ - CLIENT_HIDDEN: Config.DeviceConfig._Role.ValueType # 8 - """ - Description: Device that only broadcasts as needed for stealth or power savings. - Technical Details: Used for nodes that "only speak when spoken to" - Turns all of the routine broadcasts but allows for ad-hoc communication - Still rebroadcasts, but with local only rebroadcast mode (known meshes only) - Can be used for clandestine operation or to dramatically reduce airtime / power consumption - """ - LOST_AND_FOUND: Config.DeviceConfig._Role.ValueType # 9 - """ - Description: Broadcasts location as message to default channel regularly for to assist with device recovery. - Technical Details: Used to automatically send a text message to the mesh - with the current position of the device on a frequent interval: - "I'm lost! Position: lat / long" - """ - TAK_TRACKER: Config.DeviceConfig._Role.ValueType # 10 - """ - Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. - Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream - and automatic TAK PLI (position location information) broadcasts. - Uses position module configuration to determine TAK PLI broadcast interval. - """ - ROUTER_LATE: Config.DeviceConfig._Role.ValueType # 11 - """ - Description: Will always rebroadcast packets, but will do so after all other modes. - Technical Details: Used for router nodes that are intended to provide additional coverage - in areas not already covered by other routers, or to bridge around problematic terrain, - but should not be given priority over other routers in order to avoid unnecessaraily - consuming hops. - """ - CLIENT_BASE: Config.DeviceConfig._Role.ValueType # 12 - """ - Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. - Technical Details: Used for stronger attic/roof nodes to distribute messages more widely - from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes - where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. - """ - - class Role(_Role, metaclass=_RoleEnumTypeWrapper): - """ - Defines the device's role on the Mesh network - """ - - CLIENT: Config.DeviceConfig.Role.ValueType # 0 - """ - Description: App connected or stand alone messaging device. - Technical Details: Default Role - """ - CLIENT_MUTE: Config.DeviceConfig.Role.ValueType # 1 - """ - Description: Device that does not forward packets from other devices. - """ - ROUTER: Config.DeviceConfig.Role.ValueType # 2 - """ - Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. - Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. - The wifi radio and the oled screen will be put to sleep. - This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. - """ - ROUTER_CLIENT: Config.DeviceConfig.Role.ValueType # 3 - """ - Description: Combination of both ROUTER and CLIENT. Not for mobile devices. - Deprecated in v2.3.15 because improper usage is impacting public meshes: Use ROUTER or CLIENT instead. - """ - REPEATER: Config.DeviceConfig.Role.ValueType # 4 - """ - Description: Infrastructure node for extending network coverage by relaying messages with minimal overhead. Not visible in Nodes list. - Technical Details: Mesh packets will simply be rebroadcasted over this node. Nodes configured with this role will not originate NodeInfo, Position, Telemetry - or any other packet type. They will simply rebroadcast any mesh packets on the same frequency, channel num, spread factor, and coding rate. - Deprecated in v2.7.11 because it creates "holes" in the mesh rebroadcast chain. - """ - TRACKER: Config.DeviceConfig.Role.ValueType # 5 - """ - Description: Broadcasts GPS position packets as priority. - Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send position, and then sleep for position.position_broadcast_secs seconds. - """ - SENSOR: Config.DeviceConfig.Role.ValueType # 6 - """ - Description: Broadcasts telemetry packets as priority. - Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. - """ - TAK: Config.DeviceConfig.Role.ValueType # 7 - """ - Description: Optimized for ATAK system communication and reduces routine broadcasts. - Technical Details: Used for nodes dedicated for connection to an ATAK EUD. - Turns off many of the routine broadcasts to favor CoT packet stream - from the Meshtastic ATAK plugin -> IMeshService -> Node - """ - CLIENT_HIDDEN: Config.DeviceConfig.Role.ValueType # 8 - """ - Description: Device that only broadcasts as needed for stealth or power savings. - Technical Details: Used for nodes that "only speak when spoken to" - Turns all of the routine broadcasts but allows for ad-hoc communication - Still rebroadcasts, but with local only rebroadcast mode (known meshes only) - Can be used for clandestine operation or to dramatically reduce airtime / power consumption - """ - LOST_AND_FOUND: Config.DeviceConfig.Role.ValueType # 9 - """ - Description: Broadcasts location as message to default channel regularly for to assist with device recovery. - Technical Details: Used to automatically send a text message to the mesh - with the current position of the device on a frequent interval: - "I'm lost! Position: lat / long" - """ - TAK_TRACKER: Config.DeviceConfig.Role.ValueType # 10 - """ - Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. - Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream - and automatic TAK PLI (position location information) broadcasts. - Uses position module configuration to determine TAK PLI broadcast interval. - """ - ROUTER_LATE: Config.DeviceConfig.Role.ValueType # 11 - """ - Description: Will always rebroadcast packets, but will do so after all other modes. - Technical Details: Used for router nodes that are intended to provide additional coverage - in areas not already covered by other routers, or to bridge around problematic terrain, - but should not be given priority over other routers in order to avoid unnecessaraily - consuming hops. - """ - CLIENT_BASE: Config.DeviceConfig.Role.ValueType # 12 - """ - Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. - Technical Details: Used for stronger attic/roof nodes to distribute messages more widely - from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes - where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. - """ - - class _RebroadcastMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _RebroadcastModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._RebroadcastMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - ALL: Config.DeviceConfig._RebroadcastMode.ValueType # 0 - """ - Default behavior. - Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params. - """ - ALL_SKIP_DECODING: Config.DeviceConfig._RebroadcastMode.ValueType # 1 - """ - Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. - Only available in Repeater role. Setting this on any other roles will result in ALL behavior. - """ - LOCAL_ONLY: Config.DeviceConfig._RebroadcastMode.ValueType # 2 - """ - Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. - Only rebroadcasts message on the nodes local primary / secondary channels. - """ - KNOWN_ONLY: Config.DeviceConfig._RebroadcastMode.ValueType # 3 - """ - Ignores observed messages from foreign meshes like LOCAL_ONLY, - but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB) - """ - NONE: Config.DeviceConfig._RebroadcastMode.ValueType # 4 - """ - Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. - """ - CORE_PORTNUMS_ONLY: Config.DeviceConfig._RebroadcastMode.ValueType # 5 - """ - Ignores packets from non-standard portnums such as: TAK, RangeTest, PaxCounter, etc. - Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. - """ - - class RebroadcastMode(_RebroadcastMode, metaclass=_RebroadcastModeEnumTypeWrapper): - """ - Defines the device's behavior for how messages are rebroadcast - """ - - ALL: Config.DeviceConfig.RebroadcastMode.ValueType # 0 + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class DeviceConfig(_message.Message): + """ + Configuration + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _RebroadcastMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _RebroadcastModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceConfig._RebroadcastMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + ALL: DeviceConfig._RebroadcastMode.ValueType # 0 """ Default behavior. Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params. """ - ALL_SKIP_DECODING: Config.DeviceConfig.RebroadcastMode.ValueType # 1 + ALL_SKIP_DECODING: DeviceConfig._RebroadcastMode.ValueType # 1 """ - Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. - Only available in Repeater role. Setting this on any other roles will result in ALL behavior. + Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node + that repeats everything it hears without looking inside. Available on the relaying + roles, ROUTER and ROUTER_LATE; on any other role it behaves as ALL. """ - LOCAL_ONLY: Config.DeviceConfig.RebroadcastMode.ValueType # 2 + LOCAL_ONLY: DeviceConfig._RebroadcastMode.ValueType # 2 """ Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels. """ - KNOWN_ONLY: Config.DeviceConfig.RebroadcastMode.ValueType # 3 + KNOWN_ONLY: DeviceConfig._RebroadcastMode.ValueType # 3 """ Ignores observed messages from foreign meshes like LOCAL_ONLY, but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB) """ - NONE: Config.DeviceConfig.RebroadcastMode.ValueType # 4 + NONE: DeviceConfig._RebroadcastMode.ValueType # 4 """ Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. """ - CORE_PORTNUMS_ONLY: Config.DeviceConfig.RebroadcastMode.ValueType # 5 + CORE_PORTNUMS_ONLY: DeviceConfig._RebroadcastMode.ValueType # 5 """ - Ignores packets from non-standard portnums such as: TAK, RangeTest, PaxCounter, etc. + Ignores packets from non-standard portnums such as: TAK, PaxCounter, etc. Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. """ - class _BuzzerMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _BuzzerModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._BuzzerMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - ALL_ENABLED: Config.DeviceConfig._BuzzerMode.ValueType # 0 - """ - Default behavior. - Buzzer is enabled for all audio feedback including button presses and alerts. - """ - DISABLED: Config.DeviceConfig._BuzzerMode.ValueType # 1 - """ - Disabled. - All buzzer audio feedback is disabled. - """ - NOTIFICATIONS_ONLY: Config.DeviceConfig._BuzzerMode.ValueType # 2 - """ - Notifications Only. - Buzzer is enabled only for notifications and alerts, but not for button presses. - External notification config determines the specifics of the notification behavior. - """ - SYSTEM_ONLY: Config.DeviceConfig._BuzzerMode.ValueType # 3 - """ - Non-notification system buzzer tones only. - Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. - """ - DIRECT_MSG_ONLY: Config.DeviceConfig._BuzzerMode.ValueType # 4 - """ - Direct Message notifications only. - Buzzer is enabled only for direct messages and alerts, but not for button presses. - External notification config determines the specifics of the notification behavior. - """ - - class BuzzerMode(_BuzzerMode, metaclass=_BuzzerModeEnumTypeWrapper): - """ - Defines buzzer behavior for audio feedback - """ - - ALL_ENABLED: Config.DeviceConfig.BuzzerMode.ValueType # 0 + class RebroadcastMode(_RebroadcastMode, metaclass=_RebroadcastModeEnumTypeWrapper): + """ + Defines the device's behavior for how messages are rebroadcast + """ + + ALL: DeviceConfig.RebroadcastMode.ValueType # 0 + """ + Default behavior. + Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params. + """ + ALL_SKIP_DECODING: DeviceConfig.RebroadcastMode.ValueType # 1 + """ + Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node + that repeats everything it hears without looking inside. Available on the relaying + roles, ROUTER and ROUTER_LATE; on any other role it behaves as ALL. + """ + LOCAL_ONLY: DeviceConfig.RebroadcastMode.ValueType # 2 + """ + Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. + Only rebroadcasts message on the nodes local primary / secondary channels. + """ + KNOWN_ONLY: DeviceConfig.RebroadcastMode.ValueType # 3 + """ + Ignores observed messages from foreign meshes like LOCAL_ONLY, + but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB) + """ + NONE: DeviceConfig.RebroadcastMode.ValueType # 4 + """ + Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. + """ + CORE_PORTNUMS_ONLY: DeviceConfig.RebroadcastMode.ValueType # 5 + """ + Ignores packets from non-standard portnums such as: TAK, PaxCounter, etc. + Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. + """ + + class _BuzzerMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _BuzzerModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceConfig._BuzzerMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + ALL_ENABLED: DeviceConfig._BuzzerMode.ValueType # 0 """ Default behavior. Buzzer is enabled for all audio feedback including button presses and alerts. """ - DISABLED: Config.DeviceConfig.BuzzerMode.ValueType # 1 + DISABLED: DeviceConfig._BuzzerMode.ValueType # 1 """ Disabled. All buzzer audio feedback is disabled. """ - NOTIFICATIONS_ONLY: Config.DeviceConfig.BuzzerMode.ValueType # 2 + NOTIFICATIONS_ONLY: DeviceConfig._BuzzerMode.ValueType # 2 """ Notifications Only. Buzzer is enabled only for notifications and alerts, but not for button presses. External notification config determines the specifics of the notification behavior. """ - SYSTEM_ONLY: Config.DeviceConfig.BuzzerMode.ValueType # 3 + SYSTEM_ONLY: DeviceConfig._BuzzerMode.ValueType # 3 """ Non-notification system buzzer tones only. Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. """ - DIRECT_MSG_ONLY: Config.DeviceConfig.BuzzerMode.ValueType # 4 + DIRECT_MSG_ONLY: DeviceConfig._BuzzerMode.ValueType # 4 """ Direct Message notifications only. Buzzer is enabled only for direct messages and alerts, but not for button presses. External notification config determines the specifics of the notification behavior. """ - ROLE_FIELD_NUMBER: builtins.int - SERIAL_ENABLED_FIELD_NUMBER: builtins.int - BUTTON_GPIO_FIELD_NUMBER: builtins.int - BUZZER_GPIO_FIELD_NUMBER: builtins.int - REBROADCAST_MODE_FIELD_NUMBER: builtins.int - NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: builtins.int - DOUBLE_TAP_AS_BUTTON_PRESS_FIELD_NUMBER: builtins.int - IS_MANAGED_FIELD_NUMBER: builtins.int - DISABLE_TRIPLE_CLICK_FIELD_NUMBER: builtins.int - TZDEF_FIELD_NUMBER: builtins.int - LED_HEARTBEAT_DISABLED_FIELD_NUMBER: builtins.int - BUZZER_MODE_FIELD_NUMBER: builtins.int - role: global___Config.DeviceConfig.Role.ValueType - """ - Sets the role of node - """ - serial_enabled: builtins.bool - """ - Disabling this will disable the SerialConsole by not initilizing the StreamAPI - Moved to SecurityConfig - """ - button_gpio: builtins.int - """ - For boards without a hard wired button, this is the pin number that will be used - Boards that have more than one button can swap the function with this one. defaults to BUTTON_PIN if defined. - """ - buzzer_gpio: builtins.int - """ - For boards without a PWM buzzer, this is the pin number that will be used - Defaults to PIN_BUZZER if defined. - """ - rebroadcast_mode: global___Config.DeviceConfig.RebroadcastMode.ValueType - """ - Sets the role of node - """ - node_info_broadcast_secs: builtins.int - """ - Send our nodeinfo this often - Defaults to 900 Seconds (15 minutes) - """ - double_tap_as_button_press: builtins.bool - """ - Treat double tap interrupt on supported accelerometers as a button press if set to true - """ - is_managed: builtins.bool - """ - If true, device is considered to be "managed" by a mesh administrator - Clients should then limit available configuration and administrative options inside the user interface - Moved to SecurityConfig - """ - disable_triple_click: builtins.bool - """ - Disables the triple-press of user button to enable or disable GPS - """ - tzdef: builtins.str - """ - POSIX Timezone definition string from https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv. - """ - led_heartbeat_disabled: builtins.bool - """ - If true, disable the default blinking LED (LED_PIN) behavior on the device - """ - buzzer_mode: global___Config.DeviceConfig.BuzzerMode.ValueType - """ - Controls buzzer behavior for audio feedback - Defaults to ENABLED - """ - def __init__( - self, - *, - role: global___Config.DeviceConfig.Role.ValueType = ..., - serial_enabled: builtins.bool = ..., - button_gpio: builtins.int = ..., - buzzer_gpio: builtins.int = ..., - rebroadcast_mode: global___Config.DeviceConfig.RebroadcastMode.ValueType = ..., - node_info_broadcast_secs: builtins.int = ..., - double_tap_as_button_press: builtins.bool = ..., - is_managed: builtins.bool = ..., - disable_triple_click: builtins.bool = ..., - tzdef: builtins.str = ..., - led_heartbeat_disabled: builtins.bool = ..., - buzzer_mode: global___Config.DeviceConfig.BuzzerMode.ValueType = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "buzzer_mode", b"buzzer_mode", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "led_heartbeat_disabled", b"led_heartbeat_disabled", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled", "tzdef", b"tzdef"]) -> None: ... - - @typing.final - class PositionConfig(google.protobuf.message.Message): - """ - Position Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _PositionFlags: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _PositionFlagsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.PositionConfig._PositionFlags.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: Config.PositionConfig._PositionFlags.ValueType # 0 - """ - Required for compilation - """ - ALTITUDE: Config.PositionConfig._PositionFlags.ValueType # 1 - """ - Include an altitude value (if available) - """ - ALTITUDE_MSL: Config.PositionConfig._PositionFlags.ValueType # 2 - """ - Altitude value is MSL - """ - GEOIDAL_SEPARATION: Config.PositionConfig._PositionFlags.ValueType # 4 - """ - Include geoidal separation - """ - DOP: Config.PositionConfig._PositionFlags.ValueType # 8 - """ - Include the DOP value ; PDOP used by default, see below - """ - HVDOP: Config.PositionConfig._PositionFlags.ValueType # 16 - """ - If POS_DOP set, send separate HDOP / VDOP values instead of PDOP - """ - SATINVIEW: Config.PositionConfig._PositionFlags.ValueType # 32 - """ - Include number of "satellites in view" - """ - SEQ_NO: Config.PositionConfig._PositionFlags.ValueType # 64 - """ - Include a sequence number incremented per packet - """ - TIMESTAMP: Config.PositionConfig._PositionFlags.ValueType # 128 - """ - Include positional timestamp (from GPS solution) - """ - HEADING: Config.PositionConfig._PositionFlags.ValueType # 256 - """ - Include positional heading - Intended for use with vehicle not walking speeds - walking speeds are likely to be error prone like the compass - """ - SPEED: Config.PositionConfig._PositionFlags.ValueType # 512 - """ - Include positional speed - Intended for use with vehicle not walking speeds - walking speeds are likely to be error prone like the compass - """ - - class PositionFlags(_PositionFlags, metaclass=_PositionFlagsEnumTypeWrapper): - """ - Bit field of boolean configuration options, indicating which optional - fields to include when assembling POSITION messages. - Longitude, latitude, altitude, speed, heading, and DOP - are always included (also time if GPS-synced) - NOTE: the more fields are included, the larger the message will be - - leading to longer airtime and a higher risk of packet loss - """ - - UNSET: Config.PositionConfig.PositionFlags.ValueType # 0 + class BuzzerMode(_BuzzerMode, metaclass=_BuzzerModeEnumTypeWrapper): + """ + Defines buzzer behavior for audio feedback + """ + + ALL_ENABLED: DeviceConfig.BuzzerMode.ValueType # 0 + """ + Default behavior. + Buzzer is enabled for all audio feedback including button presses and alerts. + """ + DISABLED: DeviceConfig.BuzzerMode.ValueType # 1 + """ + Disabled. + All buzzer audio feedback is disabled. + """ + NOTIFICATIONS_ONLY: DeviceConfig.BuzzerMode.ValueType # 2 + """ + Notifications Only. + Buzzer is enabled only for notifications and alerts, but not for button presses. + External notification config determines the specifics of the notification behavior. + """ + SYSTEM_ONLY: DeviceConfig.BuzzerMode.ValueType # 3 + """ + Non-notification system buzzer tones only. + Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. + """ + DIRECT_MSG_ONLY: DeviceConfig.BuzzerMode.ValueType # 4 + """ + Direct Message notifications only. + Buzzer is enabled only for direct messages and alerts, but not for button presses. + External notification config determines the specifics of the notification behavior. + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DEVICE_NONE: DeviceConfig._Flags.ValueType # 0 + """Nothing enabled""" + DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS: DeviceConfig._Flags.ValueType # 1 + """Treat a double tap on a supported accelerometer as a button press""" + DEVICE_DISABLE_TRIPLE_CLICK: DeviceConfig._Flags.ValueType # 2 + """Disable the triple-press of the user button that toggles GPS""" + DEVICE_LED_HEARTBEAT_DISABLED: DeviceConfig._Flags.ValueType # 4 + """Disable the default blinking LED (LED_PIN) behaviour""" + DEVICE_AUTO_MUTE_DISABLED: DeviceConfig._Flags.ValueType # 8 + """Turn client auto-mute off: a CLIENT keeps relaying broadcasts however many routers it hears""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Device behaviour toggles: a bitwise OR of Flags values. + """ + + DEVICE_NONE: DeviceConfig.Flags.ValueType # 0 + """Nothing enabled""" + DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS: DeviceConfig.Flags.ValueType # 1 + """Treat a double tap on a supported accelerometer as a button press""" + DEVICE_DISABLE_TRIPLE_CLICK: DeviceConfig.Flags.ValueType # 2 + """Disable the triple-press of the user button that toggles GPS""" + DEVICE_LED_HEARTBEAT_DISABLED: DeviceConfig.Flags.ValueType # 4 + """Disable the default blinking LED (LED_PIN) behaviour""" + DEVICE_AUTO_MUTE_DISABLED: DeviceConfig.Flags.ValueType # 8 + """Turn client auto-mute off: a CLIENT keeps relaying broadcasts however many routers it hears""" + + class _DiscoveryFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _DiscoveryFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceConfig._DiscoveryFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DISCOVERY_NONE: DeviceConfig._DiscoveryFlags.ValueType # 0 + """Nothing set""" + DISCOVERY_SERVE: DeviceConfig._DiscoveryFlags.ValueType # 1 + """ + This node serves discovery records: it files what it hears, answers queries and syncs + with peer servers. Set on a node with the storage to hold a database, which in practice + means the store and forward server hardware. + """ + DISCOVERY_NO_TAPER: DeviceConfig._DiscoveryFlags.ValueType # 2 + """ + Stay at the announce cadence and full hop budget whatever the mesh looks like. For a + test mesh that wants the traffic, and for a node whose operator has a reason. + """ + + class DiscoveryFlags(_DiscoveryFlags, metaclass=_DiscoveryFlagsEnumTypeWrapper): + """ + Node discovery behaviour: a bitwise OR of DiscoveryFlags values. + """ + + DISCOVERY_NONE: DeviceConfig.DiscoveryFlags.ValueType # 0 + """Nothing set""" + DISCOVERY_SERVE: DeviceConfig.DiscoveryFlags.ValueType # 1 + """ + This node serves discovery records: it files what it hears, answers queries and syncs + with peer servers. Set on a node with the storage to hold a database, which in practice + means the store and forward server hardware. + """ + DISCOVERY_NO_TAPER: DeviceConfig.DiscoveryFlags.ValueType # 2 + """ + Stay at the announce cadence and full hop budget whatever the mesh looks like. For a + test mesh that wants the traffic, and for a node whose operator has a reason. + """ + + ROLE_FIELD_NUMBER: _builtins.int + BUTTON_GPIO_FIELD_NUMBER: _builtins.int + BUZZER_GPIO_FIELD_NUMBER: _builtins.int + REBROADCAST_MODE_FIELD_NUMBER: _builtins.int + NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + TZDEF_FIELD_NUMBER: _builtins.int + BUZZER_MODE_FIELD_NUMBER: _builtins.int + DISCOVERY_FLAGS_FIELD_NUMBER: _builtins.int + DISCOVERY_NODE_THRESHOLD_FIELD_NUMBER: _builtins.int + TAPER_FACTOR_FIELD_NUMBER: _builtins.int + FULL_ANNOUNCE_SECS_FIELD_NUMBER: _builtins.int + AUTO_MUTE_ROUTER_COUNT_FIELD_NUMBER: _builtins.int + AUTO_MUTE_MIN_SNR_FIELD_NUMBER: _builtins.int + AUTO_MUTE_WINDOW_SECS_FIELD_NUMBER: _builtins.int + role: _common_pb2.Role.ValueType + """ + Sets the role of node + """ + button_gpio: _builtins.int + """ + For boards without a hard wired button, this is the pin number that will be used + Boards that have more than one button can swap the function with this one. defaults to BUTTON_PIN if defined. + """ + buzzer_gpio: _builtins.int + """ + GPIO the PWM buzzer is connected to, used for system tones and, when + ALERT_USE_PWM is set, for notification ringtones. 0 is GPIO0, not "unset": + buzzer_mode says whether the buzzer sounds. Set to PIN_BUZZER, where the board + defines one, when the config is created. + """ + rebroadcast_mode: Global___DeviceConfig.RebroadcastMode.ValueType + """ + Sets the role of node + """ + node_info_broadcast_secs: _builtins.int + """ + Send our nodeinfo this often + Defaults to 900 Seconds (15 minutes) + """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + tzdef: _builtins.str + """ + POSIX Timezone definition string from https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv. + """ + buzzer_mode: Global___DeviceConfig.BuzzerMode.ValueType + """ + Controls buzzer behavior for audio feedback + Defaults to ENABLED + """ + discovery_flags: _builtins.int + """ + Bitwise OR of DiscoveryFlags values. + """ + discovery_node_threshold: _builtins.int + """ + Node count at which announcements taper: at or above it a node lengthens its NodeInfo + interval by taper_factor, whether or not it has seen a discovery server. 0 takes the + default of 40. + """ + taper_factor: _builtins.int + """ + What the NodeInfo interval is multiplied by once a mesh is dense enough to taper, floored + at 30 minutes and capped at 24 hours. 0 takes the default of 4. + """ + full_announce_secs: _builtins.int + """ + Seconds between the full-budget announcements a node keeps making even while discovery + servers carry its record, which is what seeds a server that came up after it did. 0 takes + the default of 86400. + """ + auto_mute_router_count: _builtins.int + """ + Client auto-mute, CLIENT role only. A client that hears at least auto_mute_router_count + ROUTER or ROUTER_LATE neighbours directly, at auto_mute_min_snr or better, within + auto_mute_window_secs stops relaying broadcasts: those routers already reach everyone it + would. Unicast it is asked to carry is relayed as before. It resumes once the condition has + not held for a whole window. DEVICE_AUTO_MUTE_DISABLED turns it off. + + Router neighbours needed to mute. 0 takes the default of 2. + """ + auto_mute_min_snr: _builtins.int + """ + Weakest link, as SNR in dB x 2, at which a router neighbour counts toward + auto_mute_router_count. 0 is 0 dB, which is also the default. + """ + auto_mute_window_secs: _builtins.int + """ + Seconds within which a router neighbour must have been heard to count, and how long the + condition must stay false before a muted client relays again. 0 takes the default of 3600. + """ + def __init__( + self, + *, + role: _common_pb2.Role.ValueType = ..., + button_gpio: _builtins.int = ..., + buzzer_gpio: _builtins.int = ..., + rebroadcast_mode: Global___DeviceConfig.RebroadcastMode.ValueType = ..., + node_info_broadcast_secs: _builtins.int = ..., + flags: _builtins.int = ..., + tzdef: _builtins.str = ..., + buzzer_mode: Global___DeviceConfig.BuzzerMode.ValueType = ..., + discovery_flags: _builtins.int = ..., + discovery_node_threshold: _builtins.int = ..., + taper_factor: _builtins.int = ..., + full_announce_secs: _builtins.int = ..., + auto_mute_router_count: _builtins.int = ..., + auto_mute_min_snr: _builtins.int = ..., + auto_mute_window_secs: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["auto_mute_min_snr", b"auto_mute_min_snr", "auto_mute_router_count", b"auto_mute_router_count", "auto_mute_window_secs", b"auto_mute_window_secs", "button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "buzzer_mode", b"buzzer_mode", "discovery_flags", b"discovery_flags", "discovery_node_threshold", b"discovery_node_threshold", "flags", b"flags", "full_announce_secs", b"full_announce_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "taper_factor", b"taper_factor", "tzdef", b"tzdef"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___DeviceConfig: _TypeAlias = DeviceConfig # noqa: Y015 + +@_typing.final +class PositionConfig(_message.Message): + """ + Position Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _PositionFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _PositionFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[PositionConfig._PositionFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + UNSET: PositionConfig._PositionFlags.ValueType # 0 """ Required for compilation """ - ALTITUDE: Config.PositionConfig.PositionFlags.ValueType # 1 + ALTITUDE: PositionConfig._PositionFlags.ValueType # 1 """ Include an altitude value (if available) """ - ALTITUDE_MSL: Config.PositionConfig.PositionFlags.ValueType # 2 - """ - Altitude value is MSL - """ - GEOIDAL_SEPARATION: Config.PositionConfig.PositionFlags.ValueType # 4 + GEOIDAL_SEPARATION: PositionConfig._PositionFlags.ValueType # 4 """ Include geoidal separation """ - DOP: Config.PositionConfig.PositionFlags.ValueType # 8 - """ - Include the DOP value ; PDOP used by default, see below - """ - HVDOP: Config.PositionConfig.PositionFlags.ValueType # 16 + DOP: PositionConfig._PositionFlags.ValueType # 8 """ - If POS_DOP set, send separate HDOP / VDOP values instead of PDOP + Include dilution of precision as the GPS chip reports it: PDOP, or HDOP and VDOP """ - SATINVIEW: Config.PositionConfig.PositionFlags.ValueType # 32 + SATINVIEW: PositionConfig._PositionFlags.ValueType # 32 """ Include number of "satellites in view" """ - SEQ_NO: Config.PositionConfig.PositionFlags.ValueType # 64 + SEQ_NO: PositionConfig._PositionFlags.ValueType # 64 """ Include a sequence number incremented per packet """ - TIMESTAMP: Config.PositionConfig.PositionFlags.ValueType # 128 - """ - Include positional timestamp (from GPS solution) - """ - HEADING: Config.PositionConfig.PositionFlags.ValueType # 256 + HEADING: PositionConfig._PositionFlags.ValueType # 256 """ Include positional heading Intended for use with vehicle not walking speeds walking speeds are likely to be error prone like the compass """ - SPEED: Config.PositionConfig.PositionFlags.ValueType # 512 + SPEED: PositionConfig._PositionFlags.ValueType # 512 """ Include positional speed Intended for use with vehicle not walking speeds walking speeds are likely to be error prone like the compass """ - class _GpsMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _GpsModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.PositionConfig._GpsMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DISABLED: Config.PositionConfig._GpsMode.ValueType # 0 - """ - GPS is present but disabled - """ - ENABLED: Config.PositionConfig._GpsMode.ValueType # 1 - """ - GPS is present and enabled - """ - NOT_PRESENT: Config.PositionConfig._GpsMode.ValueType # 2 - """ - GPS is not present on the device - """ - - class GpsMode(_GpsMode, metaclass=_GpsModeEnumTypeWrapper): ... - DISABLED: Config.PositionConfig.GpsMode.ValueType # 0 + class PositionFlags(_PositionFlags, metaclass=_PositionFlagsEnumTypeWrapper): + """ + Bit field of boolean configuration options, indicating which optional + fields to include when assembling POSITION messages. + Longitude, latitude, altitude, speed, heading, and DOP + are always included (also time if GPS-synced) + NOTE: the more fields are included, the larger the message will be - + leading to longer airtime and a higher risk of packet loss + """ + + UNSET: PositionConfig.PositionFlags.ValueType # 0 + """ + Required for compilation + """ + ALTITUDE: PositionConfig.PositionFlags.ValueType # 1 + """ + Include an altitude value (if available) + """ + GEOIDAL_SEPARATION: PositionConfig.PositionFlags.ValueType # 4 + """ + Include geoidal separation + """ + DOP: PositionConfig.PositionFlags.ValueType # 8 + """ + Include dilution of precision as the GPS chip reports it: PDOP, or HDOP and VDOP + """ + SATINVIEW: PositionConfig.PositionFlags.ValueType # 32 + """ + Include number of "satellites in view" + """ + SEQ_NO: PositionConfig.PositionFlags.ValueType # 64 + """ + Include a sequence number incremented per packet + """ + HEADING: PositionConfig.PositionFlags.ValueType # 256 + """ + Include positional heading + Intended for use with vehicle not walking speeds + walking speeds are likely to be error prone like the compass + """ + SPEED: PositionConfig.PositionFlags.ValueType # 512 + """ + Include positional speed + Intended for use with vehicle not walking speeds + walking speeds are likely to be error prone like the compass + """ + + class _GpsMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _GpsModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[PositionConfig._GpsMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DISABLED: PositionConfig._GpsMode.ValueType # 0 """ GPS is present but disabled """ - ENABLED: Config.PositionConfig.GpsMode.ValueType # 1 + ENABLED: PositionConfig._GpsMode.ValueType # 1 """ GPS is present and enabled """ - NOT_PRESENT: Config.PositionConfig.GpsMode.ValueType # 2 + NOT_PRESENT: PositionConfig._GpsMode.ValueType # 2 """ GPS is not present on the device """ - POSITION_BROADCAST_SECS_FIELD_NUMBER: builtins.int - POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: builtins.int - FIXED_POSITION_FIELD_NUMBER: builtins.int - GPS_ENABLED_FIELD_NUMBER: builtins.int - GPS_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - GPS_ATTEMPT_TIME_FIELD_NUMBER: builtins.int - POSITION_FLAGS_FIELD_NUMBER: builtins.int - RX_GPIO_FIELD_NUMBER: builtins.int - TX_GPIO_FIELD_NUMBER: builtins.int - BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: builtins.int - BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: builtins.int - GPS_EN_GPIO_FIELD_NUMBER: builtins.int - GPS_MODE_FIELD_NUMBER: builtins.int - position_broadcast_secs: builtins.int - """ - We should send our position this often (but only if it has changed significantly) - Defaults to 15 minutes - """ - position_broadcast_smart_enabled: builtins.bool - """ - Adaptive position braoadcast, which is now the default. - """ - fixed_position: builtins.bool - """ - If set, this node is at a fixed position. - We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node. - The lat/lon/alt can be set by an internal GPS or with the help of the app. - """ - gps_enabled: builtins.bool - """ - Is GPS enabled for this node? - """ - gps_update_interval: builtins.int - """ - How often should we try to get GPS position (in seconds) - or zero for the default of once every 30 seconds - or a very large value (maxint) to update only once at boot. - """ - gps_attempt_time: builtins.int - """ - Deprecated in favor of using smart / regular broadcast intervals as implicit attempt time - """ - position_flags: builtins.int - """ - Bit field of boolean configuration options for POSITION messages - (bitwise OR of PositionFlags) - """ - rx_gpio: builtins.int - """ - (Re)define GPS_RX_PIN for your board. - """ - tx_gpio: builtins.int - """ - (Re)define GPS_TX_PIN for your board. - """ - broadcast_smart_minimum_distance: builtins.int - """ - The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled - """ - broadcast_smart_minimum_interval_secs: builtins.int - """ - The minimum number of seconds (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled - """ - gps_en_gpio: builtins.int - """ - (Re)define PIN_GPS_EN for your board. - """ - gps_mode: global___Config.PositionConfig.GpsMode.ValueType - """ - Set where GPS is enabled, disabled, or not present - """ - def __init__( - self, - *, - position_broadcast_secs: builtins.int = ..., - position_broadcast_smart_enabled: builtins.bool = ..., - fixed_position: builtins.bool = ..., - gps_enabled: builtins.bool = ..., - gps_update_interval: builtins.int = ..., - gps_attempt_time: builtins.int = ..., - position_flags: builtins.int = ..., - rx_gpio: builtins.int = ..., - tx_gpio: builtins.int = ..., - broadcast_smart_minimum_distance: builtins.int = ..., - broadcast_smart_minimum_interval_secs: builtins.int = ..., - gps_en_gpio: builtins.int = ..., - gps_mode: global___Config.PositionConfig.GpsMode.ValueType = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_attempt_time", b"gps_attempt_time", "gps_en_gpio", b"gps_en_gpio", "gps_enabled", b"gps_enabled", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"]) -> None: ... - - @typing.final - class PowerConfig(google.protobuf.message.Message): - """ - Power Config\\ - See [Power Config](/docs/settings/config/power) for additional power config details. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - IS_POWER_SAVING_FIELD_NUMBER: builtins.int - ON_BATTERY_SHUTDOWN_AFTER_SECS_FIELD_NUMBER: builtins.int - ADC_MULTIPLIER_OVERRIDE_FIELD_NUMBER: builtins.int - WAIT_BLUETOOTH_SECS_FIELD_NUMBER: builtins.int - SDS_SECS_FIELD_NUMBER: builtins.int - LS_SECS_FIELD_NUMBER: builtins.int - MIN_WAKE_SECS_FIELD_NUMBER: builtins.int - DEVICE_BATTERY_INA_ADDRESS_FIELD_NUMBER: builtins.int - POWERMON_ENABLES_FIELD_NUMBER: builtins.int - is_power_saving: builtins.bool - """ - Description: Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. - Don't use this setting if you want to use your device with the phone apps or are using a device without a user button. - Technical Details: Works for ESP32 devices and NRF52 devices in the Sensor or Tracker roles - """ - on_battery_shutdown_after_secs: builtins.int - """ - Description: If non-zero, the device will fully power off this many seconds after external power is removed. - """ - adc_multiplier_override: builtins.float - """ - Ratio of voltage divider for battery pin eg. 3.20 (R1=100k, R2=220k) - Overrides the ADC_MULTIPLIER defined in variant for battery voltage calculation. - https://meshtastic.org/docs/configuration/radio/power/#adc-multiplier-override - Should be set to floating point value between 2 and 6 - """ - wait_bluetooth_secs: builtins.int - """ - Description: The number of seconds for to wait before turning off BLE in No Bluetooth states - Technical Details: ESP32 Only 0 for default of 1 minute - """ - sds_secs: builtins.int - """ - Super Deep Sleep Seconds - While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep - for this value (default 1 year) or a button press - 0 for default of one year - """ - ls_secs: builtins.int - """ - Description: In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on - Technical Details: ESP32 Only 0 for default of 300 - """ - min_wake_secs: builtins.int - """ - Description: While in light sleep when we receive packets on the LoRa radio we will wake and handle them and stay awake in no BLE mode for this value - Technical Details: ESP32 Only 0 for default of 10 seconds - """ - device_battery_ina_address: builtins.int - """ - I2C address of INA_2XX to use for reading device battery voltage - """ - powermon_enables: builtins.int - """ - If non-zero, we want powermon log outputs. With the particular (bitfield) sources enabled. - Note: we picked an ID of 32 so that lower more efficient IDs can be used for more frequently used options. - """ - def __init__( - self, - *, - is_power_saving: builtins.bool = ..., - on_battery_shutdown_after_secs: builtins.int = ..., - adc_multiplier_override: builtins.float = ..., - wait_bluetooth_secs: builtins.int = ..., - sds_secs: builtins.int = ..., - ls_secs: builtins.int = ..., - min_wake_secs: builtins.int = ..., - device_battery_ina_address: builtins.int = ..., - powermon_enables: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["adc_multiplier_override", b"adc_multiplier_override", "device_battery_ina_address", b"device_battery_ina_address", "is_power_saving", b"is_power_saving", "ls_secs", b"ls_secs", "min_wake_secs", b"min_wake_secs", "on_battery_shutdown_after_secs", b"on_battery_shutdown_after_secs", "powermon_enables", b"powermon_enables", "sds_secs", b"sds_secs", "wait_bluetooth_secs", b"wait_bluetooth_secs"]) -> None: ... + class GpsMode(_GpsMode, metaclass=_GpsModeEnumTypeWrapper): ... + DISABLED: PositionConfig.GpsMode.ValueType # 0 + """ + GPS is present but disabled + """ + ENABLED: PositionConfig.GpsMode.ValueType # 1 + """ + GPS is present and enabled + """ + NOT_PRESENT: PositionConfig.GpsMode.ValueType # 2 + """ + GPS is not present on the device + """ + + POSITION_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: _builtins.int + FIXED_POSITION_FIELD_NUMBER: _builtins.int + GPS_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + POSITION_FLAGS_FIELD_NUMBER: _builtins.int + RX_GPIO_FIELD_NUMBER: _builtins.int + TX_GPIO_FIELD_NUMBER: _builtins.int + BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: _builtins.int + BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + GPS_EN_GPIO_FIELD_NUMBER: _builtins.int + GPS_MODE_FIELD_NUMBER: _builtins.int + position_broadcast_secs: _builtins.int + """ + We should send our position this often (but only if it has changed significantly) + Defaults to 15 minutes + """ + position_broadcast_smart_enabled: _builtins.bool + """ + Adaptive position braoadcast, which is now the default. + """ + fixed_position: _builtins.bool + """ + If set, this node is at a fixed position. + We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node. + The lat/lon/alt can be set by an internal GPS or with the help of the app. + """ + gps_update_interval: _builtins.int + """ + How often should we try to get GPS position (in seconds) + or zero for the default of once every 30 seconds + or a very large value (maxint) to update only once at boot. + """ + position_flags: _builtins.int + """ + Which optional fields to include when assembling POSITION messages: + a bitwise OR of PositionFlags values. + """ + rx_gpio: _builtins.int + """ + (Re)define GPS_RX_PIN for your board. + """ + tx_gpio: _builtins.int + """ + (Re)define GPS_TX_PIN for your board. + """ + broadcast_smart_minimum_distance: _builtins.int + """ + The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled + """ + broadcast_smart_minimum_interval_secs: _builtins.int + """ + The minimum number of seconds (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled + """ + gps_en_gpio: _builtins.int + """ + (Re)define PIN_GPS_EN for your board. + """ + gps_mode: Global___PositionConfig.GpsMode.ValueType + """ + Set where GPS is enabled, disabled, or not present + """ + def __init__( + self, + *, + position_broadcast_secs: _builtins.int = ..., + position_broadcast_smart_enabled: _builtins.bool = ..., + fixed_position: _builtins.bool = ..., + gps_update_interval: _builtins.int = ..., + position_flags: _builtins.int = ..., + rx_gpio: _builtins.int = ..., + tx_gpio: _builtins.int = ..., + broadcast_smart_minimum_distance: _builtins.int = ..., + broadcast_smart_minimum_interval_secs: _builtins.int = ..., + gps_en_gpio: _builtins.int = ..., + gps_mode: Global___PositionConfig.GpsMode.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_en_gpio", b"gps_en_gpio", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___PositionConfig: _TypeAlias = PositionConfig # noqa: Y015 + +@_typing.final +class PowerConfig(_message.Message): + """ + Power Config\\ + See [Power Config](/docs/settings/config/power) for additional power config details. + """ + + DESCRIPTOR: _descriptor.Descriptor + + IS_POWER_SAVING_FIELD_NUMBER: _builtins.int + ON_BATTERY_SHUTDOWN_AFTER_SECS_FIELD_NUMBER: _builtins.int + ADC_MULTIPLIER_OVERRIDE_FIELD_NUMBER: _builtins.int + WAIT_BLUETOOTH_SECS_FIELD_NUMBER: _builtins.int + SDS_SECS_FIELD_NUMBER: _builtins.int + LS_SECS_FIELD_NUMBER: _builtins.int + MIN_WAKE_SECS_FIELD_NUMBER: _builtins.int + DEVICE_BATTERY_INA_ADDRESS_FIELD_NUMBER: _builtins.int + POWERMON_ENABLES_FIELD_NUMBER: _builtins.int + is_power_saving: _builtins.bool + """ + Description: Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. + Don't use this setting if you want to use your device with the phone apps or are using a device without a user button. + Technical Details: Works for ESP32 devices and NRF52 devices in the Sensor or Tracker roles + """ + on_battery_shutdown_after_secs: _builtins.int + """ + Description: If non-zero, the device will fully power off this many seconds after external power is removed. + """ + adc_multiplier_override: _builtins.int + """ + Ratio of voltage divider for battery pin eg. 3.20 (stored as 320, value x100) + Overrides the ADC_MULTIPLIER defined in variant for battery voltage calculation. + https://meshtastic.org/docs/configuration/radio/power/#adc-multiplier-override + Should be set to integer value between 200 and 600 (representing 2.00 to 6.00) + """ + wait_bluetooth_secs: _builtins.int + """ + Description: The number of seconds for to wait before turning off BLE in No Bluetooth states + Technical Details: ESP32 Only 0 for default of 1 minute + """ + sds_secs: _builtins.int + """ + Super Deep Sleep Seconds + While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep + for this value (default 1 year) or a button press + 0 for default of one year + """ + ls_secs: _builtins.int + """ + Description: In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on + Technical Details: ESP32 Only 0 for default of 300 + """ + min_wake_secs: _builtins.int + """ + Description: While in light sleep when we receive packets on the LoRa radio we will wake and handle them and stay awake in no BLE mode for this value + Technical Details: ESP32 Only 0 for default of 10 seconds + """ + device_battery_ina_address: _builtins.int + """ + I2C address of INA_2XX to use for reading device battery voltage + """ + powermon_enables: _builtins.int + """ + If non-zero, we want powermon log outputs, with the particular sources enabled: + a bitwise OR of PowerMon.State values (powermon.proto). + Note: we picked an ID of 32 so that lower more efficient IDs can be used for more frequently used options. + """ + def __init__( + self, + *, + is_power_saving: _builtins.bool = ..., + on_battery_shutdown_after_secs: _builtins.int = ..., + adc_multiplier_override: _builtins.int = ..., + wait_bluetooth_secs: _builtins.int = ..., + sds_secs: _builtins.int = ..., + ls_secs: _builtins.int = ..., + min_wake_secs: _builtins.int = ..., + device_battery_ina_address: _builtins.int = ..., + powermon_enables: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["adc_multiplier_override", b"adc_multiplier_override", "device_battery_ina_address", b"device_battery_ina_address", "is_power_saving", b"is_power_saving", "ls_secs", b"ls_secs", "min_wake_secs", b"min_wake_secs", "on_battery_shutdown_after_secs", b"on_battery_shutdown_after_secs", "powermon_enables", b"powermon_enables", "sds_secs", b"sds_secs", "wait_bluetooth_secs", b"wait_bluetooth_secs"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class NetworkConfig(google.protobuf.message.Message): - """ - Network Config - """ +Global___PowerConfig: _TypeAlias = PowerConfig # noqa: Y015 - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class NetworkConfig(_message.Message): + """ + Network Config + """ - class _AddressMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + DESCRIPTOR: _descriptor.Descriptor - class _AddressModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.NetworkConfig._AddressMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DHCP: Config.NetworkConfig._AddressMode.ValueType # 0 - """ - obtain ip address via DHCP - """ - STATIC: Config.NetworkConfig._AddressMode.ValueType # 1 - """ - use static ip address - """ + class _AddressMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class AddressMode(_AddressMode, metaclass=_AddressModeEnumTypeWrapper): ... - DHCP: Config.NetworkConfig.AddressMode.ValueType # 0 + class _AddressModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[NetworkConfig._AddressMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DHCP: NetworkConfig._AddressMode.ValueType # 0 """ obtain ip address via DHCP """ - STATIC: Config.NetworkConfig.AddressMode.ValueType # 1 + STATIC: NetworkConfig._AddressMode.ValueType # 1 """ use static ip address """ - class _ProtocolFlags: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _ProtocolFlagsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.NetworkConfig._ProtocolFlags.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - NO_BROADCAST: Config.NetworkConfig._ProtocolFlags.ValueType # 0 - """ - Do not broadcast packets over any network protocol - """ - UDP_BROADCAST: Config.NetworkConfig._ProtocolFlags.ValueType # 1 - """ - Enable broadcasting packets via UDP over the local network - """ - - class ProtocolFlags(_ProtocolFlags, metaclass=_ProtocolFlagsEnumTypeWrapper): - """ - Available flags auxiliary network protocols - """ - - NO_BROADCAST: Config.NetworkConfig.ProtocolFlags.ValueType # 0 + class AddressMode(_AddressMode, metaclass=_AddressModeEnumTypeWrapper): ... + DHCP: NetworkConfig.AddressMode.ValueType # 0 + """ + obtain ip address via DHCP + """ + STATIC: NetworkConfig.AddressMode.ValueType # 1 + """ + use static ip address + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[NetworkConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + NETWORK_NONE: NetworkConfig._Flags.ValueType # 0 + """Nothing enabled""" + NETWORK_WIFI: NetworkConfig._Flags.ValueType # 1 + """Enable WiFi, which disables Bluetooth""" + NETWORK_ETH: NetworkConfig._Flags.ValueType # 2 + """Enable Ethernet""" + NETWORK_IPV6: NetworkConfig._Flags.ValueType # 4 + """Enable IPv6 support""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Network interface toggles: a bitwise OR of Flags values. + Distinct from enabled_protocols, which selects mesh transport protocols. + """ + + NETWORK_NONE: NetworkConfig.Flags.ValueType # 0 + """Nothing enabled""" + NETWORK_WIFI: NetworkConfig.Flags.ValueType # 1 + """Enable WiFi, which disables Bluetooth""" + NETWORK_ETH: NetworkConfig.Flags.ValueType # 2 + """Enable Ethernet""" + NETWORK_IPV6: NetworkConfig.Flags.ValueType # 4 + """Enable IPv6 support""" + + class _ProtocolFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _ProtocolFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[NetworkConfig._ProtocolFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + NO_BROADCAST: NetworkConfig._ProtocolFlags.ValueType # 0 """ Do not broadcast packets over any network protocol """ - UDP_BROADCAST: Config.NetworkConfig.ProtocolFlags.ValueType # 1 + UDP_BROADCAST: NetworkConfig._ProtocolFlags.ValueType # 1 """ Enable broadcasting packets via UDP over the local network """ - @typing.final - class IpV4Config(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - IP_FIELD_NUMBER: builtins.int - GATEWAY_FIELD_NUMBER: builtins.int - SUBNET_FIELD_NUMBER: builtins.int - DNS_FIELD_NUMBER: builtins.int - ip: builtins.int - """ - Static IP address - """ - gateway: builtins.int - """ - Static gateway address - """ - subnet: builtins.int - """ - Static subnet mask - """ - dns: builtins.int - """ - Static DNS server address - """ - def __init__( - self, - *, - ip: builtins.int = ..., - gateway: builtins.int = ..., - subnet: builtins.int = ..., - dns: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["dns", b"dns", "gateway", b"gateway", "ip", b"ip", "subnet", b"subnet"]) -> None: ... - - WIFI_ENABLED_FIELD_NUMBER: builtins.int - WIFI_SSID_FIELD_NUMBER: builtins.int - WIFI_PSK_FIELD_NUMBER: builtins.int - NTP_SERVER_FIELD_NUMBER: builtins.int - ETH_ENABLED_FIELD_NUMBER: builtins.int - ADDRESS_MODE_FIELD_NUMBER: builtins.int - IPV4_CONFIG_FIELD_NUMBER: builtins.int - RSYSLOG_SERVER_FIELD_NUMBER: builtins.int - ENABLED_PROTOCOLS_FIELD_NUMBER: builtins.int - IPV6_ENABLED_FIELD_NUMBER: builtins.int - wifi_enabled: builtins.bool - """ - Enable WiFi (disables Bluetooth) + class ProtocolFlags(_ProtocolFlags, metaclass=_ProtocolFlagsEnumTypeWrapper): """ - wifi_ssid: builtins.str + Auxiliary network protocols, as flags for enabled_protocols """ - If set, this node will try to join the specified wifi network and - acquire an address via DHCP - """ - wifi_psk: builtins.str - """ - If set, will be use to authenticate to the named wifi - """ - ntp_server: builtins.str - """ - NTP server to use if WiFi is conneced, defaults to `meshtastic.pool.ntp.org` - """ - eth_enabled: builtins.bool - """ - Enable Ethernet - """ - address_mode: global___Config.NetworkConfig.AddressMode.ValueType + + NO_BROADCAST: NetworkConfig.ProtocolFlags.ValueType # 0 + """ + Do not broadcast packets over any network protocol + """ + UDP_BROADCAST: NetworkConfig.ProtocolFlags.ValueType # 1 + """ + Enable broadcasting packets via UDP over the local network + """ + + @_typing.final + class IpV4Config(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + IP_FIELD_NUMBER: _builtins.int + GATEWAY_FIELD_NUMBER: _builtins.int + SUBNET_FIELD_NUMBER: _builtins.int + DNS_FIELD_NUMBER: _builtins.int + ip: _builtins.int """ - acquire an address via DHCP or assign static + Static IP address """ - rsyslog_server: builtins.str + gateway: _builtins.int """ - rsyslog Server and Port + Static gateway address """ - enabled_protocols: builtins.int + subnet: _builtins.int """ - Flags for enabling/disabling network protocols + Static subnet mask """ - ipv6_enabled: builtins.bool + dns: _builtins.int """ - Enable/Disable ipv6 support + Static DNS server address """ - @property - def ipv4_config(self) -> global___Config.NetworkConfig.IpV4Config: - """ - struct to keep static address - """ - def __init__( self, *, - wifi_enabled: builtins.bool = ..., - wifi_ssid: builtins.str = ..., - wifi_psk: builtins.str = ..., - ntp_server: builtins.str = ..., - eth_enabled: builtins.bool = ..., - address_mode: global___Config.NetworkConfig.AddressMode.ValueType = ..., - ipv4_config: global___Config.NetworkConfig.IpV4Config | None = ..., - rsyslog_server: builtins.str = ..., - enabled_protocols: builtins.int = ..., - ipv6_enabled: builtins.bool = ..., + ip: _builtins.int = ..., + gateway: _builtins.int = ..., + subnet: _builtins.int = ..., + dns: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["ipv4_config", b"ipv4_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["address_mode", b"address_mode", "enabled_protocols", b"enabled_protocols", "eth_enabled", b"eth_enabled", "ipv4_config", b"ipv4_config", "ipv6_enabled", b"ipv6_enabled", "ntp_server", b"ntp_server", "rsyslog_server", b"rsyslog_server", "wifi_enabled", b"wifi_enabled", "wifi_psk", b"wifi_psk", "wifi_ssid", b"wifi_ssid"]) -> None: ... - - @typing.final - class DisplayConfig(google.protobuf.message.Message): - """ - Display Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _DeprecatedGpsCoordinateFormat: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _DeprecatedGpsCoordinateFormatEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._DeprecatedGpsCoordinateFormat.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNUSED: Config.DisplayConfig._DeprecatedGpsCoordinateFormat.ValueType # 0 - - class DeprecatedGpsCoordinateFormat(_DeprecatedGpsCoordinateFormat, metaclass=_DeprecatedGpsCoordinateFormatEnumTypeWrapper): - """ - 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 - - class _DisplayUnits: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _DisplayUnitsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._DisplayUnits.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - METRIC: Config.DisplayConfig._DisplayUnits.ValueType # 0 - """ - Metric (Default) - """ - IMPERIAL: Config.DisplayConfig._DisplayUnits.ValueType # 1 - """ - Imperial - """ - - class DisplayUnits(_DisplayUnits, metaclass=_DisplayUnitsEnumTypeWrapper): - """ - Unit display preference - """ - - METRIC: Config.DisplayConfig.DisplayUnits.ValueType # 0 - """ - Metric (Default) - """ - IMPERIAL: Config.DisplayConfig.DisplayUnits.ValueType # 1 - """ - Imperial - """ - - class _OledType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _OledTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._OledType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - OLED_AUTO: Config.DisplayConfig._OledType.ValueType # 0 - """ - Default / Autodetect - """ - OLED_SSD1306: Config.DisplayConfig._OledType.ValueType # 1 - """ - Default / Autodetect - """ - OLED_SH1106: Config.DisplayConfig._OledType.ValueType # 2 - """ - Default / Autodetect - """ - OLED_SH1107: Config.DisplayConfig._OledType.ValueType # 3 - """ - Can not be auto detected but set by proto. Used for 128x64 screens - """ - OLED_SH1107_128_128: Config.DisplayConfig._OledType.ValueType # 4 - """ - Can not be auto detected but set by proto. Used for 128x128 screens - """ - OLED_SH1107_ROTATED: Config.DisplayConfig._OledType.ValueType # 5 - """ - Can not be auto detected but set by proto. Used for 64x128 rotated screens - """ - - class OledType(_OledType, metaclass=_OledTypeEnumTypeWrapper): - """ - Override OLED outo detect with this if it fails. - """ - - OLED_AUTO: Config.DisplayConfig.OledType.ValueType # 0 + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["dns", b"dns", "gateway", b"gateway", "ip", b"ip", "subnet", b"subnet"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + + FLAGS_FIELD_NUMBER: _builtins.int + WIFI_SSID_FIELD_NUMBER: _builtins.int + WIFI_PSK_FIELD_NUMBER: _builtins.int + NTP_SERVER_FIELD_NUMBER: _builtins.int + ADDRESS_MODE_FIELD_NUMBER: _builtins.int + IPV4_CONFIG_FIELD_NUMBER: _builtins.int + RSYSLOG_SERVER_FIELD_NUMBER: _builtins.int + ENABLED_PROTOCOLS_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + wifi_ssid: _builtins.str + """ + If set, this node will try to join the specified wifi network, taking its + address as address_mode says + """ + wifi_psk: _builtins.str + """ + If set, used to authenticate to the named wifi + """ + ntp_server: _builtins.str + """ + NTP server to use if WiFi is connected, defaults to `meshtastic.pool.ntp.org` + """ + address_mode: Global___NetworkConfig.AddressMode.ValueType + """ + acquire an address via DHCP or assign static + """ + rsyslog_server: _builtins.str + """ + rsyslog Server and Port + """ + enabled_protocols: _builtins.int + """ + Auxiliary network protocols enabled: a bitwise OR of ProtocolFlags values. + """ + @_builtins.property + def ipv4_config(self) -> Global___NetworkConfig.IpV4Config: + """ + struct to keep static address + """ + + def __init__( + self, + *, + flags: _builtins.int = ..., + wifi_ssid: _builtins.str = ..., + wifi_psk: _builtins.str = ..., + ntp_server: _builtins.str = ..., + address_mode: Global___NetworkConfig.AddressMode.ValueType = ..., + ipv4_config: Global___NetworkConfig.IpV4Config | None = ..., + rsyslog_server: _builtins.str = ..., + enabled_protocols: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["ipv4_config", b"ipv4_config"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["address_mode", b"address_mode", "enabled_protocols", b"enabled_protocols", "flags", b"flags", "ipv4_config", b"ipv4_config", "ntp_server", b"ntp_server", "rsyslog_server", b"rsyslog_server", "wifi_psk", b"wifi_psk", "wifi_ssid", b"wifi_ssid"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NetworkConfig: _TypeAlias = NetworkConfig # noqa: Y015 + +@_typing.final +class DisplayConfig(_message.Message): + """ + Display Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _OledType: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _OledTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DisplayConfig._OledType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + OLED_AUTO: DisplayConfig._OledType.ValueType # 0 """ Default / Autodetect """ - OLED_SSD1306: Config.DisplayConfig.OledType.ValueType # 1 + OLED_SSD1306: DisplayConfig._OledType.ValueType # 1 """ Default / Autodetect """ - OLED_SH1106: Config.DisplayConfig.OledType.ValueType # 2 + OLED_SH1106: DisplayConfig._OledType.ValueType # 2 """ Default / Autodetect """ - OLED_SH1107: Config.DisplayConfig.OledType.ValueType # 3 + OLED_SH1107: DisplayConfig._OledType.ValueType # 3 """ Can not be auto detected but set by proto. Used for 128x64 screens """ - OLED_SH1107_128_128: Config.DisplayConfig.OledType.ValueType # 4 + OLED_SH1107_128_128: DisplayConfig._OledType.ValueType # 4 """ Can not be auto detected but set by proto. Used for 128x128 screens """ - OLED_SH1107_ROTATED: Config.DisplayConfig.OledType.ValueType # 5 + OLED_SH1107_ROTATED: DisplayConfig._OledType.ValueType # 5 """ Can not be auto detected but set by proto. Used for 64x128 rotated screens """ - class _DisplayMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _DisplayModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._DisplayMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DEFAULT: Config.DisplayConfig._DisplayMode.ValueType # 0 - """ - Default. The old style for the 128x64 OLED screen - """ - TWOCOLOR: Config.DisplayConfig._DisplayMode.ValueType # 1 - """ - Rearrange display elements to cater for bicolor OLED displays - """ - INVERTED: Config.DisplayConfig._DisplayMode.ValueType # 2 - """ - Same as TwoColor, but with inverted top bar. Not so good for Epaper displays - """ - COLOR: Config.DisplayConfig._DisplayMode.ValueType # 3 - """ - TFT Full Color Displays (not implemented yet) - """ - - class DisplayMode(_DisplayMode, metaclass=_DisplayModeEnumTypeWrapper): ... - DEFAULT: Config.DisplayConfig.DisplayMode.ValueType # 0 + class OledType(_OledType, metaclass=_OledTypeEnumTypeWrapper): + """ + Override OLED outo detect with this if it fails. + """ + + OLED_AUTO: DisplayConfig.OledType.ValueType # 0 + """ + Default / Autodetect + """ + OLED_SSD1306: DisplayConfig.OledType.ValueType # 1 + """ + Default / Autodetect + """ + OLED_SH1106: DisplayConfig.OledType.ValueType # 2 + """ + Default / Autodetect + """ + OLED_SH1107: DisplayConfig.OledType.ValueType # 3 + """ + Can not be auto detected but set by proto. Used for 128x64 screens + """ + OLED_SH1107_128_128: DisplayConfig.OledType.ValueType # 4 + """ + Can not be auto detected but set by proto. Used for 128x128 screens + """ + OLED_SH1107_ROTATED: DisplayConfig.OledType.ValueType # 5 + """ + Can not be auto detected but set by proto. Used for 64x128 rotated screens + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DisplayConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DISPLAY_NONE: DisplayConfig._Flags.ValueType # 0 + """Nothing enabled""" + DISPLAY_FLIP_SCREEN: DisplayConfig._Flags.ValueType # 1 + """Flip the screen vertically, for mountings that invert it""" + DISPLAY_HEADING_BOLD: DisplayConfig._Flags.ValueType # 2 + """Print the first line in pseudo-bold rather than the original style""" + DISPLAY_WAKE_ON_TAP_OR_MOTION: DisplayConfig._Flags.ValueType # 4 + """Wake the screen on accelerometer-detected motion or tap""" + DISPLAY_USE_12H_CLOCK: DisplayConfig._Flags.ValueType # 8 + """Show the time in 12-hour format rather than 24-hour""" + DISPLAY_USE_LONG_NODE_NAME: DisplayConfig._Flags.ValueType # 16 + """Show node names in long format rather than short""" + DISPLAY_ENABLE_MESSAGE_BUBBLES: DisplayConfig._Flags.ValueType # 32 + """Draw message bubbles on screen""" + DISPLAY_IMPERIAL_UNITS: DisplayConfig._Flags.ValueType # 64 + """ + Show lengths, speeds and temperatures on this node's own screen in imperial + units. Display only: over the air and to clients every value is SI, and an app + applies its own unit setting. + """ + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Display toggles: a bitwise OR of Flags values. + """ + + DISPLAY_NONE: DisplayConfig.Flags.ValueType # 0 + """Nothing enabled""" + DISPLAY_FLIP_SCREEN: DisplayConfig.Flags.ValueType # 1 + """Flip the screen vertically, for mountings that invert it""" + DISPLAY_HEADING_BOLD: DisplayConfig.Flags.ValueType # 2 + """Print the first line in pseudo-bold rather than the original style""" + DISPLAY_WAKE_ON_TAP_OR_MOTION: DisplayConfig.Flags.ValueType # 4 + """Wake the screen on accelerometer-detected motion or tap""" + DISPLAY_USE_12H_CLOCK: DisplayConfig.Flags.ValueType # 8 + """Show the time in 12-hour format rather than 24-hour""" + DISPLAY_USE_LONG_NODE_NAME: DisplayConfig.Flags.ValueType # 16 + """Show node names in long format rather than short""" + DISPLAY_ENABLE_MESSAGE_BUBBLES: DisplayConfig.Flags.ValueType # 32 + """Draw message bubbles on screen""" + DISPLAY_IMPERIAL_UNITS: DisplayConfig.Flags.ValueType # 64 + """ + Show lengths, speeds and temperatures on this node's own screen in imperial + units. Display only: over the air and to clients every value is SI, and an app + applies its own unit setting. + """ + + class _DisplayMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _DisplayModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DisplayConfig._DisplayMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DEFAULT: DisplayConfig._DisplayMode.ValueType # 0 """ Default. The old style for the 128x64 OLED screen """ - TWOCOLOR: Config.DisplayConfig.DisplayMode.ValueType # 1 + TWOCOLOR: DisplayConfig._DisplayMode.ValueType # 1 """ Rearrange display elements to cater for bicolor OLED displays """ - INVERTED: Config.DisplayConfig.DisplayMode.ValueType # 2 + INVERTED: DisplayConfig._DisplayMode.ValueType # 2 """ Same as TwoColor, but with inverted top bar. Not so good for Epaper displays """ - COLOR: Config.DisplayConfig.DisplayMode.ValueType # 3 + COLOR: DisplayConfig._DisplayMode.ValueType # 3 """ TFT Full Color Displays (not implemented yet) """ - class _CompassOrientation: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _CompassOrientationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._CompassOrientation.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DEGREES_0: Config.DisplayConfig._CompassOrientation.ValueType # 0 - """ - The compass and the display are in the same orientation. - """ - DEGREES_90: Config.DisplayConfig._CompassOrientation.ValueType # 1 - """ - Rotate the compass by 90 degrees. - """ - DEGREES_180: Config.DisplayConfig._CompassOrientation.ValueType # 2 - """ - Rotate the compass by 180 degrees. - """ - DEGREES_270: Config.DisplayConfig._CompassOrientation.ValueType # 3 - """ - Rotate the compass by 270 degrees. - """ - DEGREES_0_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 4 - """ - Don't rotate the compass, but invert the result. - """ - DEGREES_90_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 5 - """ - Rotate the compass by 90 degrees and invert. - """ - DEGREES_180_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 6 - """ - Rotate the compass by 180 degrees and invert. - """ - DEGREES_270_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 7 - """ - Rotate the compass by 270 degrees and invert. - """ - - class CompassOrientation(_CompassOrientation, metaclass=_CompassOrientationEnumTypeWrapper): ... - DEGREES_0: Config.DisplayConfig.CompassOrientation.ValueType # 0 + class DisplayMode(_DisplayMode, metaclass=_DisplayModeEnumTypeWrapper): ... + DEFAULT: DisplayConfig.DisplayMode.ValueType # 0 + """ + Default. The old style for the 128x64 OLED screen + """ + TWOCOLOR: DisplayConfig.DisplayMode.ValueType # 1 + """ + Rearrange display elements to cater for bicolor OLED displays + """ + INVERTED: DisplayConfig.DisplayMode.ValueType # 2 + """ + Same as TwoColor, but with inverted top bar. Not so good for Epaper displays + """ + COLOR: DisplayConfig.DisplayMode.ValueType # 3 + """ + TFT Full Color Displays (not implemented yet) + """ + + class _CompassOrientation: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _CompassOrientationEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DisplayConfig._CompassOrientation.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DEGREES_0: DisplayConfig._CompassOrientation.ValueType # 0 """ The compass and the display are in the same orientation. """ - DEGREES_90: Config.DisplayConfig.CompassOrientation.ValueType # 1 + DEGREES_90: DisplayConfig._CompassOrientation.ValueType # 1 """ Rotate the compass by 90 degrees. """ - DEGREES_180: Config.DisplayConfig.CompassOrientation.ValueType # 2 + DEGREES_180: DisplayConfig._CompassOrientation.ValueType # 2 """ Rotate the compass by 180 degrees. """ - DEGREES_270: Config.DisplayConfig.CompassOrientation.ValueType # 3 + DEGREES_270: DisplayConfig._CompassOrientation.ValueType # 3 """ Rotate the compass by 270 degrees. """ - DEGREES_0_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 4 + DEGREES_0_INVERTED: DisplayConfig._CompassOrientation.ValueType # 4 """ Don't rotate the compass, but invert the result. """ - DEGREES_90_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 5 + DEGREES_90_INVERTED: DisplayConfig._CompassOrientation.ValueType # 5 """ Rotate the compass by 90 degrees and invert. """ - DEGREES_180_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 6 + DEGREES_180_INVERTED: DisplayConfig._CompassOrientation.ValueType # 6 """ Rotate the compass by 180 degrees and invert. """ - DEGREES_270_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 7 + DEGREES_270_INVERTED: DisplayConfig._CompassOrientation.ValueType # 7 """ Rotate the compass by 270 degrees and invert. """ - SCREEN_ON_SECS_FIELD_NUMBER: builtins.int - GPS_FORMAT_FIELD_NUMBER: builtins.int - AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: builtins.int - COMPASS_NORTH_TOP_FIELD_NUMBER: builtins.int - FLIP_SCREEN_FIELD_NUMBER: builtins.int - UNITS_FIELD_NUMBER: builtins.int - OLED_FIELD_NUMBER: builtins.int - DISPLAYMODE_FIELD_NUMBER: builtins.int - HEADING_BOLD_FIELD_NUMBER: builtins.int - WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: builtins.int - COMPASS_ORIENTATION_FIELD_NUMBER: builtins.int - USE_12H_CLOCK_FIELD_NUMBER: builtins.int - USE_LONG_NODE_NAME_FIELD_NUMBER: builtins.int - ENABLE_MESSAGE_BUBBLES_FIELD_NUMBER: builtins.int - screen_on_secs: builtins.int - """ - Number of seconds the screen stays on after pressing the user button or receiving a message - 0 for default of one minute MAXUINT for always on - """ - gps_format: global___Config.DisplayConfig.DeprecatedGpsCoordinateFormat.ValueType - """ - How the GPS coordinates are formatted on the OLED screen. - """ - auto_screen_carousel_secs: builtins.int - """ - Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds. - Potentially useful for devices without user buttons. - """ - compass_north_top: builtins.bool - """ - If this is set, the displayed compass will always point north. if unset, the old behaviour - (top of display is heading direction) is used. - """ - flip_screen: builtins.bool - """ - Flip screen vertically, for cases that mount the screen upside down - """ - units: global___Config.DisplayConfig.DisplayUnits.ValueType - """ - Perferred display units - """ - oled: global___Config.DisplayConfig.OledType.ValueType - """ - Override auto-detect in screen - """ - displaymode: global___Config.DisplayConfig.DisplayMode.ValueType - """ - Display Mode - """ - heading_bold: builtins.bool - """ - Print first line in pseudo-bold? FALSE is original style, TRUE is bold - """ - wake_on_tap_or_motion: builtins.bool - """ - Should we wake the screen up on accelerometer detected motion or tap - """ - compass_orientation: global___Config.DisplayConfig.CompassOrientation.ValueType - """ - Indicates how to rotate or invert the compass output to accurate display on the display. - """ - use_12h_clock: builtins.bool - """ - If false (default), the device will display the time in 24-hour format on screen. - If true, the device will display the time in 12-hour format on screen. - """ - use_long_node_name: builtins.bool - """ - If false (default), the device will use short names for various display screens. - If true, node names will show in long format - """ - enable_message_bubbles: builtins.bool - """ - If true, the device will display message bubbles on screen. - """ - def __init__( - self, - *, - screen_on_secs: builtins.int = ..., - gps_format: global___Config.DisplayConfig.DeprecatedGpsCoordinateFormat.ValueType = ..., - auto_screen_carousel_secs: builtins.int = ..., - compass_north_top: builtins.bool = ..., - flip_screen: builtins.bool = ..., - units: global___Config.DisplayConfig.DisplayUnits.ValueType = ..., - oled: global___Config.DisplayConfig.OledType.ValueType = ..., - displaymode: global___Config.DisplayConfig.DisplayMode.ValueType = ..., - heading_bold: builtins.bool = ..., - wake_on_tap_or_motion: builtins.bool = ..., - compass_orientation: global___Config.DisplayConfig.CompassOrientation.ValueType = ..., - use_12h_clock: builtins.bool = ..., - use_long_node_name: builtins.bool = ..., - enable_message_bubbles: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["auto_screen_carousel_secs", b"auto_screen_carousel_secs", "compass_north_top", b"compass_north_top", "compass_orientation", b"compass_orientation", "displaymode", b"displaymode", "enable_message_bubbles", b"enable_message_bubbles", "flip_screen", b"flip_screen", "gps_format", b"gps_format", "heading_bold", b"heading_bold", "oled", b"oled", "screen_on_secs", b"screen_on_secs", "units", b"units", "use_12h_clock", b"use_12h_clock", "use_long_node_name", b"use_long_node_name", "wake_on_tap_or_motion", b"wake_on_tap_or_motion"]) -> None: ... - - @typing.final - class LoRaConfig(google.protobuf.message.Message): - """ - Lora Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _RegionCode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _RegionCodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.LoRaConfig._RegionCode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: Config.LoRaConfig._RegionCode.ValueType # 0 - """ - Region is not set - """ - US: Config.LoRaConfig._RegionCode.ValueType # 1 - """ - United States - """ - EU_433: Config.LoRaConfig._RegionCode.ValueType # 2 - """ - European Union 433mhz - """ - EU_868: Config.LoRaConfig._RegionCode.ValueType # 3 - """ - European Union 868mhz - """ - CN: Config.LoRaConfig._RegionCode.ValueType # 4 - """ - China - """ - JP: Config.LoRaConfig._RegionCode.ValueType # 5 - """ - Japan - """ - ANZ: Config.LoRaConfig._RegionCode.ValueType # 6 - """ - Australia / New Zealand - """ - KR: Config.LoRaConfig._RegionCode.ValueType # 7 - """ - Korea - """ - TW: Config.LoRaConfig._RegionCode.ValueType # 8 - """ - Taiwan - """ - RU: Config.LoRaConfig._RegionCode.ValueType # 9 - """ - Russia - """ - IN: Config.LoRaConfig._RegionCode.ValueType # 10 - """ - India - """ - NZ_865: Config.LoRaConfig._RegionCode.ValueType # 11 - """ - New Zealand 865mhz - """ - TH: Config.LoRaConfig._RegionCode.ValueType # 12 - """ - Thailand - """ - LORA_24: Config.LoRaConfig._RegionCode.ValueType # 13 - """ - WLAN Band - """ - UA_433: Config.LoRaConfig._RegionCode.ValueType # 14 - """ - Ukraine 433mhz - """ - UA_868: Config.LoRaConfig._RegionCode.ValueType # 15 - """ - Ukraine 868mhz - """ - MY_433: Config.LoRaConfig._RegionCode.ValueType # 16 - """ - Malaysia 433mhz - """ - MY_919: Config.LoRaConfig._RegionCode.ValueType # 17 - """ - Malaysia 919mhz - """ - SG_923: Config.LoRaConfig._RegionCode.ValueType # 18 - """ - Singapore 923mhz - """ - PH_433: Config.LoRaConfig._RegionCode.ValueType # 19 - """ - Philippines 433mhz - """ - PH_868: Config.LoRaConfig._RegionCode.ValueType # 20 - """ - Philippines 868mhz - """ - PH_915: Config.LoRaConfig._RegionCode.ValueType # 21 - """ - Philippines 915mhz - """ - ANZ_433: Config.LoRaConfig._RegionCode.ValueType # 22 - """ - Australia / New Zealand 433MHz - """ - KZ_433: Config.LoRaConfig._RegionCode.ValueType # 23 - """ - Kazakhstan 433MHz - """ - KZ_863: Config.LoRaConfig._RegionCode.ValueType # 24 - """ - Kazakhstan 863MHz - """ - NP_865: Config.LoRaConfig._RegionCode.ValueType # 25 - """ - Nepal 865MHz - """ - BR_902: Config.LoRaConfig._RegionCode.ValueType # 26 - """ - Brazil 902MHz - """ - ITU1_2M: Config.LoRaConfig._RegionCode.ValueType # 27 - """ - ITU Region 1 Amateur Radio 2m band (144-146 MHz) - """ - ITU2_2M: Config.LoRaConfig._RegionCode.ValueType # 28 - """ - ITU Region 2 Amateur Radio 2m band (144-148 MHz) - """ - EU_866: Config.LoRaConfig._RegionCode.ValueType # 29 - """ - EU 866MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD) - """ - EU_874: Config.LoRaConfig._RegionCode.ValueType # 30 - """ - EU 874MHz and 917MHz bands (Band no. 1 and 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD) - """ - EU_917: Config.LoRaConfig._RegionCode.ValueType # 31 - EU_N_868: Config.LoRaConfig._RegionCode.ValueType # 32 - """ - EU 868MHz band, with narrow presets - """ - ITU3_2M: Config.LoRaConfig._RegionCode.ValueType # 33 - """ - 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 CompassOrientation(_CompassOrientation, metaclass=_CompassOrientationEnumTypeWrapper): ... + DEGREES_0: DisplayConfig.CompassOrientation.ValueType # 0 + """ + The compass and the display are in the same orientation. + """ + DEGREES_90: DisplayConfig.CompassOrientation.ValueType # 1 + """ + Rotate the compass by 90 degrees. + """ + DEGREES_180: DisplayConfig.CompassOrientation.ValueType # 2 + """ + Rotate the compass by 180 degrees. + """ + DEGREES_270: DisplayConfig.CompassOrientation.ValueType # 3 + """ + Rotate the compass by 270 degrees. + """ + DEGREES_0_INVERTED: DisplayConfig.CompassOrientation.ValueType # 4 + """ + Don't rotate the compass, but invert the result. + """ + DEGREES_90_INVERTED: DisplayConfig.CompassOrientation.ValueType # 5 + """ + Rotate the compass by 90 degrees and invert. + """ + DEGREES_180_INVERTED: DisplayConfig.CompassOrientation.ValueType # 6 + """ + Rotate the compass by 180 degrees and invert. + """ + DEGREES_270_INVERTED: DisplayConfig.CompassOrientation.ValueType # 7 + """ + Rotate the compass by 270 degrees and invert. + """ + + SCREEN_ON_SECS_FIELD_NUMBER: _builtins.int + AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + OLED_FIELD_NUMBER: _builtins.int + DISPLAYMODE_FIELD_NUMBER: _builtins.int + COMPASS_ORIENTATION_FIELD_NUMBER: _builtins.int + screen_on_secs: _builtins.int + """ + Number of seconds the screen stays on after pressing the user button or receiving a message + 0 for default of one minute MAXUINT for always on + """ + auto_screen_carousel_secs: _builtins.int + """ + Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds. + Potentially useful for devices without user buttons. + """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + oled: Global___DisplayConfig.OledType.ValueType + """ + Override auto-detect in screen + """ + displaymode: Global___DisplayConfig.DisplayMode.ValueType + """ + Display Mode + """ + compass_orientation: Global___DisplayConfig.CompassOrientation.ValueType + """ + Indicates how to rotate or invert the compass output to accurate display on the display. + """ + def __init__( + self, + *, + screen_on_secs: _builtins.int = ..., + auto_screen_carousel_secs: _builtins.int = ..., + flags: _builtins.int = ..., + oled: Global___DisplayConfig.OledType.ValueType = ..., + displaymode: Global___DisplayConfig.DisplayMode.ValueType = ..., + compass_orientation: Global___DisplayConfig.CompassOrientation.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["auto_screen_carousel_secs", b"auto_screen_carousel_secs", "compass_orientation", b"compass_orientation", "displaymode", b"displaymode", "flags", b"flags", "oled", b"oled", "screen_on_secs", b"screen_on_secs"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ... - UNSET: Config.LoRaConfig.RegionCode.ValueType # 0 - """ - Region is not set - """ - US: Config.LoRaConfig.RegionCode.ValueType # 1 - """ - United States - """ - EU_433: Config.LoRaConfig.RegionCode.ValueType # 2 - """ - European Union 433mhz - """ - EU_868: Config.LoRaConfig.RegionCode.ValueType # 3 - """ - European Union 868mhz - """ - CN: Config.LoRaConfig.RegionCode.ValueType # 4 - """ - China - """ - JP: Config.LoRaConfig.RegionCode.ValueType # 5 - """ - Japan - """ - ANZ: Config.LoRaConfig.RegionCode.ValueType # 6 - """ - Australia / New Zealand - """ - KR: Config.LoRaConfig.RegionCode.ValueType # 7 - """ - Korea - """ - TW: Config.LoRaConfig.RegionCode.ValueType # 8 - """ - Taiwan - """ - RU: Config.LoRaConfig.RegionCode.ValueType # 9 - """ - Russia - """ - IN: Config.LoRaConfig.RegionCode.ValueType # 10 - """ - India - """ - NZ_865: Config.LoRaConfig.RegionCode.ValueType # 11 - """ - New Zealand 865mhz - """ - TH: Config.LoRaConfig.RegionCode.ValueType # 12 - """ - Thailand - """ - LORA_24: Config.LoRaConfig.RegionCode.ValueType # 13 - """ - WLAN Band - """ - UA_433: Config.LoRaConfig.RegionCode.ValueType # 14 - """ - Ukraine 433mhz - """ - UA_868: Config.LoRaConfig.RegionCode.ValueType # 15 - """ - Ukraine 868mhz - """ - MY_433: Config.LoRaConfig.RegionCode.ValueType # 16 - """ - Malaysia 433mhz - """ - MY_919: Config.LoRaConfig.RegionCode.ValueType # 17 - """ - Malaysia 919mhz - """ - SG_923: Config.LoRaConfig.RegionCode.ValueType # 18 - """ - Singapore 923mhz - """ - PH_433: Config.LoRaConfig.RegionCode.ValueType # 19 - """ - Philippines 433mhz - """ - PH_868: Config.LoRaConfig.RegionCode.ValueType # 20 - """ - Philippines 868mhz - """ - PH_915: Config.LoRaConfig.RegionCode.ValueType # 21 - """ - Philippines 915mhz - """ - ANZ_433: Config.LoRaConfig.RegionCode.ValueType # 22 - """ - Australia / New Zealand 433MHz - """ - KZ_433: Config.LoRaConfig.RegionCode.ValueType # 23 - """ - Kazakhstan 433MHz - """ - KZ_863: Config.LoRaConfig.RegionCode.ValueType # 24 - """ - Kazakhstan 863MHz - """ - NP_865: Config.LoRaConfig.RegionCode.ValueType # 25 - """ - Nepal 865MHz - """ - BR_902: Config.LoRaConfig.RegionCode.ValueType # 26 - """ - Brazil 902MHz - """ - ITU1_2M: Config.LoRaConfig.RegionCode.ValueType # 27 - """ - ITU Region 1 Amateur Radio 2m band (144-146 MHz) - """ - ITU2_2M: Config.LoRaConfig.RegionCode.ValueType # 28 - """ - ITU Region 2 Amateur Radio 2m band (144-148 MHz) - """ - EU_866: Config.LoRaConfig.RegionCode.ValueType # 29 - """ - EU 866MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD) - """ - EU_874: Config.LoRaConfig.RegionCode.ValueType # 30 - """ - EU 874MHz and 917MHz bands (Band no. 1 and 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD) - """ - EU_917: Config.LoRaConfig.RegionCode.ValueType # 31 - EU_N_868: Config.LoRaConfig.RegionCode.ValueType # 32 - """ - EU 868MHz band, with narrow presets - """ - ITU3_2M: Config.LoRaConfig.RegionCode.ValueType # 33 - """ - 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) - V: typing_extensions.TypeAlias = ValueType - - class _ModemPresetEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.LoRaConfig._ModemPreset.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - LONG_FAST: Config.LoRaConfig._ModemPreset.ValueType # 0 - """ - Long Range - Fast - """ - LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 1 - """ - Long Range - Slow - Deprecated in 2.7: Unpopular slow preset. - """ - VERY_LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 2 - """ - Very Long Range - Slow - Deprecated in 2.5: Works only with txco and is unusably slow - """ - MEDIUM_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 3 - """ - Medium Range - Slow - """ - MEDIUM_FAST: Config.LoRaConfig._ModemPreset.ValueType # 4 - """ - Medium Range - Fast - """ - SHORT_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 5 - """ - Short Range - Slow - """ - SHORT_FAST: Config.LoRaConfig._ModemPreset.ValueType # 6 - """ - Short Range - Fast - """ - LONG_MODERATE: Config.LoRaConfig._ModemPreset.ValueType # 7 - """ - Long Range - Moderately Fast - """ - SHORT_TURBO: Config.LoRaConfig._ModemPreset.ValueType # 8 - """ - Short Range - Turbo - This is the fastest preset and the only one with 500kHz bandwidth. - It is not legal to use in all regions due to this wider bandwidth. - """ - LONG_TURBO: Config.LoRaConfig._ModemPreset.ValueType # 9 - """ - Long Range - Turbo - This preset performs similarly to LongFast, but with 500Khz bandwidth. - """ - LITE_FAST: Config.LoRaConfig._ModemPreset.ValueType # 10 - """ - Lite Fast - Medium range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. - Comparable link budget to MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. - """ - LITE_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 11 - """ - Lite Slow - Medium-to-moderate range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. - Comparable link budget to LONG_FAST but compliant with Band no. 47b of 2006/771/EC. - """ - NARROW_FAST: Config.LoRaConfig._ModemPreset.ValueType # 12 - """ - Narrow Fast - Medium-to-moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. - Comparable link budget to SHORT_SLOW, but with half the data rate. - Intended to avoid interference with other devices. - """ - NARROW_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 13 - """ - Narrow Slow - 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): - """ - Standard predefined channel settings - Note: these mappings must match ModemPreset Choice in the device code. - """ - - LONG_FAST: Config.LoRaConfig.ModemPreset.ValueType # 0 - """ - Long Range - Fast - """ - LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 1 - """ - Long Range - Slow - Deprecated in 2.7: Unpopular slow preset. - """ - VERY_LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 2 - """ - Very Long Range - Slow - Deprecated in 2.5: Works only with txco and is unusably slow - """ - MEDIUM_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 3 - """ - Medium Range - Slow - """ - MEDIUM_FAST: Config.LoRaConfig.ModemPreset.ValueType # 4 - """ - Medium Range - Fast - """ - SHORT_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 5 - """ - Short Range - Slow - """ - SHORT_FAST: Config.LoRaConfig.ModemPreset.ValueType # 6 - """ - Short Range - Fast - """ - LONG_MODERATE: Config.LoRaConfig.ModemPreset.ValueType # 7 - """ - Long Range - Moderately Fast - """ - SHORT_TURBO: Config.LoRaConfig.ModemPreset.ValueType # 8 - """ - Short Range - Turbo - This is the fastest preset and the only one with 500kHz bandwidth. - It is not legal to use in all regions due to this wider bandwidth. - """ - LONG_TURBO: Config.LoRaConfig.ModemPreset.ValueType # 9 - """ - Long Range - Turbo - This preset performs similarly to LongFast, but with 500Khz bandwidth. - """ - LITE_FAST: Config.LoRaConfig.ModemPreset.ValueType # 10 - """ - Lite Fast - Medium range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. - Comparable link budget to MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC. - """ - LITE_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 11 - """ - Lite Slow - Medium-to-moderate range preset optimized for EU 866MHz SRD band with 125kHz bandwidth. - Comparable link budget to LONG_FAST but compliant with Band no. 47b of 2006/771/EC. - """ - NARROW_FAST: Config.LoRaConfig.ModemPreset.ValueType # 12 - """ - Narrow Fast - Medium-to-moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. - Comparable link budget to SHORT_SLOW, but with half the data rate. - Intended to avoid interference with other devices. - """ - NARROW_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 13 - """ - Narrow Slow - 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. - """ +Global___DisplayConfig: _TypeAlias = DisplayConfig # noqa: Y015 + +@_typing.final +class LoRaConfig(_message.Message): + """ + Lora Config + """ - class _FEM_LNA_Mode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + DESCRIPTOR: _descriptor.Descriptor - class _FEM_LNA_ModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.LoRaConfig._FEM_LNA_Mode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DISABLED: Config.LoRaConfig._FEM_LNA_Mode.ValueType # 0 - """ - FEM_LNA is present but disabled - """ - ENABLED: Config.LoRaConfig._FEM_LNA_Mode.ValueType # 1 - """ - FEM_LNA is present and enabled - """ - NOT_PRESENT: Config.LoRaConfig._FEM_LNA_Mode.ValueType # 2 - """ - FEM_LNA is not present on the device - """ + class _FEM_LNA_Mode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class FEM_LNA_Mode(_FEM_LNA_Mode, metaclass=_FEM_LNA_ModeEnumTypeWrapper): ... - DISABLED: Config.LoRaConfig.FEM_LNA_Mode.ValueType # 0 + class _FEM_LNA_ModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LoRaConfig._FEM_LNA_Mode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DISABLED: LoRaConfig._FEM_LNA_Mode.ValueType # 0 """ FEM_LNA is present but disabled """ - ENABLED: Config.LoRaConfig.FEM_LNA_Mode.ValueType # 1 + ENABLED: LoRaConfig._FEM_LNA_Mode.ValueType # 1 """ FEM_LNA is present and enabled """ - NOT_PRESENT: Config.LoRaConfig.FEM_LNA_Mode.ValueType # 2 + NOT_PRESENT: LoRaConfig._FEM_LNA_Mode.ValueType # 2 """ FEM_LNA is not present on the device """ - USE_PRESET_FIELD_NUMBER: builtins.int - MODEM_PRESET_FIELD_NUMBER: builtins.int - BANDWIDTH_FIELD_NUMBER: builtins.int - SPREAD_FACTOR_FIELD_NUMBER: builtins.int - CODING_RATE_FIELD_NUMBER: builtins.int - FREQUENCY_OFFSET_FIELD_NUMBER: builtins.int - REGION_FIELD_NUMBER: builtins.int - HOP_LIMIT_FIELD_NUMBER: builtins.int - TX_ENABLED_FIELD_NUMBER: builtins.int - TX_POWER_FIELD_NUMBER: builtins.int - CHANNEL_NUM_FIELD_NUMBER: builtins.int - OVERRIDE_DUTY_CYCLE_FIELD_NUMBER: builtins.int - SX126X_RX_BOOSTED_GAIN_FIELD_NUMBER: builtins.int - OVERRIDE_FREQUENCY_FIELD_NUMBER: builtins.int - PA_FAN_DISABLED_FIELD_NUMBER: builtins.int - IGNORE_INCOMING_FIELD_NUMBER: builtins.int - IGNORE_MQTT_FIELD_NUMBER: builtins.int - CONFIG_OK_TO_MQTT_FIELD_NUMBER: builtins.int - FEM_LNA_MODE_FIELD_NUMBER: builtins.int - SERIAL_HAL_ONLY_FIELD_NUMBER: builtins.int - use_preset: builtins.bool - """ - 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 - """ - Either modem_config or bandwidth/spreading/coding will be specified - NOT BOTH. - As a heuristic: If bandwidth is specified, do not use modem_config. - Because protobufs take ZERO space when the value is zero this works out nicely. - This value is replaced by bandwidth/spread_factor/coding_rate. - 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 kHz - Certain bandwidth numbers are 'special' and will be converted to the - appropriate floating point value: 31 -> 31.25kHz - """ - spread_factor: builtins.int - """ - A number from 5 to 12, which the firmware clamps to that range. - Indicates number of chirps per symbol as 1< 0 slot N, counted from 1, chosen by the user. + 0 derive it: slot = hash(name) % slot_count + 1, where name is what the + region's RegionInfo.override_slot selects - the primary channel's name, or + the modem preset's name from ModemPresetInfo.name. An empty primary channel + name means the preset name, so the two agree on a default channel. + + slot_count follows from the region's frequency range and the profile's + spacing_khz and padding_khz in the region registry, so it depends on region and + preset, not on this field. Most users never see this concept. + """ + override_frequency: _builtins.int + """ + This parameter is for advanced users and licensed HAM radio operators. + Ignore Channel Calculation and use this frequency instead. The frequency_offset + will still be applied. This will allow you to use out-of-band frequencies. + Please respect your local laws and regulations. If you are a HAM, make sure you + enable HAM mode and turn off encryption. + Units are in Hz. + """ + fem_lna_mode: Global___LoRaConfig.FEM_LNA_Mode.ValueType + """ + Set where LORA FEM is enabled, disabled, or not present + """ + def __init__( + self, + *, + flags: _builtins.int = ..., + modem_preset: _common_pb2.ModemPreset.ValueType = ..., + bandwidth: _builtins.int = ..., + spread_factor: _builtins.int = ..., + coding_rate: _builtins.int = ..., + frequency_offset: _builtins.int = ..., + region: _common_pb2.RegionCode.ValueType = ..., + hop_limit: _builtins.int = ..., + tx_power: _builtins.int = ..., + channel_num: _builtins.int = ..., + override_frequency: _builtins.int = ..., + fem_lna_mode: Global___LoRaConfig.FEM_LNA_Mode.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth", b"bandwidth", "channel_num", b"channel_num", "coding_rate", b"coding_rate", "fem_lna_mode", b"fem_lna_mode", "flags", b"flags", "frequency_offset", b"frequency_offset", "hop_limit", b"hop_limit", "modem_preset", b"modem_preset", "override_frequency", b"override_frequency", "region", b"region", "spread_factor", b"spread_factor", "tx_power", b"tx_power"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - With `use_preset` disabled this is the coding rate, clamped to 5 through 8. +Global___LoRaConfig: _TypeAlias = LoRaConfig # noqa: Y015 - With `use_preset` enabled, since 2.7.18 this raises the preset's coding rate - when it is 5 through 8 AND higher than the preset's. A lower value, a value - out of range, and 0 all leave the preset's coding rate in place, so 0 is how - a client says "use the preset's". Bandwidth and spread factor still come from - the preset, and the coding rate travels in the explicit LoRa header, so nodes - on the same preset still hear each other either way. +@_typing.final +class BluetoothConfig(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - No bound is stated here because the valid set differs between the two cases: - 5 through 8 with `use_preset` off, and 0 plus anything from above the preset's - own coding rate up to 8 with it on. - """ - frequency_offset: builtins.float - """ - This parameter is for advanced users with advanced test equipment, we do not recommend most users use it. - A frequency offset that is added to to the calculated band center frequency. - Used to correct for crystal calibration errors. - """ - region: global___Config.LoRaConfig.RegionCode.ValueType - """ - The region code for the radio (US, CN, EU433, etc...) - """ - hop_limit: builtins.int - """ - Maximum number of hops. This can't be greater than 7. - Default of 3 - Attempting to set a value > 7 results in the default - """ - tx_enabled: builtins.bool - """ - Disable TX from the LoRa radio. Useful for hot-swapping antennas and other tests. - Defaults to false - """ - tx_power: builtins.int - """ - If zero, then use default max legal continuous power (ie. something that won't - burn out the radio hardware) - In most cases you should use zero here. - Units are in dBm. - """ - channel_num: builtins.int - """ - This controls the actual hardware frequency the radio transmits on. - Most users should never need to be exposed to this field/concept. - A channel number between 1 and NUM_CHANNELS (whatever the max is in the current region). - If ZERO then the rule is "use the old channel name hash based - algorithm to derive the channel number") - If using the hash algorithm the channel number will be: hash(channel_name) % - NUM_CHANNELS (Where num channels depends on the regulatory region). - """ - override_duty_cycle: builtins.bool - """ - If true, duty cycle limits will be exceeded and thus you're possibly not following - the local regulations if you're not a HAM. - Has no effect if the duty cycle of the used region is 100%. - """ - sx126x_rx_boosted_gain: builtins.bool - """ - If true, sets RX boosted gain mode on SX126X based radios - """ - override_frequency: builtins.float - """ - This parameter is for advanced users and licensed HAM radio operators. - Ignore Channel Calculation and use this frequency instead. The frequency_offset - will still be applied. This will allow you to use out-of-band frequencies. - Please respect your local laws and regulations. If you are a HAM, make sure you - enable HAM mode and turn off encryption. - """ - pa_fan_disabled: builtins.bool - """ - If true, disable the build-in PA FAN using pin define in RF95_FAN_EN. - """ - ignore_mqtt: builtins.bool - """ - If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it. - """ - config_ok_to_mqtt: builtins.bool - """ - Sets the ok_to_mqtt bit on outgoing packets - """ - fem_lna_mode: global___Config.LoRaConfig.FEM_LNA_Mode.ValueType - """ - Set where LORA FEM is enabled, disabled, or not present - """ - serial_hal_only: builtins.bool - """ - Don't use radiolib to initialize the radio, instead listen for a serialHal connection - """ - @property - def ignore_incoming(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """ - For testing it is useful sometimes to force a node to never listen to - particular other nodes (simulating radio out of range). All nodenums listed - in ignore_incoming will have packets they send dropped on receive (by router.cpp) - """ + class _PairingMode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - def __init__( - self, - *, - use_preset: builtins.bool = ..., - modem_preset: global___Config.LoRaConfig.ModemPreset.ValueType = ..., - bandwidth: builtins.int = ..., - spread_factor: builtins.int = ..., - coding_rate: builtins.int = ..., - frequency_offset: builtins.float = ..., - region: global___Config.LoRaConfig.RegionCode.ValueType = ..., - hop_limit: builtins.int = ..., - tx_enabled: builtins.bool = ..., - tx_power: builtins.int = ..., - channel_num: builtins.int = ..., - override_duty_cycle: builtins.bool = ..., - sx126x_rx_boosted_gain: builtins.bool = ..., - override_frequency: builtins.float = ..., - pa_fan_disabled: builtins.bool = ..., - ignore_incoming: collections.abc.Iterable[builtins.int] | None = ..., - ignore_mqtt: builtins.bool = ..., - config_ok_to_mqtt: builtins.bool = ..., - fem_lna_mode: global___Config.LoRaConfig.FEM_LNA_Mode.ValueType = ..., - serial_hal_only: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["bandwidth", b"bandwidth", "channel_num", b"channel_num", "coding_rate", b"coding_rate", "config_ok_to_mqtt", b"config_ok_to_mqtt", "fem_lna_mode", b"fem_lna_mode", "frequency_offset", b"frequency_offset", "hop_limit", b"hop_limit", "ignore_incoming", b"ignore_incoming", "ignore_mqtt", b"ignore_mqtt", "modem_preset", b"modem_preset", "override_duty_cycle", b"override_duty_cycle", "override_frequency", b"override_frequency", "pa_fan_disabled", b"pa_fan_disabled", "region", b"region", "serial_hal_only", b"serial_hal_only", "spread_factor", b"spread_factor", "sx126x_rx_boosted_gain", b"sx126x_rx_boosted_gain", "tx_enabled", b"tx_enabled", "tx_power", b"tx_power", "use_preset", b"use_preset"]) -> None: ... - - @typing.final - class BluetoothConfig(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _PairingMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _PairingModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.BluetoothConfig._PairingMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - RANDOM_PIN: Config.BluetoothConfig._PairingMode.ValueType # 0 - """ - Device generates a random PIN that will be shown on the screen of the device for pairing - """ - FIXED_PIN: Config.BluetoothConfig._PairingMode.ValueType # 1 - """ - Device requires a specified fixed PIN for pairing - """ - NO_PIN: Config.BluetoothConfig._PairingMode.ValueType # 2 - """ - Device requires no PIN for pairing - """ - - class PairingMode(_PairingMode, metaclass=_PairingModeEnumTypeWrapper): ... - RANDOM_PIN: Config.BluetoothConfig.PairingMode.ValueType # 0 + class _PairingModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[BluetoothConfig._PairingMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + RANDOM_PIN: BluetoothConfig._PairingMode.ValueType # 0 """ Device generates a random PIN that will be shown on the screen of the device for pairing """ - FIXED_PIN: Config.BluetoothConfig.PairingMode.ValueType # 1 + FIXED_PIN: BluetoothConfig._PairingMode.ValueType # 1 """ Device requires a specified fixed PIN for pairing """ - NO_PIN: Config.BluetoothConfig.PairingMode.ValueType # 2 + NO_PIN: BluetoothConfig._PairingMode.ValueType # 2 """ Device requires no PIN for pairing """ - ENABLED_FIELD_NUMBER: builtins.int - MODE_FIELD_NUMBER: builtins.int - FIXED_PIN_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Enable Bluetooth on the device - """ - mode: global___Config.BluetoothConfig.PairingMode.ValueType - """ - Determines the pairing strategy for the device - """ - fixed_pin: builtins.int - """ - Specified PIN for PairingMode.FixedPin - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - mode: global___Config.BluetoothConfig.PairingMode.ValueType = ..., - fixed_pin: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "fixed_pin", b"fixed_pin", "mode", b"mode"]) -> None: ... - - @typing.final - class SecurityConfig(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _PacketSignaturePolicy: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _PacketSignaturePolicyEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.SecurityConfig._PacketSignaturePolicy.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - PACKET_SIGNATURE_POLICY_COMPATIBLE: Config.SecurityConfig._PacketSignaturePolicy.ValueType # 0 - """ - Accept unsigned packets for maximum compatibility while still rejecting malformed or invalid signatures. - This is the default to avoid legacy nodes dropping signed packets during rebroadcast. - """ - PACKET_SIGNATURE_POLICY_BALANCED: Config.SecurityConfig._PacketSignaturePolicy.ValueType # 1 - """ - Prefer authenticated packets while retaining compatibility with unsigned packets from nodes not known to sign. - Rejects unsigned, signable broadcasts from nodes that have previously signed. - """ - PACKET_SIGNATURE_POLICY_STRICT: Config.SecurityConfig._PacketSignaturePolicy.ValueType # 2 - """ - Accept only packets authenticated by a verified XEdDSA signature or successful PKI decryption. - Unsigned, malformed, invalid, or unverifiable packets are ignored. - """ - - class PacketSignaturePolicy(_PacketSignaturePolicy, metaclass=_PacketSignaturePolicyEnumTypeWrapper): - """ - Controls how the device authenticates remotely received mesh packets. - """ - - PACKET_SIGNATURE_POLICY_COMPATIBLE: Config.SecurityConfig.PacketSignaturePolicy.ValueType # 0 + class PairingMode(_PairingMode, metaclass=_PairingModeEnumTypeWrapper): ... + RANDOM_PIN: BluetoothConfig.PairingMode.ValueType # 0 + """ + Device generates a random PIN that will be shown on the screen of the device for pairing + """ + FIXED_PIN: BluetoothConfig.PairingMode.ValueType # 1 + """ + Device requires a specified fixed PIN for pairing + """ + NO_PIN: BluetoothConfig.PairingMode.ValueType # 2 + """ + Device requires no PIN for pairing + """ + + ENABLED_FIELD_NUMBER: _builtins.int + MODE_FIELD_NUMBER: _builtins.int + FIXED_PIN_FIELD_NUMBER: _builtins.int + enabled: _builtins.bool + """ + Enable Bluetooth on the device + """ + mode: Global___BluetoothConfig.PairingMode.ValueType + """ + Determines the pairing strategy for the device + """ + fixed_pin: _builtins.int + """ + Specified PIN for PairingMode.FixedPin + """ + def __init__( + self, + *, + enabled: _builtins.bool = ..., + mode: Global___BluetoothConfig.PairingMode.ValueType = ..., + fixed_pin: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "fixed_pin", b"fixed_pin", "mode", b"mode"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___BluetoothConfig: _TypeAlias = BluetoothConfig # noqa: Y015 + +@_typing.final +class SecurityConfig(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + class _PacketSignaturePolicy: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _PacketSignaturePolicyEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SecurityConfig._PacketSignaturePolicy.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + PACKET_SIGNATURE_POLICY_COMPATIBLE: SecurityConfig._PacketSignaturePolicy.ValueType # 0 """ Accept unsigned packets for maximum compatibility while still rejecting malformed or invalid signatures. - This is the default to avoid legacy nodes dropping signed packets during rebroadcast. + This is the default, so a node that does not sign still relays signed packets. """ - PACKET_SIGNATURE_POLICY_BALANCED: Config.SecurityConfig.PacketSignaturePolicy.ValueType # 1 + PACKET_SIGNATURE_POLICY_BALANCED: SecurityConfig._PacketSignaturePolicy.ValueType # 1 """ Prefer authenticated packets while retaining compatibility with unsigned packets from nodes not known to sign. Rejects unsigned, signable broadcasts from nodes that have previously signed. """ - PACKET_SIGNATURE_POLICY_STRICT: Config.SecurityConfig.PacketSignaturePolicy.ValueType # 2 + PACKET_SIGNATURE_POLICY_STRICT: SecurityConfig._PacketSignaturePolicy.ValueType # 2 """ Accept only packets authenticated by a verified XEdDSA signature or successful PKI decryption. Unsigned, malformed, invalid, or unverifiable packets are ignored. """ - PUBLIC_KEY_FIELD_NUMBER: builtins.int - PRIVATE_KEY_FIELD_NUMBER: builtins.int - ADMIN_KEY_FIELD_NUMBER: builtins.int - IS_MANAGED_FIELD_NUMBER: builtins.int - SERIAL_ENABLED_FIELD_NUMBER: builtins.int - DEBUG_LOG_API_ENABLED_FIELD_NUMBER: builtins.int - ADMIN_CHANNEL_ENABLED_FIELD_NUMBER: builtins.int - PACKET_SIGNATURE_POLICY_FIELD_NUMBER: builtins.int - public_key: builtins.bytes + class PacketSignaturePolicy(_PacketSignaturePolicy, metaclass=_PacketSignaturePolicyEnumTypeWrapper): + """ + Controls how the device authenticates remotely received mesh packets. + """ + + PACKET_SIGNATURE_POLICY_COMPATIBLE: SecurityConfig.PacketSignaturePolicy.ValueType # 0 + """ + Accept unsigned packets for maximum compatibility while still rejecting malformed or invalid signatures. + This is the default, so a node that does not sign still relays signed packets. + """ + PACKET_SIGNATURE_POLICY_BALANCED: SecurityConfig.PacketSignaturePolicy.ValueType # 1 + """ + Prefer authenticated packets while retaining compatibility with unsigned packets from nodes not known to sign. + Rejects unsigned, signable broadcasts from nodes that have previously signed. + """ + PACKET_SIGNATURE_POLICY_STRICT: SecurityConfig.PacketSignaturePolicy.ValueType # 2 + """ + Accept only packets authenticated by a verified XEdDSA signature or successful PKI decryption. + Unsigned, malformed, invalid, or unverifiable packets are ignored. + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SecurityConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + SECURITY_NONE: SecurityConfig._Flags.ValueType # 0 + """Nothing enabled""" + SECURITY_IS_MANAGED: SecurityConfig._Flags.ValueType # 1 + """The device is managed by a mesh administrator via admin messages""" + SECURITY_SERIAL_ENABLED: SecurityConfig._Flags.ValueType # 2 + """Serial console over the Stream API""" + SECURITY_DEBUG_LOG_API_ENABLED: SecurityConfig._Flags.ValueType # 4 + """ + Keep live debug logging on over serial or bluetooth. By default logging stops + as soon as an API client connects, to keep a shared serial link quiet. + """ + SECURITY_ADMIN_CHANNEL_ENABLED: SecurityConfig._Flags.ValueType # 8 + """Allow incoming device control over the insecure admin channel""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Security toggles: a bitwise OR of Flags values. + """ + + SECURITY_NONE: SecurityConfig.Flags.ValueType # 0 + """Nothing enabled""" + SECURITY_IS_MANAGED: SecurityConfig.Flags.ValueType # 1 + """The device is managed by a mesh administrator via admin messages""" + SECURITY_SERIAL_ENABLED: SecurityConfig.Flags.ValueType # 2 + """Serial console over the Stream API""" + SECURITY_DEBUG_LOG_API_ENABLED: SecurityConfig.Flags.ValueType # 4 + """ + Keep live debug logging on over serial or bluetooth. By default logging stops + as soon as an API client connects, to keep a shared serial link quiet. + """ + SECURITY_ADMIN_CHANNEL_ENABLED: SecurityConfig.Flags.ValueType # 8 + """Allow incoming device control over the insecure admin channel""" + + class _RatchetFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _RatchetFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SecurityConfig._RatchetFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + RATCHET_NONE: SecurityConfig._RatchetFlags.ValueType # 0 + """Nothing enabled: direct messages derive their key from the static keys alone""" + RATCHET_ENABLED: SecurityConfig._RatchetFlags.ValueType # 1 + """Generate, publish and use ratchet keys for PKI direct messages""" + RATCHET_REQUIRE_WHEN_KNOWN: SecurityConfig._RatchetFlags.ValueType # 2 + """ + Refuse to send a direct message with the static derivation when the peer has + published a ratchet key. Off by default: a stale key would cost delivery. + """ + + class RatchetFlags(_RatchetFlags, metaclass=_RatchetFlagsEnumTypeWrapper): + """ + Direct message forward secrecy: a bitwise OR of RatchetFlags values. + """ + + RATCHET_NONE: SecurityConfig.RatchetFlags.ValueType # 0 + """Nothing enabled: direct messages derive their key from the static keys alone""" + RATCHET_ENABLED: SecurityConfig.RatchetFlags.ValueType # 1 + """Generate, publish and use ratchet keys for PKI direct messages""" + RATCHET_REQUIRE_WHEN_KNOWN: SecurityConfig.RatchetFlags.ValueType # 2 + """ + Refuse to send a direct message with the static derivation when the peer has + published a ratchet key. Off by default: a stale key would cost delivery. + """ + + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + PRIVATE_KEY_FIELD_NUMBER: _builtins.int + ADMIN_KEY_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + PACKET_SIGNATURE_POLICY_FIELD_NUMBER: _builtins.int + RATCHET_FLAGS_FIELD_NUMBER: _builtins.int + RATCHET_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + GROUP_PRIVATE_KEY_FIELD_NUMBER: _builtins.int + public_key: _builtins.bytes + """ + The public key of this device, and its source: the owner leaves it unset, and the + node's own NodeDB entry carries a recovery copy. Sent to other nodes as + User.public_key so they can compute a shared secret key. + """ + private_key: _builtins.bytes + """ + The private key of the device. + Used to create a shared key with a remote device. + """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + packet_signature_policy: Global___SecurityConfig.PacketSignaturePolicy.ValueType + """ + Determines the packet signature policy applied to remotely received mesh packets. + """ + ratchet_flags: _builtins.int + """ + Bitwise OR of RatchetFlags values. + """ + ratchet_interval_secs: _builtins.int + """ + Seconds between ratchet rotations. 0 takes the default of 86400; the minimum is + 3600. Forward secrecy is per interval, so this is the width of the window a + compromise of both static keys still opens. + """ + @_builtins.property + def admin_key(self) -> _containers.RepeatedScalarFieldContainer[_builtins.bytes]: + """ + The public key authorized to send admin messages to this node. + """ + + @_builtins.property + def group_private_key(self) -> _containers.RepeatedScalarFieldContainer[_builtins.bytes]: + """ + X25519 private keys of the anycast groups this node is a member of, one per group. + Held here rather than in GroupConfig because this is where private key material lives, + with the same handling as private_key: never returned to a client that did not set it. + Firmware derives each key's public half to match it against a GroupConfig.Group entry, + so nothing indexes one list into the other. """ - The public key of the user's device. - Sent out to other nodes on the mesh to allow them to compute a shared secret key. - """ - private_key: builtins.bytes + + def __init__( + self, + *, + public_key: _builtins.bytes = ..., + private_key: _builtins.bytes = ..., + admin_key: _abc.Iterable[_builtins.bytes] | None = ..., + flags: _builtins.int = ..., + packet_signature_policy: Global___SecurityConfig.PacketSignaturePolicy.ValueType = ..., + ratchet_flags: _builtins.int = ..., + ratchet_interval_secs: _builtins.int = ..., + group_private_key: _abc.Iterable[_builtins.bytes] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["admin_key", b"admin_key", "flags", b"flags", "group_private_key", b"group_private_key", "packet_signature_policy", b"packet_signature_policy", "private_key", b"private_key", "public_key", b"public_key", "ratchet_flags", b"ratchet_flags", "ratchet_interval_secs", b"ratchet_interval_secs"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SecurityConfig: _TypeAlias = SecurityConfig # noqa: Y015 + +@_typing.final +class SessionkeyConfig(_message.Message): + """ + Blank config request, strictly for getting the session key + """ + + DESCRIPTOR: _descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _Never # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SessionkeyConfig: _TypeAlias = SessionkeyConfig # noqa: Y015 + +@_typing.final +class GroupConfig(_message.Message): + """ + Anycast Groups + + The groups this node sends to or serves. A group is a key pair like a node: this message + holds the public half, which is all a sender needs, and a member also holds the private + half in SecurityConfig.group_private_key, where the node's own private key lives. A + member delivers, acknowledges and, with uplink_enabled, hands what it received to its + backhaul. The group id is crc32(public_key) in the NodeNum space, derived by firmware and + never stored here. + + There is no provisioning path through a channel URL or a QR code: group keys are set by an + operator through admin, as node keys are. + + A frame to a group is an ordinary UCAST frame with HOP_ANYCAST set, so it is delivered + to the nearest reachable member by the same next-hop learning as a direct message, and + it never becomes a broadcast. + """ + + DESCRIPTOR: _descriptor.Descriptor + + @_typing.final + class Group(_message.Message): """ - The private key of the device. - Used to create a shared key with a remote device. + One group. """ - is_managed: builtins.bool + + DESCRIPTOR: _descriptor.Descriptor + + NAME_FIELD_NUMBER: _builtins.int + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + UPLINK_ENABLED_FIELD_NUMBER: _builtins.int + name: _builtins.str """ - If true, device is considered to be "managed" by a mesh administrator via admin messages - Device is managed by a mesh administrator. + Display name. """ - serial_enabled: builtins.bool + public_key: _builtins.bytes """ - Serial Console over the Stream API." + X25519 public key of the group. A sender needs only this. """ - debug_log_api_enabled: builtins.bool + uplink_enabled: _builtins.bool """ - By default we turn off logging as soon as an API client connects (to keep shared serial link quiet). - Output live debug logging over serial or bluetooth is set to true. + Member only: hand a delivered packet to MQTT or another backhaul. """ - admin_channel_enabled: builtins.bool + def __init__( + self, + *, + name: _builtins.str = ..., + public_key: _builtins.bytes = ..., + uplink_enabled: _builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "public_key", b"public_key", "uplink_enabled", b"uplink_enabled"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + + GROUPS_FIELD_NUMBER: _builtins.int + @_builtins.property + def groups(self) -> _containers.RepeatedCompositeFieldContainer[Global___GroupConfig.Group]: """ - Allow incoming device control over the insecure legacy admin channel. + The groups this node knows. """ - packet_signature_policy: global___Config.SecurityConfig.PacketSignaturePolicy.ValueType + + def __init__( + self, + *, + groups: _abc.Iterable[Global___GroupConfig.Group] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["groups", b"groups"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___GroupConfig: _TypeAlias = GroupConfig # noqa: Y015 + +@_typing.final +class RelayConfig(_message.Message): + """ + Relay Policy + + How this node relays broadcast traffic, per channel hash. Evaluated on the relaying + roles, ROUTER and ROUTER_LATE, only; every other role ignores it. Keyed by the + header's one-byte `chan`, so a rule covers every channel that hashes to that byte, + held or not - which is what lets an operator cap a channel whose key the node does + not have. + + Default is no rules and RELAY_FORWARD, so a node relays as it did until an operator + opts in. A RELAY_DROP on the primary hash partitions a mesh, so rules are admin-only + and firmware logs every drop with the hash that caused it. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Action: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _ActionEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[RelayConfig._Action.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + RELAY_FORWARD: RelayConfig._Action.ValueType # 0 + """Relay it""" + RELAY_CAP: RelayConfig._Action.ValueType # 1 + """Relay it while the hops taken so far are below hop_cap""" + RELAY_DROP: RelayConfig._Action.ValueType # 2 + """Do not relay it. The node still receives and decodes it locally.""" + + class Action(_Action, metaclass=_ActionEnumTypeWrapper): """ - Determines the packet signature policy applied to remotely received mesh packets. + What to do with a matching broadcast. """ - @property - def admin_key(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: - """ - The public key authorized to send admin messages to this node. - """ - def __init__( - self, - *, - public_key: builtins.bytes = ..., - private_key: builtins.bytes = ..., - admin_key: collections.abc.Iterable[builtins.bytes] | None = ..., - is_managed: builtins.bool = ..., - 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", "packet_signature_policy", b"packet_signature_policy", "private_key", b"private_key", "public_key", b"public_key", "serial_enabled", b"serial_enabled"]) -> None: ... + RELAY_FORWARD: RelayConfig.Action.ValueType # 0 + """Relay it""" + RELAY_CAP: RelayConfig.Action.ValueType # 1 + """Relay it while the hops taken so far are below hop_cap""" + RELAY_DROP: RelayConfig.Action.ValueType # 2 + """Do not relay it. The node still receives and decodes it locally.""" - @typing.final - class SessionkeyConfig(google.protobuf.message.Message): + @_typing.final + class Rule(_message.Message): """ - Blank config request, strictly for getting the session key + One policy entry. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor + CHANNEL_HASH_FIELD_NUMBER: _builtins.int + ACTION_FIELD_NUMBER: _builtins.int + HOP_CAP_FIELD_NUMBER: _builtins.int + channel_hash: _builtins.int + """ + The header `chan` byte this rule matches. + """ + action: Global___RelayConfig.Action.ValueType + """ + What to do with a broadcast whose `chan` matches. + """ + hop_cap: _builtins.int + """ + For RELAY_CAP: relay only while hop_start - hop_limit is below this. Hops taken + is a hint rather than an authenticated value (SCHEMA.md §8, Hop accounting), so a + cap is a congestion tool and never a security boundary. + """ def __init__( self, + *, + channel_hash: _builtins.int = ..., + action: Global___RelayConfig.Action.ValueType = ..., + hop_cap: _builtins.int = ..., ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["action", b"action", "channel_hash", b"channel_hash", "hop_cap", b"hop_cap"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + + RULES_FIELD_NUMBER: _builtins.int + DEFAULT_ACTION_FIELD_NUMBER: _builtins.int + REGIONS_FIELD_NUMBER: _builtins.int + SCOPE_MISS_ACTION_FIELD_NUMBER: _builtins.int + default_action: Global___RelayConfig.Action.ValueType + """ + What to do with a broadcast that matches no rule. + """ + scope_miss_action: Global___RelayConfig.Action.ValueType + """ + What to do with a broadcast whose scope_code matches none of `regions`. Only + consulted when `regions` is non-empty and the frame carries a scope_code. + """ + @_builtins.property + def rules(self) -> _containers.RepeatedCompositeFieldContainer[Global___RelayConfig.Rule]: + """ + Rules, first match wins. Empty means forward everything. + """ + + @_builtins.property + def regions(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: + """ + Region names this relay verifies HeaderOptions.scope_code against. Empty means the + field is ignored. + """ - DEVICE_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - POWER_FIELD_NUMBER: builtins.int - NETWORK_FIELD_NUMBER: builtins.int - DISPLAY_FIELD_NUMBER: builtins.int - LORA_FIELD_NUMBER: builtins.int - BLUETOOTH_FIELD_NUMBER: builtins.int - SECURITY_FIELD_NUMBER: builtins.int - SESSIONKEY_FIELD_NUMBER: builtins.int - DEVICE_UI_FIELD_NUMBER: builtins.int - @property - def device(self) -> global___Config.DeviceConfig: ... - @property - def position(self) -> global___Config.PositionConfig: ... - @property - def power(self) -> global___Config.PowerConfig: ... - @property - def network(self) -> global___Config.NetworkConfig: ... - @property - def display(self) -> global___Config.DisplayConfig: ... - @property - def lora(self) -> global___Config.LoRaConfig: ... - @property - def bluetooth(self) -> global___Config.BluetoothConfig: ... - @property - def security(self) -> global___Config.SecurityConfig: ... - @property - def sessionkey(self) -> global___Config.SessionkeyConfig: ... - @property - def device_ui(self) -> meshtastic.protobuf.device_ui_pb2.DeviceUIConfig: ... def __init__( self, *, - device: global___Config.DeviceConfig | None = ..., - position: global___Config.PositionConfig | None = ..., - power: global___Config.PowerConfig | None = ..., - network: global___Config.NetworkConfig | None = ..., - display: global___Config.DisplayConfig | None = ..., - lora: global___Config.LoRaConfig | None = ..., - bluetooth: global___Config.BluetoothConfig | None = ..., - security: global___Config.SecurityConfig | None = ..., - sessionkey: global___Config.SessionkeyConfig | None = ..., - device_ui: meshtastic.protobuf.device_ui_pb2.DeviceUIConfig | None = ..., + rules: _abc.Iterable[Global___RelayConfig.Rule] | None = ..., + default_action: Global___RelayConfig.Action.ValueType = ..., + regions: _abc.Iterable[_builtins.str] | None = ..., + scope_miss_action: Global___RelayConfig.Action.ValueType = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "device_ui", b"device_ui", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power", "security", b"security", "sessionkey", b"sessionkey"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "device_ui", b"device_ui", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power", "security", b"security", "sessionkey", b"sessionkey"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["device", "position", "power", "network", "display", "lora", "bluetooth", "security", "sessionkey", "device_ui"] | None: ... - -global___Config = Config + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["default_action", b"default_action", "regions", b"regions", "rules", b"rules", "scope_miss_action", b"scope_miss_action"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RelayConfig: _TypeAlias = RelayConfig # noqa: Y015 + +@_typing.final +class ConfigPayload(_message.Message): + """ + Payload Variant for admin transport + """ + + DESCRIPTOR: _descriptor.Descriptor + + DEVICE_FIELD_NUMBER: _builtins.int + POSITION_FIELD_NUMBER: _builtins.int + POWER_FIELD_NUMBER: _builtins.int + NETWORK_FIELD_NUMBER: _builtins.int + DISPLAY_FIELD_NUMBER: _builtins.int + LORA_FIELD_NUMBER: _builtins.int + BLUETOOTH_FIELD_NUMBER: _builtins.int + SECURITY_FIELD_NUMBER: _builtins.int + SESSIONKEY_FIELD_NUMBER: _builtins.int + RELAY_FIELD_NUMBER: _builtins.int + GROUP_FIELD_NUMBER: _builtins.int + @_builtins.property + def device(self) -> Global___DeviceConfig: ... + @_builtins.property + def position(self) -> Global___PositionConfig: ... + @_builtins.property + def power(self) -> Global___PowerConfig: ... + @_builtins.property + def network(self) -> Global___NetworkConfig: ... + @_builtins.property + def display(self) -> Global___DisplayConfig: ... + @_builtins.property + def lora(self) -> Global___LoRaConfig: ... + @_builtins.property + def bluetooth(self) -> Global___BluetoothConfig: ... + @_builtins.property + def security(self) -> Global___SecurityConfig: ... + @_builtins.property + def sessionkey(self) -> Global___SessionkeyConfig: ... + @_builtins.property + def relay(self) -> Global___RelayConfig: ... + @_builtins.property + def group(self) -> Global___GroupConfig: ... + def __init__( + self, + *, + device: Global___DeviceConfig | None = ..., + position: Global___PositionConfig | None = ..., + power: Global___PowerConfig | None = ..., + network: Global___NetworkConfig | None = ..., + display: Global___DisplayConfig | None = ..., + lora: Global___LoRaConfig | None = ..., + bluetooth: Global___BluetoothConfig | None = ..., + security: Global___SecurityConfig | None = ..., + sessionkey: Global___SessionkeyConfig | None = ..., + relay: Global___RelayConfig | None = ..., + group: Global___GroupConfig | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "group", b"group", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power", "relay", b"relay", "security", b"security", "sessionkey", b"sessionkey"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "group", b"group", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power", "relay", b"relay", "security", b"security", "sessionkey", b"sessionkey"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["device", "position", "power", "network", "display", "lora", "bluetooth", "security", "sessionkey", "relay", "group"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___ConfigPayload: _TypeAlias = ConfigPayload # noqa: Y015 diff --git a/meshtastic/protobuf/connection_status_pb2.py b/meshtastic/protobuf/connection_status_pb2.py index 9c9156a57..597d1f5be 100644 --- a/meshtastic/protobuf/connection_status_pb2.py +++ b/meshtastic/protobuf/connection_status_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/connection_status.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,16 +15,16 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/connection_status.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xd5\x02\n\x16\x44\x65viceConnectionStatus\x12<\n\x04wifi\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.WifiConnectionStatusH\x00\x88\x01\x01\x12\x44\n\x08\x65thernet\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x46\n\tbluetooth\x18\x03 \x01(\x0b\x32..meshtastic.protobuf.BluetoothConnectionStatusH\x02\x88\x01\x01\x12@\n\x06serial\x18\x04 \x01(\x0b\x32+.meshtastic.protobuf.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"w\n\x14WifiConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\x12\x13\n\x04ssid\x18\x02 \x01(\tB\x05\x92?\x02\x08!\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"X\n\x18\x45thernetConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x66\n\x14org.meshtastic.protoB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/connection_status.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xd5\x02\n\x16\x44\x65viceConnectionStatus\x12<\n\x04wifi\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.WifiConnectionStatusH\x00\x88\x01\x01\x12\x44\n\x08\x65thernet\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x46\n\tbluetooth\x18\x03 \x01(\x0b\x32..meshtastic.protobuf.BluetoothConnectionStatusH\x02\x88\x01\x01\x12@\n\x06serial\x18\x04 \x01(\x0b\x32+.meshtastic.protobuf.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"w\n\x14WifiConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\x12\x13\n\x04ssid\x18\x02 \x01(\tB\x05\x92?\x02\x08!\x12\x0c\n\x04rssi\x18\x03 \x01(\x11\"X\n\x18\x45thernetConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x11\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x66\n\x14org.meshtastic.protoB\x10\x43onnStatusProtosZ\"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.connection_status_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _WIFICONNECTIONSTATUS.fields_by_name['ssid']._options = None - _WIFICONNECTIONSTATUS.fields_by_name['ssid']._serialized_options = b'\222?\002\010!' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_WIFICONNECTIONSTATUS'].fields_by_name['ssid']._options = None + _globals['_WIFICONNECTIONSTATUS'].fields_by_name['ssid']._serialized_options = b'\222?\002\010!' _globals['_DEVICECONNECTIONSTATUS']._serialized_start=103 _globals['_DEVICECONNECTIONSTATUS']._serialized_end=444 _globals['_WIFICONNECTIONSTATUS']._serialized_start=446 diff --git a/meshtastic/protobuf/connection_status_pb2.pyi b/meshtastic/protobuf/connection_status_pb2.pyi index 7b69140a3..4eff87628 100644 --- a/meshtastic/protobuf/connection_status_pb2.pyi +++ b/meshtastic/protobuf/connection_status_pb2.pyi @@ -3,41 +3,47 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import typing - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -@typing.final -class DeviceConnectionStatus(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - WIFI_FIELD_NUMBER: builtins.int - ETHERNET_FIELD_NUMBER: builtins.int - BLUETOOTH_FIELD_NUMBER: builtins.int - SERIAL_FIELD_NUMBER: builtins.int - @property - def wifi(self) -> global___WifiConnectionStatus: +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class DeviceConnectionStatus(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + WIFI_FIELD_NUMBER: _builtins.int + ETHERNET_FIELD_NUMBER: _builtins.int + BLUETOOTH_FIELD_NUMBER: _builtins.int + SERIAL_FIELD_NUMBER: _builtins.int + @_builtins.property + def wifi(self) -> Global___WifiConnectionStatus: """ WiFi Status """ - @property - def ethernet(self) -> global___EthernetConnectionStatus: + @_builtins.property + def ethernet(self) -> Global___EthernetConnectionStatus: """ WiFi Status """ - @property - def bluetooth(self) -> global___BluetoothConnectionStatus: + @_builtins.property + def bluetooth(self) -> Global___BluetoothConnectionStatus: """ Bluetooth Status """ - @property - def serial(self) -> global___SerialConnectionStatus: + @_builtins.property + def serial(self) -> Global___SerialConnectionStatus: """ Serial Status """ @@ -45,45 +51,55 @@ class DeviceConnectionStatus(google.protobuf.message.Message): def __init__( self, *, - wifi: global___WifiConnectionStatus | None = ..., - ethernet: global___EthernetConnectionStatus | None = ..., - bluetooth: global___BluetoothConnectionStatus | None = ..., - serial: global___SerialConnectionStatus | None = ..., + wifi: Global___WifiConnectionStatus | None = ..., + ethernet: Global___EthernetConnectionStatus | None = ..., + bluetooth: Global___BluetoothConnectionStatus | None = ..., + serial: Global___SerialConnectionStatus | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_bluetooth", b"_bluetooth"]) -> typing.Literal["bluetooth"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ethernet", b"_ethernet"]) -> typing.Literal["ethernet"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_serial", b"_serial"]) -> typing.Literal["serial"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_wifi", b"_wifi"]) -> typing.Literal["wifi"] | None: ... - -global___DeviceConnectionStatus = DeviceConnectionStatus - -@typing.final -class WifiConnectionStatus(google.protobuf.message.Message): + _HasFieldArgType: _TypeAlias = _typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__bluetooth: _TypeAlias = _typing.Literal["bluetooth"] # noqa: Y015 + _WhichOneofArgType__bluetooth: _TypeAlias = _typing.Literal["_bluetooth", b"_bluetooth"] # noqa: Y015 + _WhichOneofReturnType__ethernet: _TypeAlias = _typing.Literal["ethernet"] # noqa: Y015 + _WhichOneofArgType__ethernet: _TypeAlias = _typing.Literal["_ethernet", b"_ethernet"] # noqa: Y015 + _WhichOneofReturnType__serial: _TypeAlias = _typing.Literal["serial"] # noqa: Y015 + _WhichOneofArgType__serial: _TypeAlias = _typing.Literal["_serial", b"_serial"] # noqa: Y015 + _WhichOneofReturnType__wifi: _TypeAlias = _typing.Literal["wifi"] # noqa: Y015 + _WhichOneofArgType__wifi: _TypeAlias = _typing.Literal["_wifi", b"_wifi"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__bluetooth) -> _WhichOneofReturnType__bluetooth | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__ethernet) -> _WhichOneofReturnType__ethernet | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__serial) -> _WhichOneofReturnType__serial | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__wifi) -> _WhichOneofReturnType__wifi | None: ... + +Global___DeviceConnectionStatus: _TypeAlias = DeviceConnectionStatus # noqa: Y015 + +@_typing.final +class WifiConnectionStatus(_message.Message): """ WiFi connection status """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - STATUS_FIELD_NUMBER: builtins.int - SSID_FIELD_NUMBER: builtins.int - RSSI_FIELD_NUMBER: builtins.int - ssid: builtins.str + STATUS_FIELD_NUMBER: _builtins.int + SSID_FIELD_NUMBER: _builtins.int + RSSI_FIELD_NUMBER: _builtins.int + ssid: _builtins.str """ WiFi access point SSID """ - rssi: builtins.int + rssi: _builtins.int """ - RSSI of wireless connection + RSSI of the WiFi connection in whole dBm, negative in practice. """ - @property - def status(self) -> global___NetworkConnectionStatus: + @_builtins.property + def status(self) -> Global___NetworkConnectionStatus: """ Connection status """ @@ -91,26 +107,29 @@ class WifiConnectionStatus(google.protobuf.message.Message): def __init__( self, *, - status: global___NetworkConnectionStatus | None = ..., - ssid: builtins.str = ..., - rssi: builtins.int = ..., + status: Global___NetworkConnectionStatus | None = ..., + ssid: _builtins.str = ..., + rssi: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["status", b"status"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["rssi", b"rssi", "ssid", b"ssid", "status", b"status"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["status", b"status"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["rssi", b"rssi", "ssid", b"ssid", "status", b"status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___WifiConnectionStatus = WifiConnectionStatus +Global___WifiConnectionStatus: _TypeAlias = WifiConnectionStatus # noqa: Y015 -@typing.final -class EthernetConnectionStatus(google.protobuf.message.Message): +@_typing.final +class EthernetConnectionStatus(_message.Message): """ Ethernet connection status """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - STATUS_FIELD_NUMBER: builtins.int - @property - def status(self) -> global___NetworkConnectionStatus: + STATUS_FIELD_NUMBER: _builtins.int + @_builtins.property + def status(self) -> Global___NetworkConnectionStatus: """ Connection status """ @@ -118,111 +137,126 @@ class EthernetConnectionStatus(google.protobuf.message.Message): def __init__( self, *, - status: global___NetworkConnectionStatus | None = ..., + status: Global___NetworkConnectionStatus | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["status", b"status"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["status", b"status"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["status", b"status"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["status", b"status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___EthernetConnectionStatus = EthernetConnectionStatus +Global___EthernetConnectionStatus: _TypeAlias = EthernetConnectionStatus # noqa: Y015 -@typing.final -class NetworkConnectionStatus(google.protobuf.message.Message): +@_typing.final +class NetworkConnectionStatus(_message.Message): """ Ethernet or WiFi connection status """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - IP_ADDRESS_FIELD_NUMBER: builtins.int - IS_CONNECTED_FIELD_NUMBER: builtins.int - IS_MQTT_CONNECTED_FIELD_NUMBER: builtins.int - IS_SYSLOG_CONNECTED_FIELD_NUMBER: builtins.int - ip_address: builtins.int + IP_ADDRESS_FIELD_NUMBER: _builtins.int + IS_CONNECTED_FIELD_NUMBER: _builtins.int + IS_MQTT_CONNECTED_FIELD_NUMBER: _builtins.int + IS_SYSLOG_CONNECTED_FIELD_NUMBER: _builtins.int + ip_address: _builtins.int """ IP address of device """ - is_connected: builtins.bool + is_connected: _builtins.bool """ Whether the device has an active connection or not """ - is_mqtt_connected: builtins.bool + is_mqtt_connected: _builtins.bool """ Whether the device has an active connection to an MQTT broker or not """ - is_syslog_connected: builtins.bool + is_syslog_connected: _builtins.bool """ Whether the device is actively remote syslogging or not """ def __init__( self, *, - ip_address: builtins.int = ..., - is_connected: builtins.bool = ..., - is_mqtt_connected: builtins.bool = ..., - is_syslog_connected: builtins.bool = ..., + ip_address: _builtins.int = ..., + is_connected: _builtins.bool = ..., + is_mqtt_connected: _builtins.bool = ..., + is_syslog_connected: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["ip_address", b"ip_address", "is_connected", b"is_connected", "is_mqtt_connected", b"is_mqtt_connected", "is_syslog_connected", b"is_syslog_connected"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ip_address", b"ip_address", "is_connected", b"is_connected", "is_mqtt_connected", b"is_mqtt_connected", "is_syslog_connected", b"is_syslog_connected"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___NetworkConnectionStatus = NetworkConnectionStatus +Global___NetworkConnectionStatus: _TypeAlias = NetworkConnectionStatus # noqa: Y015 -@typing.final -class BluetoothConnectionStatus(google.protobuf.message.Message): +@_typing.final +class BluetoothConnectionStatus(_message.Message): """ Bluetooth connection status """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - PIN_FIELD_NUMBER: builtins.int - RSSI_FIELD_NUMBER: builtins.int - IS_CONNECTED_FIELD_NUMBER: builtins.int - pin: builtins.int + PIN_FIELD_NUMBER: _builtins.int + RSSI_FIELD_NUMBER: _builtins.int + IS_CONNECTED_FIELD_NUMBER: _builtins.int + pin: _builtins.int """ The pairing PIN for bluetooth """ - rssi: builtins.int + rssi: _builtins.int """ - RSSI of bluetooth connection + RSSI of the Bluetooth connection in whole dBm, negative in practice. """ - is_connected: builtins.bool + is_connected: _builtins.bool """ Whether the device has an active connection or not """ def __init__( self, *, - pin: builtins.int = ..., - rssi: builtins.int = ..., - is_connected: builtins.bool = ..., + pin: _builtins.int = ..., + rssi: _builtins.int = ..., + is_connected: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["is_connected", b"is_connected", "pin", b"pin", "rssi", b"rssi"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["is_connected", b"is_connected", "pin", b"pin", "rssi", b"rssi"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___BluetoothConnectionStatus = BluetoothConnectionStatus +Global___BluetoothConnectionStatus: _TypeAlias = BluetoothConnectionStatus # noqa: Y015 -@typing.final -class SerialConnectionStatus(google.protobuf.message.Message): +@_typing.final +class SerialConnectionStatus(_message.Message): """ Serial connection status """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - BAUD_FIELD_NUMBER: builtins.int - IS_CONNECTED_FIELD_NUMBER: builtins.int - baud: builtins.int + BAUD_FIELD_NUMBER: _builtins.int + IS_CONNECTED_FIELD_NUMBER: _builtins.int + baud: _builtins.int """ Serial baud rate """ - is_connected: builtins.bool + is_connected: _builtins.bool """ Whether the device has an active connection or not """ def __init__( self, *, - baud: builtins.int = ..., - is_connected: builtins.bool = ..., + baud: _builtins.int = ..., + is_connected: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["baud", b"baud", "is_connected", b"is_connected"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["baud", b"baud", "is_connected", b"is_connected"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___SerialConnectionStatus = SerialConnectionStatus +Global___SerialConnectionStatus: _TypeAlias = SerialConnectionStatus # noqa: Y015 diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index bfb3c09e5..41d7ca8f1 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/device_ui.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,54 +15,66 @@ 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*\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xd1\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08pin_code\x18\x05 \x01(\r\x12)\n\x05theme\x18\x06 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x1b\n\x0cring_tone_id\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12/\n\x08language\x18\x08 \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\t \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\n \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x1f\n\x10\x63\x61libration_data\x18\x0b \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12*\n\x08map_data\x18\x0c \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12=\n\x0c\x63ompass_mode\x18\r \x01(\x0e\x32 .meshtastic.protobuf.CompassModeB\x05\x92?\x02\x38\x08\x12\x18\n\x10screen_rgb_color\x18\x0e \x01(\r\x12R\n\ngps_format\x18\x0f \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormatB\x05\x92?\x02\x38\x08\"\x87\x01\n\x05\x46lags\x12\x0b\n\x07UI_NONE\x10\x00\x12\x12\n\x0eUI_SCREEN_LOCK\x10\x01\x12\x14\n\x10UI_SETTINGS_LOCK\x10\x02\x12\x14\n\x10UI_ALERT_ENABLED\x10\x04\x12\x15\n\x11UI_BANNER_ENABLED\x10\x08\x12\x1a\n\x16UI_IS_CLOCKFACE_ANALOG\x10\x10\"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\"\xdc\x01\n\nNodeFilter\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\thops_away\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x16\n\x07\x63hannel\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\"l\n\x05\x46lags\x12\x0f\n\x0b\x46ILTER_NONE\x10\x00\x12\x12\n\x0e\x46ILTER_UNKNOWN\x10\x01\x12\x12\n\x0e\x46ILTER_OFFLINE\x10\x02\x12\x15\n\x11\x46ILTER_PUBLIC_KEY\x10\x04\x12\x13\n\x0f\x46ILTER_POSITION\x10\x08\"\xb4\x01\n\rNodeHighlight\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x10\"s\n\x05\x46lags\x12\x12\n\x0eHIGHLIGHT_NONE\x10\x00\x12\x12\n\x0eHIGHLIGHT_CHAT\x10\x01\x12\x16\n\x12HIGHLIGHT_POSITION\x10\x02\x12\x17\n\x13HIGHLIGHT_TELEMETRY\x10\x04\x12\x11\n\rHIGHLIGHT_IAQ\x10\x08\"D\n\x08GeoPoint\x12\x13\n\x04zoom\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08latitude\x18\x02 \x01(\x0f\x12\x11\n\tlongitude\x18\x03 \x01(\x0f\"\\\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.device_ui_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _DEVICEUICONFIG.fields_by_name['screen_brightness']._options = None - _DEVICEUICONFIG.fields_by_name['screen_brightness']._serialized_options = b'\222?\0028\010' - _DEVICEUICONFIG.fields_by_name['screen_timeout']._options = None - _DEVICEUICONFIG.fields_by_name['screen_timeout']._serialized_options = b'\222?\0028\020' - _DEVICEUICONFIG.fields_by_name['ring_tone_id']._options = None - _DEVICEUICONFIG.fields_by_name['ring_tone_id']._serialized_options = b'\222?\0028\010' - _DEVICEUICONFIG.fields_by_name['calibration_data']._options = None - _DEVICEUICONFIG.fields_by_name['calibration_data']._serialized_options = b'\222?\002\010\020' - _DEVICEUICONFIG.fields_by_name['compass_mode']._options = None - _DEVICEUICONFIG.fields_by_name['compass_mode']._serialized_options = b'\222?\0028\010' - _DEVICEUICONFIG.fields_by_name['gps_format']._options = None - _DEVICEUICONFIG.fields_by_name['gps_format']._serialized_options = b'\222?\0028\010' - _NODEFILTER.fields_by_name['hops_away']._options = None - _NODEFILTER.fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' - _NODEFILTER.fields_by_name['node_name']._options = None - _NODEFILTER.fields_by_name['node_name']._serialized_options = b'\222?\002\010\020' - _NODEFILTER.fields_by_name['channel']._options = None - _NODEFILTER.fields_by_name['channel']._serialized_options = b'\222?\0028\010' - _NODEHIGHLIGHT.fields_by_name['node_name']._options = None - _NODEHIGHLIGHT.fields_by_name['node_name']._serialized_options = b'\222?\002\010\020' - _GEOPOINT.fields_by_name['zoom']._options = None - _GEOPOINT.fields_by_name['zoom']._serialized_options = b'\222?\0028\010' - _MAP.fields_by_name['style']._options = None - _MAP.fields_by_name['style']._serialized_options = b'\222?\002\010\024' - _globals['_COMPASSMODE']._serialized_start=1397 - _globals['_COMPASSMODE']._serialized_end=1459 - _globals['_THEME']._serialized_start=1461 - _globals['_THEME']._serialized_end=1498 - _globals['_LANGUAGE']._serialized_start=1501 - _globals['_LANGUAGE']._serialized_end=1853 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_DEVICEUICONFIG'].fields_by_name['screen_brightness']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['screen_brightness']._serialized_options = b'\222?\0028\010' + _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout']._serialized_options = b'\222?\0028\020' + _globals['_DEVICEUICONFIG'].fields_by_name['flags']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_DEVICEUICONFIG'].fields_by_name['ring_tone_id']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['ring_tone_id']._serialized_options = b'\222?\0028\010' + _globals['_DEVICEUICONFIG'].fields_by_name['calibration_data']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['calibration_data']._serialized_options = b'\222?\002\010\020' + _globals['_DEVICEUICONFIG'].fields_by_name['compass_mode']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['compass_mode']._serialized_options = b'\222?\0028\010' + _globals['_DEVICEUICONFIG'].fields_by_name['gps_format']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['gps_format']._serialized_options = b'\222?\0028\010' + _globals['_NODEFILTER'].fields_by_name['flags']._options = None + _globals['_NODEFILTER'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_NODEFILTER'].fields_by_name['hops_away']._options = None + _globals['_NODEFILTER'].fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' + _globals['_NODEFILTER'].fields_by_name['node_name']._options = None + _globals['_NODEFILTER'].fields_by_name['node_name']._serialized_options = b'\222?\002\010\020' + _globals['_NODEFILTER'].fields_by_name['channel']._options = None + _globals['_NODEFILTER'].fields_by_name['channel']._serialized_options = b'\222?\0028\010' + _globals['_NODEHIGHLIGHT'].fields_by_name['flags']._options = None + _globals['_NODEHIGHLIGHT'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_NODEHIGHLIGHT'].fields_by_name['node_name']._options = None + _globals['_NODEHIGHLIGHT'].fields_by_name['node_name']._serialized_options = b'\222?\002\010\020' + _globals['_GEOPOINT'].fields_by_name['zoom']._options = None + _globals['_GEOPOINT'].fields_by_name['zoom']._serialized_options = b'\222?\0028\010' + _globals['_MAP'].fields_by_name['style']._options = None + _globals['_MAP'].fields_by_name['style']._serialized_options = b'\222?\002\010\024' + _globals['_COMPASSMODE']._serialized_start=1516 + _globals['_COMPASSMODE']._serialized_end=1578 + _globals['_THEME']._serialized_start=1580 + _globals['_THEME']._serialized_end=1617 + _globals['_LANGUAGE']._serialized_start=1620 + _globals['_LANGUAGE']._serialized_end=1972 _globals['_DEVICEUICONFIG']._serialized_start=95 - _globals['_DEVICEUICONFIG']._serialized_end=904 - _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_start=818 - _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_end=904 - _globals['_NODEFILTER']._serialized_start=907 - _globals['_NODEFILTER']._serialized_end=1095 - _globals['_NODEHIGHLIGHT']._serialized_start=1098 - _globals['_NODEHIGHLIGHT']._serialized_end=1231 - _globals['_GEOPOINT']._serialized_start=1233 - _globals['_GEOPOINT']._serialized_end=1301 - _globals['_MAP']._serialized_start=1303 - _globals['_MAP']._serialized_end=1395 + _globals['_DEVICEUICONFIG']._serialized_end=944 + _globals['_DEVICEUICONFIG_FLAGS']._serialized_start=721 + _globals['_DEVICEUICONFIG_FLAGS']._serialized_end=856 + _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_start=858 + _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_end=944 + _globals['_NODEFILTER']._serialized_start=947 + _globals['_NODEFILTER']._serialized_end=1167 + _globals['_NODEFILTER_FLAGS']._serialized_start=1059 + _globals['_NODEFILTER_FLAGS']._serialized_end=1167 + _globals['_NODEHIGHLIGHT']._serialized_start=1170 + _globals['_NODEHIGHLIGHT']._serialized_end=1350 + _globals['_NODEHIGHLIGHT_FLAGS']._serialized_start=1235 + _globals['_NODEHIGHLIGHT_FLAGS']._serialized_end=1350 + _globals['_GEOPOINT']._serialized_start=1352 + _globals['_GEOPOINT']._serialized_end=1420 + _globals['_MAP']._serialized_start=1422 + _globals['_MAP']._serialized_end=1514 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index f88054f39..371e4f940 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -3,26 +3,26 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _CompassMode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _CompassModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CompassMode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _CompassModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_CompassMode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor DYNAMIC: _CompassMode.ValueType # 0 """ Compass with dynamic ring and heading @@ -50,14 +50,14 @@ FREEZE_HEADING: CompassMode.ValueType # 2 """ Compass with heading and freeze option """ -global___CompassMode = CompassMode +Global___CompassMode: _TypeAlias = CompassMode # noqa: Y015 class _Theme: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _ThemeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Theme.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _ThemeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Theme.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor DARK: _Theme.ValueType # 0 """ Dark @@ -85,14 +85,14 @@ RED: Theme.ValueType # 2 """ Red """ -global___Theme = Theme +Global___Theme: _TypeAlias = Theme # noqa: Y015 class _Language: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _LanguageEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Language.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _LanguageEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Language.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor ENGLISH: _Language.ValueType # 0 """ English @@ -291,22 +291,62 @@ TRADITIONAL_CHINESE: Language.ValueType # 31 """ Traditional Chinese (experimental) """ -global___Language = Language +Global___Language: _TypeAlias = Language # noqa: Y015 -@typing.final -class DeviceUIConfig(google.protobuf.message.Message): +@_typing.final +class DeviceUIConfig(_message.Message): """ - Protobuf structures for device-ui persistency + Protobuf structures for device-ui persistency: a storage container for the MUI, a + separate client on the device API. The node persists it and hands it back through + get_ui_config and store_ui_config, but only the MUI reads it, so a setting here is + the MUI's own and not a duplicate of the node's config. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceUIConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + UI_NONE: DeviceUIConfig._Flags.ValueType # 0 + """Nothing enabled""" + UI_SCREEN_LOCK: DeviceUIConfig._Flags.ValueType # 1 + """The screen is locked""" + UI_SETTINGS_LOCK: DeviceUIConfig._Flags.ValueType # 2 + """The settings are locked""" + UI_ALERT_ENABLED: DeviceUIConfig._Flags.ValueType # 4 + """Audible message alerts are enabled""" + UI_BANNER_ENABLED: DeviceUIConfig._Flags.ValueType # 8 + """Banners are enabled""" + UI_IS_CLOCKFACE_ANALOG: DeviceUIConfig._Flags.ValueType # 16 + """Draw the clockface as analog rather than digital""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Device UI toggles: a bitwise OR of Flags values. + """ + + UI_NONE: DeviceUIConfig.Flags.ValueType # 0 + """Nothing enabled""" + UI_SCREEN_LOCK: DeviceUIConfig.Flags.ValueType # 1 + """The screen is locked""" + UI_SETTINGS_LOCK: DeviceUIConfig.Flags.ValueType # 2 + """The settings are locked""" + UI_ALERT_ENABLED: DeviceUIConfig.Flags.ValueType # 4 + """Audible message alerts are enabled""" + UI_BANNER_ENABLED: DeviceUIConfig.Flags.ValueType # 8 + """Banners are enabled""" + UI_IS_CLOCKFACE_ANALOG: DeviceUIConfig.Flags.ValueType # 16 + """Draw the clockface as analog rather than digital""" class _GpsCoordinateFormat: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _GpsCoordinateFormatEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DeviceUIConfig._GpsCoordinateFormat.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _GpsCoordinateFormatEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DeviceUIConfig._GpsCoordinateFormat.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor DEC: DeviceUIConfig._GpsCoordinateFormat.ValueType # 0 """ GPS coordinates are displayed in the normal decimal degrees format: @@ -386,93 +426,84 @@ class DeviceUIConfig(google.protobuf.message.Message): Described here: https://en.wikipedia.org/wiki/Maidenhead_Locator_System """ - VERSION_FIELD_NUMBER: builtins.int - SCREEN_BRIGHTNESS_FIELD_NUMBER: builtins.int - SCREEN_TIMEOUT_FIELD_NUMBER: builtins.int - SCREEN_LOCK_FIELD_NUMBER: builtins.int - SETTINGS_LOCK_FIELD_NUMBER: builtins.int - PIN_CODE_FIELD_NUMBER: builtins.int - THEME_FIELD_NUMBER: builtins.int - ALERT_ENABLED_FIELD_NUMBER: builtins.int - BANNER_ENABLED_FIELD_NUMBER: builtins.int - RING_TONE_ID_FIELD_NUMBER: builtins.int - LANGUAGE_FIELD_NUMBER: builtins.int - NODE_FILTER_FIELD_NUMBER: builtins.int - NODE_HIGHLIGHT_FIELD_NUMBER: builtins.int - CALIBRATION_DATA_FIELD_NUMBER: builtins.int - MAP_DATA_FIELD_NUMBER: builtins.int - COMPASS_MODE_FIELD_NUMBER: builtins.int - SCREEN_RGB_COLOR_FIELD_NUMBER: builtins.int - IS_CLOCKFACE_ANALOG_FIELD_NUMBER: builtins.int - GPS_FORMAT_FIELD_NUMBER: builtins.int - version: builtins.int + VERSION_FIELD_NUMBER: _builtins.int + SCREEN_BRIGHTNESS_FIELD_NUMBER: _builtins.int + SCREEN_TIMEOUT_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + PIN_CODE_FIELD_NUMBER: _builtins.int + THEME_FIELD_NUMBER: _builtins.int + RING_TONE_ID_FIELD_NUMBER: _builtins.int + LANGUAGE_FIELD_NUMBER: _builtins.int + NODE_FILTER_FIELD_NUMBER: _builtins.int + NODE_HIGHLIGHT_FIELD_NUMBER: _builtins.int + CALIBRATION_DATA_FIELD_NUMBER: _builtins.int + MAP_DATA_FIELD_NUMBER: _builtins.int + COMPASS_MODE_FIELD_NUMBER: _builtins.int + SCREEN_RGB_COLOR_FIELD_NUMBER: _builtins.int + GPS_FORMAT_FIELD_NUMBER: _builtins.int + version: _builtins.int """ A version integer used to invalidate saved files when we make incompatible changes. """ - screen_brightness: builtins.int + screen_brightness: _builtins.int """ TFT display brightness 1..255 """ - screen_timeout: builtins.int + screen_timeout: _builtins.int """ Screen timeout 0..900 """ - screen_lock: builtins.bool + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + pin_code: _builtins.int """ - Screen/Settings lock enabled + Screen/Settings unlock code """ - settings_lock: builtins.bool - pin_code: builtins.int - theme: global___Theme.ValueType + theme: Global___Theme.ValueType """ Color theme """ - alert_enabled: builtins.bool + ring_tone_id: _builtins.int """ - Audible message, banner and ring tone + Ring tone selection """ - banner_enabled: builtins.bool - ring_tone_id: builtins.int - language: global___Language.ValueType + language: Global___Language.ValueType """ Localization """ - calibration_data: builtins.bytes + calibration_data: _builtins.bytes """ 8 integers for screen calibration data """ - compass_mode: global___CompassMode.ValueType + compass_mode: Global___CompassMode.ValueType """ Compass mode """ - screen_rgb_color: builtins.int + screen_rgb_color: _builtins.int """ RGB color for BaseUI 0xRRGGBB format, e.g. 0xFF0000 for red """ - is_clockface_analog: builtins.bool - """ - Clockface analog style - true for analog clockface, false for digital clockface - """ - gps_format: global___DeviceUIConfig.GpsCoordinateFormat.ValueType + gps_format: Global___DeviceUIConfig.GpsCoordinateFormat.ValueType """ How the GPS coordinates are formatted on the OLED screen. """ - @property - def node_filter(self) -> global___NodeFilter: + @_builtins.property + def node_filter(self) -> Global___NodeFilter: """ Node list filter """ - @property - def node_highlight(self) -> global___NodeHighlight: + @_builtins.property + def node_highlight(self) -> Global___NodeHighlight: """ Node list highlightening """ - @property - def map_data(self) -> global___Map: + @_builtins.property + def map_data(self) -> Global___Map: """ Map related data """ @@ -480,174 +511,218 @@ class DeviceUIConfig(google.protobuf.message.Message): def __init__( self, *, - version: builtins.int = ..., - screen_brightness: builtins.int = ..., - screen_timeout: builtins.int = ..., - screen_lock: builtins.bool = ..., - settings_lock: builtins.bool = ..., - pin_code: builtins.int = ..., - theme: global___Theme.ValueType = ..., - alert_enabled: builtins.bool = ..., - banner_enabled: builtins.bool = ..., - ring_tone_id: builtins.int = ..., - language: global___Language.ValueType = ..., - node_filter: global___NodeFilter | None = ..., - node_highlight: global___NodeHighlight | None = ..., - calibration_data: builtins.bytes = ..., - map_data: global___Map | None = ..., - compass_mode: global___CompassMode.ValueType = ..., - screen_rgb_color: builtins.int = ..., - is_clockface_analog: builtins.bool = ..., - gps_format: global___DeviceUIConfig.GpsCoordinateFormat.ValueType = ..., + version: _builtins.int = ..., + screen_brightness: _builtins.int = ..., + screen_timeout: _builtins.int = ..., + flags: _builtins.int = ..., + pin_code: _builtins.int = ..., + theme: Global___Theme.ValueType = ..., + ring_tone_id: _builtins.int = ..., + language: Global___Language.ValueType = ..., + node_filter: Global___NodeFilter | None = ..., + node_highlight: Global___NodeHighlight | None = ..., + calibration_data: _builtins.bytes = ..., + map_data: Global___Map | None = ..., + compass_mode: Global___CompassMode.ValueType = ..., + screen_rgb_color: _builtins.int = ..., + gps_format: Global___DeviceUIConfig.GpsCoordinateFormat.ValueType = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["alert_enabled", b"alert_enabled", "banner_enabled", b"banner_enabled", "calibration_data", b"calibration_data", "compass_mode", b"compass_mode", "gps_format", b"gps_format", "is_clockface_analog", b"is_clockface_analog", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_lock", b"screen_lock", "screen_rgb_color", b"screen_rgb_color", "screen_timeout", b"screen_timeout", "settings_lock", b"settings_lock", "theme", b"theme", "version", b"version"]) -> None: ... - -global___DeviceUIConfig = DeviceUIConfig + _HasFieldArgType: _TypeAlias = _typing.Literal["map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["calibration_data", b"calibration_data", "compass_mode", b"compass_mode", "flags", b"flags", "gps_format", b"gps_format", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_rgb_color", b"screen_rgb_color", "screen_timeout", b"screen_timeout", "theme", b"theme", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___DeviceUIConfig: _TypeAlias = DeviceUIConfig # noqa: Y015 + +@_typing.final +class NodeFilter(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[NodeFilter._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + FILTER_NONE: NodeFilter._Flags.ValueType # 0 + """Nothing filtered in""" + FILTER_UNKNOWN: NodeFilter._Flags.ValueType # 1 + """Include unknown nodes""" + FILTER_OFFLINE: NodeFilter._Flags.ValueType # 2 + """Include offline nodes""" + FILTER_PUBLIC_KEY: NodeFilter._Flags.ValueType # 4 + """Include nodes without a public key""" + FILTER_POSITION: NodeFilter._Flags.ValueType # 8 + """Include nodes without a position""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Which node classes pass the filter: a bitwise OR of Flags values. + """ -@typing.final -class NodeFilter(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor + FILTER_NONE: NodeFilter.Flags.ValueType # 0 + """Nothing filtered in""" + FILTER_UNKNOWN: NodeFilter.Flags.ValueType # 1 + """Include unknown nodes""" + FILTER_OFFLINE: NodeFilter.Flags.ValueType # 2 + """Include offline nodes""" + FILTER_PUBLIC_KEY: NodeFilter.Flags.ValueType # 4 + """Include nodes without a public key""" + FILTER_POSITION: NodeFilter.Flags.ValueType # 8 + """Include nodes without a position""" - UNKNOWN_SWITCH_FIELD_NUMBER: builtins.int - OFFLINE_SWITCH_FIELD_NUMBER: builtins.int - PUBLIC_KEY_SWITCH_FIELD_NUMBER: builtins.int - HOPS_AWAY_FIELD_NUMBER: builtins.int - POSITION_SWITCH_FIELD_NUMBER: builtins.int - NODE_NAME_FIELD_NUMBER: builtins.int - CHANNEL_FIELD_NUMBER: builtins.int - unknown_switch: builtins.bool - """ - Filter unknown nodes - """ - offline_switch: builtins.bool + FLAGS_FIELD_NUMBER: _builtins.int + HOPS_AWAY_FIELD_NUMBER: _builtins.int + NODE_NAME_FIELD_NUMBER: _builtins.int + CHANNEL_FIELD_NUMBER: _builtins.int + flags: _builtins.int """ - Filter offline nodes + Bitwise OR of Flags values. """ - public_key_switch: builtins.bool - """ - Filter nodes w/o public key - """ - hops_away: builtins.int + hops_away: _builtins.int """ Filter based on hops away """ - position_switch: builtins.bool - """ - Filter nodes w/o position - """ - node_name: builtins.str + node_name: _builtins.str """ Filter nodes by matching name string """ - channel: builtins.int + channel: _builtins.int """ Filter based on channel """ def __init__( self, *, - unknown_switch: builtins.bool = ..., - offline_switch: builtins.bool = ..., - public_key_switch: builtins.bool = ..., - hops_away: builtins.int = ..., - position_switch: builtins.bool = ..., - node_name: builtins.str = ..., - channel: builtins.int = ..., + flags: _builtins.int = ..., + hops_away: _builtins.int = ..., + node_name: _builtins.str = ..., + channel: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["channel", b"channel", "hops_away", b"hops_away", "node_name", b"node_name", "offline_switch", b"offline_switch", "position_switch", b"position_switch", "public_key_switch", b"public_key_switch", "unknown_switch", b"unknown_switch"]) -> None: ... - -global___NodeFilter = NodeFilter + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["channel", b"channel", "flags", b"flags", "hops_away", b"hops_away", "node_name", b"node_name"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeFilter: _TypeAlias = NodeFilter # noqa: Y015 + +@_typing.final +class NodeHighlight(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[NodeHighlight._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + HIGHLIGHT_NONE: NodeHighlight._Flags.ValueType # 0 + """Nothing highlighted""" + HIGHLIGHT_CHAT: NodeHighlight._Flags.ValueType # 1 + """Highlight nodes with active chat""" + HIGHLIGHT_POSITION: NodeHighlight._Flags.ValueType # 2 + """Highlight nodes with a position""" + HIGHLIGHT_TELEMETRY: NodeHighlight._Flags.ValueType # 4 + """Highlight nodes with telemetry data""" + HIGHLIGHT_IAQ: NodeHighlight._Flags.ValueType # 8 + """Highlight nodes with IAQ data""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Which node activity to highlight: a bitwise OR of Flags values. + """ -@typing.final -class NodeHighlight(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor + HIGHLIGHT_NONE: NodeHighlight.Flags.ValueType # 0 + """Nothing highlighted""" + HIGHLIGHT_CHAT: NodeHighlight.Flags.ValueType # 1 + """Highlight nodes with active chat""" + HIGHLIGHT_POSITION: NodeHighlight.Flags.ValueType # 2 + """Highlight nodes with a position""" + HIGHLIGHT_TELEMETRY: NodeHighlight.Flags.ValueType # 4 + """Highlight nodes with telemetry data""" + HIGHLIGHT_IAQ: NodeHighlight.Flags.ValueType # 8 + """Highlight nodes with IAQ data""" - CHAT_SWITCH_FIELD_NUMBER: builtins.int - POSITION_SWITCH_FIELD_NUMBER: builtins.int - TELEMETRY_SWITCH_FIELD_NUMBER: builtins.int - IAQ_SWITCH_FIELD_NUMBER: builtins.int - NODE_NAME_FIELD_NUMBER: builtins.int - chat_switch: builtins.bool + FLAGS_FIELD_NUMBER: _builtins.int + NODE_NAME_FIELD_NUMBER: _builtins.int + flags: _builtins.int """ - Hightlight nodes w/ active chat + Bitwise OR of Flags values. """ - position_switch: builtins.bool - """ - Highlight nodes w/ position - """ - telemetry_switch: builtins.bool - """ - Highlight nodes w/ telemetry data - """ - iaq_switch: builtins.bool - """ - Highlight nodes w/ iaq data - """ - node_name: builtins.str + node_name: _builtins.str """ Highlight nodes by matching name string """ def __init__( self, *, - chat_switch: builtins.bool = ..., - position_switch: builtins.bool = ..., - telemetry_switch: builtins.bool = ..., - iaq_switch: builtins.bool = ..., - node_name: builtins.str = ..., + flags: _builtins.int = ..., + node_name: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["chat_switch", b"chat_switch", "iaq_switch", b"iaq_switch", "node_name", b"node_name", "position_switch", b"position_switch", "telemetry_switch", b"telemetry_switch"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "node_name", b"node_name"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___NodeHighlight = NodeHighlight +Global___NodeHighlight: _TypeAlias = NodeHighlight # noqa: Y015 -@typing.final -class GeoPoint(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class GeoPoint(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - ZOOM_FIELD_NUMBER: builtins.int - LATITUDE_FIELD_NUMBER: builtins.int - LONGITUDE_FIELD_NUMBER: builtins.int - zoom: builtins.int + ZOOM_FIELD_NUMBER: _builtins.int + LATITUDE_FIELD_NUMBER: _builtins.int + LONGITUDE_FIELD_NUMBER: _builtins.int + zoom: _builtins.int """ Zoom level """ - latitude: builtins.int + latitude: _builtins.int """ - Coordinate: latitude + Coordinate: latitude, in 1e-7 degrees. Same units as Position. + + sfixed32 and not a varint: the value spans +/-900,000,000, where a varint + costs five bytes even when positive and ten when negative. """ - longitude: builtins.int + longitude: _builtins.int """ - Coordinate: longitude + Coordinate: longitude, in 1e-7 degrees. Same units as Position. """ def __init__( self, *, - zoom: builtins.int = ..., - latitude: builtins.int = ..., - longitude: builtins.int = ..., + zoom: _builtins.int = ..., + latitude: _builtins.int = ..., + longitude: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["latitude", b"latitude", "longitude", b"longitude", "zoom", b"zoom"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["latitude", b"latitude", "longitude", b"longitude", "zoom", b"zoom"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___GeoPoint = GeoPoint +Global___GeoPoint: _TypeAlias = GeoPoint # noqa: Y015 -@typing.final -class Map(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class Map(_message.Message): + DESCRIPTOR: _descriptor.Descriptor - HOME_FIELD_NUMBER: builtins.int - STYLE_FIELD_NUMBER: builtins.int - FOLLOW_GPS_FIELD_NUMBER: builtins.int - style: builtins.str + HOME_FIELD_NUMBER: _builtins.int + STYLE_FIELD_NUMBER: _builtins.int + FOLLOW_GPS_FIELD_NUMBER: _builtins.int + style: _builtins.str """ Map tile style """ - follow_gps: builtins.bool + follow_gps: _builtins.bool """ Map scroll follows GPS """ - @property - def home(self) -> global___GeoPoint: + @_builtins.property + def home(self) -> Global___GeoPoint: """ Home coordinates """ @@ -655,11 +730,14 @@ class Map(google.protobuf.message.Message): def __init__( self, *, - home: global___GeoPoint | None = ..., - style: builtins.str = ..., - follow_gps: builtins.bool = ..., + home: Global___GeoPoint | None = ..., + style: _builtins.str = ..., + follow_gps: _builtins.bool = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["home", b"home"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["follow_gps", b"follow_gps", "home", b"home", "style", b"style"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["home", b"home"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["follow_gps", b"follow_gps", "home", b"home", "style", b"style"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Map = Map +Global___Map: _TypeAlias = Map # noqa: Y015 diff --git a/meshtastic/protobuf/deviceonly_legacy_pb2.py b/meshtastic/protobuf/deviceonly_legacy_pb2.py deleted file mode 100644 index 61d10e5b0..000000000 --- a/meshtastic/protobuf/deviceonly_legacy_pb2.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- 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 deleted file mode 100644 index 4452acff7..000000000 --- a/meshtastic/protobuf/deviceonly_legacy_pb2.pyi +++ /dev/null @@ -1,106 +0,0 @@ -""" -@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 9118afafb..b732f79bf 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/deviceonly.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,86 +12,82 @@ _sym_db = _symbol_database.Default() +from meshtastic.protobuf import api_pb2 as meshtastic_dot_protobuf_dot_api__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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import discovery_pb2 as meshtastic_dot_protobuf_dot_discovery__pb2 from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2 -from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 +from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 +from meshtastic.protobuf import storeforward_pb2 as meshtastic_dot_protobuf_dot_storeforward__pb2 from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 +from meshtastic.protobuf import wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a 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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a\x1dmeshtastic/protobuf/api.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a#meshtastic/protobuf/discovery.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a&meshtastic/protobuf/storeforward.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb9\x01\n\x0cPositionLite\x12\x17\n\x0flatitude_scaled\x18\x01 \x01(\x11\x12\x18\n\x10longitude_scaled\x18\x02 \x01(\x11\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x11\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x1d\n\x0eprecision_bits\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\"\x9d\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x17\n\x08hw_model\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12.\n\x04role\x18\x03 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x0b\n\x03snr\x18\x04 \x01(\x11\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1d\n\thops_away\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x17\n\x08next_hop\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x62itfield\x18\n \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tlong_name\x18\x0b \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x0c \x01(\tB\x05\x92?\x02\x08\x05\x12\x12\n\nrecord_seq\x18\r \x01(\r\x12;\n\x0brecord_tier\x18\x0e \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\x05\x92?\x02\x38\x08\x42\x0c\n\n_hops_away\"\xc0\x02\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12T\n\x19node_remote_hardware_pins\x18\x03 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x10\x12\x0f\n\x07version\x18\x04 \x01(\r\x12\x46\n\nsf_cursors\x18\x05 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nrecord_seq\x18\x06 \x01(\r\x12\x12\n\nrecord_crc\x18\x07 \x01(\x07\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"W\n\x11NodeReadingsEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x35\n\x08readings\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadings\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xa7\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\x12i\n\x08readings\x18\x06 \x03(\x0b\x32&.meshtastic.protobuf.NodeReadingsEntryB/\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\x10\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.deviceonly_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010' - _USERLITE.fields_by_name['macaddr']._options = None - _USERLITE.fields_by_name['macaddr']._serialized_options = b'\030\001\222?\004\010\006x\001' - _USERLITE.fields_by_name['long_name']._options = None - _USERLITE.fields_by_name['long_name']._serialized_options = b'\222?\002\010(' - _USERLITE.fields_by_name['short_name']._options = None - _USERLITE.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' - _USERLITE.fields_by_name['public_key']._options = None - _USERLITE.fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' - _NODEINFOLITE.fields_by_name['channel']._options = None - _NODEINFOLITE.fields_by_name['channel']._serialized_options = b'\222?\0028\010' - _NODEINFOLITE.fields_by_name['hops_away']._options = None - _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 - _DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001' - _DEVICESTATE.fields_by_name['did_gps_reset']._options = None - _DEVICESTATE.fields_by_name['did_gps_reset']._serialized_options = b'\030\001' - _DEVICESTATE.fields_by_name['node_remote_hardware_pins']._options = None - _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=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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010' + _globals['_POSITIONLITE'].fields_by_name['precision_bits']._options = None + _globals['_POSITIONLITE'].fields_by_name['precision_bits']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFOLITE'].fields_by_name['hw_model']._options = None + _globals['_NODEINFOLITE'].fields_by_name['hw_model']._serialized_options = b'\222?\0028\020' + _globals['_NODEINFOLITE'].fields_by_name['role']._options = None + _globals['_NODEINFOLITE'].fields_by_name['role']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFOLITE'].fields_by_name['channel']._options = None + _globals['_NODEINFOLITE'].fields_by_name['channel']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFOLITE'].fields_by_name['public_key']._options = None + _globals['_NODEINFOLITE'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _globals['_NODEINFOLITE'].fields_by_name['hops_away']._options = None + _globals['_NODEINFOLITE'].fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFOLITE'].fields_by_name['next_hop']._options = None + _globals['_NODEINFOLITE'].fields_by_name['next_hop']._serialized_options = b'\222?\0028\010' + _globals['_NODEINFOLITE'].fields_by_name['bitfield']._options = None + _globals['_NODEINFOLITE'].fields_by_name['bitfield']._serialized_options = b'\222?\0028 ' + _globals['_NODEINFOLITE'].fields_by_name['long_name']._options = None + _globals['_NODEINFOLITE'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _globals['_NODEINFOLITE'].fields_by_name['short_name']._options = None + _globals['_NODEINFOLITE'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_NODEINFOLITE'].fields_by_name['record_tier']._options = None + _globals['_NODEINFOLITE'].fields_by_name['record_tier']._serialized_options = b'\222?\0028\010' + _globals['_DEVICESTATE'].fields_by_name['node_remote_hardware_pins']._options = None + _globals['_DEVICESTATE'].fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\020' + _globals['_DEVICESTATE'].fields_by_name['sf_cursors']._options = None + _globals['_DEVICESTATE'].fields_by_name['sf_cursors']._serialized_options = b'\222?\002\020\021' + _globals['_NODEDATABASE'].fields_by_name['nodes']._options = None + _globals['_NODEDATABASE'].fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector' + _globals['_NODEDATABASE'].fields_by_name['positions']._options = None + _globals['_NODEDATABASE'].fields_by_name['positions']._serialized_options = b'\222?,\222\001)std::vector' + _globals['_NODEDATABASE'].fields_by_name['telemetry']._options = None + _globals['_NODEDATABASE'].fields_by_name['telemetry']._serialized_options = b'\222?-\222\001*std::vector' + _globals['_NODEDATABASE'].fields_by_name['status']._options = None + _globals['_NODEDATABASE'].fields_by_name['status']._serialized_options = b'\222?*\222\001\'std::vector' + _globals['_NODEDATABASE'].fields_by_name['readings']._options = None + _globals['_NODEDATABASE'].fields_by_name['readings']._serialized_options = b'\222?,\222\001)std::vector' + _globals['_CHANNELFILE'].fields_by_name['channels']._options = None + _globals['_CHANNELFILE'].fields_by_name['channels']._serialized_options = b'\222?\002\020\020' + _globals['_POSITIONLITE']._serialized_start=420 + _globals['_POSITIONLITE']._serialized_end=605 + _globals['_NODEINFOLITE']._serialized_start=608 + _globals['_NODEINFOLITE']._serialized_end=1021 + _globals['_DEVICESTATE']._serialized_start=1024 + _globals['_DEVICESTATE']._serialized_end=1344 + _globals['_NODEPOSITIONENTRY']._serialized_start=1346 + _globals['_NODEPOSITIONENTRY']._serialized_end=1431 + _globals['_NODETELEMETRYENTRY']._serialized_start=1433 + _globals['_NODETELEMETRYENTRY']._serialized_end=1526 + _globals['_NODEREADINGSENTRY']._serialized_start=1528 + _globals['_NODEREADINGSENTRY']._serialized_end=1615 + _globals['_NODESTATUSENTRY']._serialized_start=1617 + _globals['_NODESTATUSENTRY']._serialized_end=1699 + _globals['_NODEDATABASE']._serialized_start=1702 + _globals['_NODEDATABASE']._serialized_end=2253 + _globals['_CHANNELFILE']._serialized_start=2255 + _globals['_CHANNELFILE']._serialized_end=2340 + _globals['_BACKUPPREFERENCES']._serialized_start=2343 + _globals['_BACKUPPREFERENCES']._serialized_end=2605 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index 885b7f14c..ffe192f31 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -3,499 +3,470 @@ isort:skip_file """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.message -import meshtastic.protobuf.channel_pb2 -import meshtastic.protobuf.config_pb2 -import meshtastic.protobuf.localonly_pb2 -import meshtastic.protobuf.mesh_pb2 -import meshtastic.protobuf.telemetry_pb2 -import typing - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -@typing.final -class PositionLite(google.protobuf.message.Message): +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from . import api_pb2 as _api_pb2 +from . import channel_pb2 as _channel_pb2 +from . import common_pb2 as _common_pb2 +from . import discovery_pb2 as _discovery_pb2 +from . import localonly_pb2 as _localonly_pb2 +from . import module_config_pb2 as _module_config_pb2 +from . import storeforward_pb2 as _storeforward_pb2 +from . import telemetry_pb2 as _telemetry_pb2 +from . import wire_pb2 as _wire_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class PositionLite(_message.Message): """ Position with static location information only for NodeDBLite """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - ALTITUDE_FIELD_NUMBER: builtins.int - TIME_FIELD_NUMBER: builtins.int - LOCATION_SOURCE_FIELD_NUMBER: builtins.int - PRECISION_BITS_FIELD_NUMBER: builtins.int - latitude_i: builtins.int + LATITUDE_SCALED_FIELD_NUMBER: _builtins.int + LONGITUDE_SCALED_FIELD_NUMBER: _builtins.int + ALTITUDE_FIELD_NUMBER: _builtins.int + TIME_FIELD_NUMBER: _builtins.int + LOCATION_SOURCE_FIELD_NUMBER: _builtins.int + PRECISION_BITS_FIELD_NUMBER: _builtins.int + latitude_scaled: _builtins.int """ - The new preferred location encoding, multiply by 1e-7 to get degrees - in floating point + Latitude, scaled exactly as Position.latitude_scaled is, so a stored position + keeps the encoding it arrived in and costs flash in proportion to the precision + it actually carries. Storage never keeps the unpacked form. """ - longitude_i: builtins.int + longitude_scaled: _builtins.int """ - TODO: REPLACE + Longitude, scaled exactly as Position.longitude_scaled is. """ - altitude: builtins.int + altitude: _builtins.int """ In meters above MSL (but see issue #359) """ - time: builtins.int + time: _builtins.int """ - This is usually not sent over the mesh (to save space), but it is sent - from the phone so that the local device can set its RTC If it is sent over - the mesh (because there are devices on the mesh without GPS), it will only - be sent by devices which has a hardware GPS clock. - seconds since 1970 + Epoch seconds of this position, as Position.time. Kept from the previous report + when a sender leaves it out. """ - location_source: meshtastic.protobuf.mesh_pb2.Position.LocSource.ValueType + location_source: _common_pb2.LocSource.ValueType """ - TODO: REPLACE + How the position was obtained (manual, onboard GPS, or external GPS) """ - precision_bits: builtins.int + precision_bits: _builtins.int """ Indicates the bits of precision set by the sending node """ def __init__( self, *, - latitude_i: builtins.int = ..., - longitude_i: builtins.int = ..., - altitude: builtins.int = ..., - time: builtins.int = ..., - location_source: meshtastic.protobuf.mesh_pb2.Position.LocSource.ValueType = ..., - precision_bits: builtins.int = ..., + latitude_scaled: _builtins.int = ..., + longitude_scaled: _builtins.int = ..., + altitude: _builtins.int = ..., + time: _builtins.int = ..., + location_source: _common_pb2.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", "precision_bits", b"precision_bits", "time", b"time"]) -> None: ... - -global___PositionLite = PositionLite - -@typing.final -class UserLite(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - MACADDR_FIELD_NUMBER: builtins.int - LONG_NAME_FIELD_NUMBER: builtins.int - SHORT_NAME_FIELD_NUMBER: builtins.int - HW_MODEL_FIELD_NUMBER: builtins.int - IS_LICENSED_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - PUBLIC_KEY_FIELD_NUMBER: builtins.int - IS_UNMESSAGABLE_FIELD_NUMBER: builtins.int - macaddr: builtins.bytes - """ - This is the addr of the radio. - """ - long_name: builtins.str - """ - A full name for this user, i.e. "Kevin Hester" - """ - short_name: builtins.str - """ - A VERY short name, ideally two characters. - Suitable for a tiny OLED screen - """ - hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType - """ - TBEAM, HELTEC, etc... - Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. - Apps will still need the string here for older builds - (so OTA update can find the right image), but if the enum is available it will be used instead. - """ - is_licensed: builtins.bool - """ - In some regions Ham radio operators have different bandwidth limitations than others. - If this user is a licensed operator, set this flag. - Also, "long_name" should be their licence number. - """ - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType - """ - Indicates that the user's role in the mesh - """ - public_key: builtins.bytes - """ - The public key of the user's device. - This is sent out to other nodes on the mesh to allow them to compute a shared secret key. - """ - is_unmessagable: builtins.bool - """ - Whether or not the node can be messaged - """ - def __init__( - self, - *, - macaddr: builtins.bytes = ..., - long_name: builtins.str = ..., - short_name: builtins.str = ..., - hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType = ..., - is_licensed: builtins.bool = ..., - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., - public_key: builtins.bytes = ..., - is_unmessagable: builtins.bool | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_is_unmessagable", b"_is_unmessagable"]) -> typing.Literal["is_unmessagable"] | None: ... - -global___UserLite = UserLite - -@typing.final -class NodeInfoLite(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NUM_FIELD_NUMBER: builtins.int - SNR_FIELD_NUMBER: builtins.int - LAST_HEARD_FIELD_NUMBER: builtins.int - CHANNEL_FIELD_NUMBER: builtins.int - HOPS_AWAY_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 - """ - 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 + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["altitude", b"altitude", "latitude_scaled", b"latitude_scaled", "location_source", b"location_source", "longitude_scaled", b"longitude_scaled", "precision_bits", b"precision_bits", "time", b"time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___PositionLite: _TypeAlias = PositionLite # noqa: Y015 + +@_typing.final +class NodeInfoLite(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + NUM_FIELD_NUMBER: _builtins.int + HW_MODEL_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + SNR_FIELD_NUMBER: _builtins.int + LAST_HEARD_FIELD_NUMBER: _builtins.int + CHANNEL_FIELD_NUMBER: _builtins.int + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + HOPS_AWAY_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 + RECORD_SEQ_FIELD_NUMBER: _builtins.int + RECORD_TIER_FIELD_NUMBER: _builtins.int + num: _builtins.int + """ + The node number, and the authoritative copy of it: stored once, not recomputed + from public_key when it is needed. + + fixed32 rather than a varint: a NodeNum is uniformly distributed over 32 + bits, so 15 in 16 of them cost the full five varint bytes where fixed32 + always costs four. + """ + hw_model: _builtins.int + """ + Hardware model the user's device is running, and the one stored copy of it, for + this node as for any other. + Packed vendor/device id: (vendor_id << 8) | device_id. See hw_vendor_registry.proto. + """ + role: _common_pb2.Role.ValueType + """ + The user's role in the mesh. The node's own entry carries this node's role as a + recovery copy; DeviceConfig.role is its source. + """ + snr: _builtins.int + """ + SNR of the last received message: dB x 2, zigzag-encoded, the one SNR scale. + Encode: snr = (int32_t)lroundf(snr_db * 2.0f). Decode: snr_db = snr / 2.0f. + A stored 0 does not by itself mean "unknown" - see NODEINFO_BITFIELD_HAS_SNR in + src/mesh/NodeDB.h for the presence bit that disambiguates a genuine 0 dB reading + from "never measured". + """ + last_heard: _builtins.int """ Set to indicate the last time we received a packet from this node """ - channel: builtins.int + channel: _builtins.int """ local channel index we heard that node on. Only populated if its not the default channel. """ - hops_away: builtins.int + public_key: _builtins.bytes + """ + The public key of the user's device, for PKI-based encrypted DMs. The node's own + entry carries this node's key as a recovery copy; SecurityConfig.public_key is + its source. + """ + hops_away: _builtins.int """ Number of hops away from us this node is (0 if direct neighbor) """ - next_hop: builtins.int + 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: _builtins.int """ - 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. + Per-node boolean flags: a bitwise OR of NodeFlags values (common.proto). + Shares its definition with NodeInfo.flags, so the stored and client-facing + words are interchangeable, with two deliberate exceptions: bits 12 to 23 hold a + fingerprint of the LoRa slot this node was last heard on, which never travels, and + NODE_FLAG_HEARD_ON_CURRENT_LORA is derived from that fingerprint rather than stored. + """ + long_name: _builtins.str """ - long_name: builtins.str - """Flattened user fields (formerly UserLite). macaddr dropped (deprecated 1.2.11). - - A full name for this user, i.e. "Kevin Hester". """ - short_name: builtins.str + 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 + record_seq: _builtins.int """ - The public key of the user's device, for PKI-based encrypted DMs. + Highest NodeRecord.seq accepted for this node's key. A record at or below it is a replay + and changes nothing. """ - snr_q4: builtins.int + record_tier: _discovery_pb2.RecordTier.ValueType """ - 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". + Where the identity above came from, as NodeInfo.record_tier reports it. """ def __init__( self, *, - num: builtins.int = ..., - snr: builtins.float = ..., - last_heard: builtins.int = ..., - channel: builtins.int = ..., - hops_away: builtins.int | None = ..., - 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 = ..., + num: _builtins.int = ..., + hw_model: _builtins.int = ..., + role: _common_pb2.Role.ValueType = ..., + snr: _builtins.int = ..., + last_heard: _builtins.int = ..., + channel: _builtins.int = ..., + public_key: _builtins.bytes = ..., + hops_away: _builtins.int | None = ..., + next_hop: _builtins.int = ..., + bitfield: _builtins.int = ..., + long_name: _builtins.str = ..., + short_name: _builtins.str = ..., + record_seq: _builtins.int = ..., + record_tier: _discovery_pb2.RecordTier.ValueType = ..., ) -> 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 - -@typing.final -class DeviceState(google.protobuf.message.Message): - """ - This message is never sent over the wire, but it is used for serializing DB - state to flash in the device code - FIXME, since we write this each time we enter deep sleep (and have infinite - flash) it would be better to use some sort of append only data structure for - the receive queue and use the preferences store for the other stuff - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - MY_NODE_FIELD_NUMBER: builtins.int - OWNER_FIELD_NUMBER: builtins.int - RECEIVE_QUEUE_FIELD_NUMBER: builtins.int - VERSION_FIELD_NUMBER: builtins.int - RX_TEXT_MESSAGE_FIELD_NUMBER: builtins.int - NO_SAVE_FIELD_NUMBER: builtins.int - DID_GPS_RESET_FIELD_NUMBER: builtins.int - RX_WAYPOINT_FIELD_NUMBER: builtins.int - NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int - version: builtins.int + _HasFieldArgType: _TypeAlias = _typing.Literal["_hops_away", b"_hops_away", "hops_away", b"hops_away"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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", "record_seq", b"record_seq", "record_tier", b"record_tier", "role", b"role", "short_name", b"short_name", "snr", b"snr"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__hops_away: _TypeAlias = _typing.Literal["hops_away"] # noqa: Y015 + _WhichOneofArgType__hops_away: _TypeAlias = _typing.Literal["_hops_away", b"_hops_away"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__hops_away) -> _WhichOneofReturnType__hops_away | None: ... + +Global___NodeInfoLite: _TypeAlias = NodeInfoLite # noqa: Y015 + +@_typing.final +class DeviceState(_message.Message): + """ + This message is never sent over the wire; it serialises device state to flash. + + Nothing in it changes per packet, so it is written when configuration changes and not when + the node sleeps: a node that rewrites it on every deep sleep pays the flash wear for + nothing. + Everything here changes only when someone reconfigures the node, so the + file is written on a configuration change rather than on every deep sleep. + Nothing that changes per packet belongs in it: packets the phone has yet to + read, and the messages and waypoints the screen shows, are held by the + modules that own them. + """ + + DESCRIPTOR: _descriptor.Descriptor + + MY_NODE_FIELD_NUMBER: _builtins.int + OWNER_FIELD_NUMBER: _builtins.int + NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _builtins.int + VERSION_FIELD_NUMBER: _builtins.int + SF_CURSORS_FIELD_NUMBER: _builtins.int + RECORD_SEQ_FIELD_NUMBER: _builtins.int + RECORD_CRC_FIELD_NUMBER: _builtins.int + version: _builtins.int """ A version integer used to invalidate old save files when we make - incompatible changes This integer is set at build time and is private to - NodeDB.cpp in the device code. + incompatible changes. Set at build time and private to NodeDB.cpp in the + device code. """ - no_save: builtins.bool + record_seq: _builtins.int """ - Used only during development. - Indicates developer is testing and changes should never be saved to flash. - Deprecated in 2.3.1 + NodeRecord.seq of this node's own record. Written before a record carrying it is first + sent, and bumped only when the record's content changes. """ - did_gps_reset: builtins.bool + record_crc: _builtins.int """ - Previously used to manage GPS factory resets. - Deprecated in 2.5.23 + CRC32 of the content record_seq was issued for: the canonical signed bytes with seq left + out. A record built at boot whose content hashes differently gets the next seq. """ - @property - def my_node(self) -> meshtastic.protobuf.mesh_pb2.MyNodeInfo: + @_builtins.property + def my_node(self) -> _api_pb2.MyNodeInfo: """ - Read only settings/info about this node + Read only settings/info about this node. nodedb_count is left unset: it is + filled when MyNodeInfo is sent to the phone, and nothing reads a stored value. """ - @property - def owner(self) -> meshtastic.protobuf.mesh_pb2.User: + @_builtins.property + def owner(self) -> _wire_pb2.User: """ - My owner info + My owner info. public_key, role and hw_model are left unset: their sources are + SecurityConfig.public_key, DeviceConfig.role and the node's own + NodeInfoLite.hw_model, and firmware fills them in when it sends the User. """ - @property - def receive_queue(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.MeshPacket]: - """ - Received packets saved for delivery to the phone - """ - - @property - def rx_text_message(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket: - """ - We keep the last received text message (only) stored in the device flash, - so we can show it on the screen. - Might be null + @_builtins.property + def node_remote_hardware_pins(self) -> _containers.RepeatedCompositeFieldContainer[_module_config_pb2.NodeRemoteHardwarePin]: """ - - @property - def rx_waypoint(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket: - """ - We keep the last received waypoint stored in the device flash, - so we can show it on the screen. - Might be null + The mesh's nodes with their available gpio pins for RemoteHardware module """ - @property - def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin]: + @_builtins.property + def sf_cursors(self) -> _containers.RepeatedCompositeFieldContainer[_storeforward_pb2.StoreAndForward.Cursor]: """ - The mesh's nodes with their available gpio pins for RemoteHardware module + Store-and-forward client: where this node stands in each stream it syncs, one + cursor per channel hash plus the direct message stream. Written when a sync round + ends, so it changes about as often as a server announces. """ def __init__( self, *, - my_node: meshtastic.protobuf.mesh_pb2.MyNodeInfo | None = ..., - owner: meshtastic.protobuf.mesh_pb2.User | None = ..., - receive_queue: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.MeshPacket] | None = ..., - version: builtins.int = ..., - rx_text_message: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ..., - no_save: builtins.bool = ..., - did_gps_reset: builtins.bool = ..., - rx_waypoint: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ..., - node_remote_hardware_pins: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin] | None = ..., + my_node: _api_pb2.MyNodeInfo | None = ..., + owner: _wire_pb2.User | None = ..., + node_remote_hardware_pins: _abc.Iterable[_module_config_pb2.NodeRemoteHardwarePin] | None = ..., + version: _builtins.int = ..., + sf_cursors: _abc.Iterable[_storeforward_pb2.StoreAndForward.Cursor] | None = ..., + record_seq: _builtins.int = ..., + record_crc: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["my_node", b"my_node", "owner", b"owner", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["did_gps_reset", b"did_gps_reset", "my_node", b"my_node", "no_save", b"no_save", "node_remote_hardware_pins", b"node_remote_hardware_pins", "owner", b"owner", "receive_queue", b"receive_queue", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint", "version", b"version"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["my_node", b"my_node", "owner", b"owner"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["my_node", b"my_node", "node_remote_hardware_pins", b"node_remote_hardware_pins", "owner", b"owner", "record_crc", b"record_crc", "record_seq", b"record_seq", "sf_cursors", b"sf_cursors", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___DeviceState = DeviceState +Global___DeviceState: _TypeAlias = DeviceState # noqa: Y015 -@typing.final -class NodePositionEntry(google.protobuf.message.Message): +@_typing.final +class NodePositionEntry(_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 + DESCRIPTOR: _descriptor.Descriptor - NUM_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - num: builtins.int - @property - def position(self) -> global___PositionLite: ... + NUM_FIELD_NUMBER: _builtins.int + POSITION_FIELD_NUMBER: _builtins.int + num: _builtins.int + @_builtins.property + def position(self) -> Global___PositionLite: ... def __init__( self, *, - num: builtins.int = ..., - position: global___PositionLite | None = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["position", b"position"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["num", b"num", "position", b"position"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodePositionEntry: _TypeAlias = NodePositionEntry # noqa: Y015 + +@_typing.final +class NodeTelemetryEntry(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + NUM_FIELD_NUMBER: _builtins.int + DEVICE_METRICS_FIELD_NUMBER: _builtins.int + num: _builtins.int + @_builtins.property + def device_metrics(self) -> _telemetry_pb2.DeviceMetrics: ... def __init__( self, *, - num: builtins.int = ..., - device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ..., + num: _builtins.int = ..., + device_metrics: _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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["device_metrics", b"device_metrics"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_metrics", b"device_metrics", "num", b"num"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeTelemetryEntry: _TypeAlias = NodeTelemetryEntry # noqa: Y015 + +@_typing.final +class NodeReadingsEntry(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + NUM_FIELD_NUMBER: _builtins.int + READINGS_FIELD_NUMBER: _builtins.int + num: _builtins.int + @_builtins.property + def readings(self) -> _telemetry_pb2.SensorReadings: ... def __init__( self, *, - num: builtins.int = ..., - environment_metrics: meshtastic.protobuf.telemetry_pb2.EnvironmentMetrics | None = ..., + num: _builtins.int = ..., + readings: _telemetry_pb2.SensorReadings | 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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["readings", b"readings"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["num", b"num", "readings", b"readings"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeReadingsEntry: _TypeAlias = NodeReadingsEntry # noqa: Y015 + +@_typing.final +class NodeStatusEntry(_message.Message): + DESCRIPTOR: _descriptor.Descriptor + + NUM_FIELD_NUMBER: _builtins.int + STATUS_FIELD_NUMBER: _builtins.int + num: _builtins.int + @_builtins.property + def status(self) -> _wire_pb2.StatusMessage: ... def __init__( self, *, - num: builtins.int = ..., - status: meshtastic.protobuf.mesh_pb2.StatusMessage | None = ..., + num: _builtins.int = ..., + status: _wire_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 + _HasFieldArgType: _TypeAlias = _typing.Literal["status", b"status"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["num", b"num", "status", b"status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeStatusEntry: _TypeAlias = NodeStatusEntry # noqa: Y015 + +@_typing.final +class NodeDatabase(_message.Message): + DESCRIPTOR: _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 + READINGS_FIELD_NUMBER: _builtins.int + version: _builtins.int """ A version integer used to invalidate old save files when we make incompatible changes This integer is set at build time and is private to NodeDB.cpp in the device code. """ - @property - def nodes(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite]: + @_builtins.property + def nodes(self) -> _containers.RepeatedCompositeFieldContainer[Global___NodeInfoLite]: """ - New lite version of NodeDB to decrease memory footprint + Every known node, this node's own entry included. The own entry is kept on + purpose as a recovery copy of the owner: when DeviceState fails to load, firmware + restores the owner's names, is_licensed and is_unmessagable from it, and when the + node database is lost, rebuilds it from DeviceState.owner, DeviceConfig and + SecurityConfig. It is otherwise an ordinary row, so nothing has to treat this + node as a special case. """ - @property - def positions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodePositionEntry]: + @_builtins.property + def positions(self) -> _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]: ... + @_builtins.property + def telemetry(self) -> _containers.RepeatedCompositeFieldContainer[Global___NodeTelemetryEntry]: ... + @_builtins.property + def status(self) -> _containers.RepeatedCompositeFieldContainer[Global___NodeStatusEntry]: ... + @_builtins.property + def readings(self) -> _containers.RepeatedCompositeFieldContainer[Global___NodeReadingsEntry]: ... 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 = ..., + version: _builtins.int = ..., + nodes: _abc.Iterable[Global___NodeInfoLite] | None = ..., + positions: _abc.Iterable[Global___NodePositionEntry] | None = ..., + telemetry: _abc.Iterable[Global___NodeTelemetryEntry] | None = ..., + status: _abc.Iterable[Global___NodeStatusEntry] | None = ..., + readings: _abc.Iterable[Global___NodeReadingsEntry] | None = ..., ) -> 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["nodes", b"nodes", "positions", b"positions", "readings", b"readings", "status", b"status", "telemetry", b"telemetry", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___NodeDatabase = NodeDatabase +Global___NodeDatabase: _TypeAlias = NodeDatabase # noqa: Y015 -@typing.final -class ChannelFile(google.protobuf.message.Message): +@_typing.final +class ChannelFile(_message.Message): """ The on-disk saved channels """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - CHANNELS_FIELD_NUMBER: builtins.int - VERSION_FIELD_NUMBER: builtins.int - version: builtins.int + CHANNELS_FIELD_NUMBER: _builtins.int + VERSION_FIELD_NUMBER: _builtins.int + version: _builtins.int """ A version integer used to invalidate old save files when we make incompatible changes This integer is set at build time and is private to NodeDB.cpp in the device code. """ - @property - def channels(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.channel_pb2.Channel]: + @_builtins.property + def channels(self) -> _containers.RepeatedCompositeFieldContainer[_channel_pb2.Channel]: """ The channels our node knows about """ @@ -503,70 +474,79 @@ class ChannelFile(google.protobuf.message.Message): def __init__( self, *, - channels: collections.abc.Iterable[meshtastic.protobuf.channel_pb2.Channel] | None = ..., - version: builtins.int = ..., + channels: _abc.Iterable[_channel_pb2.Channel] | None = ..., + version: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["channels", b"channels", "version", b"version"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["channels", b"channels", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ChannelFile = ChannelFile +Global___ChannelFile: _TypeAlias = ChannelFile # noqa: Y015 -@typing.final -class BackupPreferences(google.protobuf.message.Message): +@_typing.final +class BackupPreferences(_message.Message): """ The on-disk backup of the node's preferences """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - VERSION_FIELD_NUMBER: builtins.int - TIMESTAMP_FIELD_NUMBER: builtins.int - CONFIG_FIELD_NUMBER: builtins.int - MODULE_CONFIG_FIELD_NUMBER: builtins.int - CHANNELS_FIELD_NUMBER: builtins.int - OWNER_FIELD_NUMBER: builtins.int - version: builtins.int + VERSION_FIELD_NUMBER: _builtins.int + TIMESTAMP_FIELD_NUMBER: _builtins.int + CONFIG_FIELD_NUMBER: _builtins.int + MODULE_CONFIG_FIELD_NUMBER: _builtins.int + CHANNELS_FIELD_NUMBER: _builtins.int + OWNER_FIELD_NUMBER: _builtins.int + version: _builtins.int """ The version of the backup """ - timestamp: builtins.int + timestamp: _builtins.int """ The timestamp of the backup (if node has time) """ - @property - def config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig: + @_builtins.property + def config(self) -> _localonly_pb2.LocalConfig: """ The node's configuration """ - @property - def module_config(self) -> meshtastic.protobuf.localonly_pb2.LocalModuleConfig: + @_builtins.property + def module_config(self) -> _localonly_pb2.LocalModuleConfig: """ The node's module configuration """ - @property - def channels(self) -> global___ChannelFile: + @_builtins.property + def channels(self) -> Global___ChannelFile: """ The node's channels """ - @property - def owner(self) -> meshtastic.protobuf.mesh_pb2.User: + @_builtins.property + def owner(self) -> _wire_pb2.User: """ - The node's user (owner) information + The node's user (owner) information, without public_key, role and hw_model: the + backed-up config holds the key and the role, and the hardware model is the + build's. """ def __init__( self, *, - version: builtins.int = ..., - timestamp: builtins.int = ..., - config: meshtastic.protobuf.localonly_pb2.LocalConfig | None = ..., - module_config: meshtastic.protobuf.localonly_pb2.LocalModuleConfig | None = ..., - channels: global___ChannelFile | None = ..., - owner: meshtastic.protobuf.mesh_pb2.User | None = ..., + version: _builtins.int = ..., + timestamp: _builtins.int = ..., + config: _localonly_pb2.LocalConfig | None = ..., + module_config: _localonly_pb2.LocalModuleConfig | None = ..., + channels: Global___ChannelFile | None = ..., + owner: _wire_pb2.User | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner", "timestamp", b"timestamp", "version", b"version"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner", "timestamp", b"timestamp", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___BackupPreferences = BackupPreferences +Global___BackupPreferences: _TypeAlias = BackupPreferences # noqa: Y015 diff --git a/meshtastic/protobuf/discovery_pb2.py b/meshtastic/protobuf/discovery_pb2.py new file mode 100644 index 000000000..b8bd2476c --- /dev/null +++ b/meshtastic/protobuf/discovery_pb2.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/discovery.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/discovery.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdb\x01\n\nNodeRecord\x12\x19\n\npublic_key\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x18\n\tlong_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x04 \x01(\tB\x05\x92?\x02\x08\x05\x12\x17\n\x08hw_model\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\x12\'\n\x04role\x18\x06 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x05\x66lags\x18\x07 \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tsignature\x18\x08 \x01(\x0c\x42\x05\x92?\x02\x08@\"\x96\x01\n\x0e\x44iscoveryQuery\x12\x12\n\x08node_num\x18\x01 \x01(\x07H\x00\x12\x1b\n\nkey_prefix\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08\x08H\x00\x12\x17\n\x06\x62ucket\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x12\x12\n\nsince_time\x18\x04 \x01(\x07\x12\x1a\n\x0bmax_records\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x42\n\n\x08selector\"\xac\x01\n\x0e\x44iscoveryReply\x12\x37\n\x07records\x18\x01 \x03(\x0b\x32\x1f.meshtastic.protobuf.NodeRecordB\x05\x92?\x02\x10\x04\x12\x35\n\x05tiers\x18\x02 \x03(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\x05\x92?\x02\x10\x04\x12\x11\n\ttruncated\x18\x03 \x01(\x08\x12\x17\n\x0fnext_since_time\x18\x04 \x01(\x07\"<\n\nSyncDigest\x12\x17\n\x06\x63ounts\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06hashes\x18\x02 \x03(\x06\x42\x05\x92?\x02\x10\x10\"U\n\x0bSyncRequest\x12\x16\n\x07\x62uckets\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12\x12\n\nsince_time\x18\x02 \x01(\x07\x12\x1a\n\x0bmax_records\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\xa2\x02\n\x10\x44iscoveryMessage\x12\x32\n\x07publish\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeRecordH\x00\x12\x34\n\x05query\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.DiscoveryQueryH\x00\x12\x34\n\x05reply\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.DiscoveryReplyH\x00\x12\x31\n\x06\x64igest\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.SyncDigestH\x00\x12\x30\n\x04sync\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.SyncRequestH\x00\x42\t\n\x07variant*Y\n\nRecordTier\x12\x0e\n\nTIER_UNSET\x10\x00\x12\x13\n\x0fTIER_FIRST_HAND\x10\x01\x12\x14\n\x10TIER_SECOND_HAND\x10\x02\x12\x10\n\x0cTIER_EXPIRED\x10\x03\x42\x65\n\x14org.meshtastic.protoB\x0f\x44iscoveryProtosZ\"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.discovery_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\017DiscoveryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_NODERECORD'].fields_by_name['public_key']._options = None + _globals['_NODERECORD'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _globals['_NODERECORD'].fields_by_name['long_name']._options = None + _globals['_NODERECORD'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _globals['_NODERECORD'].fields_by_name['short_name']._options = None + _globals['_NODERECORD'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_NODERECORD'].fields_by_name['hw_model']._options = None + _globals['_NODERECORD'].fields_by_name['hw_model']._serialized_options = b'\222?\0028\020' + _globals['_NODERECORD'].fields_by_name['flags']._options = None + _globals['_NODERECORD'].fields_by_name['flags']._serialized_options = b'\222?\0028 ' + _globals['_NODERECORD'].fields_by_name['signature']._options = None + _globals['_NODERECORD'].fields_by_name['signature']._serialized_options = b'\222?\002\010@' + _globals['_DISCOVERYQUERY'].fields_by_name['key_prefix']._options = None + _globals['_DISCOVERYQUERY'].fields_by_name['key_prefix']._serialized_options = b'\222?\002\010\010' + _globals['_DISCOVERYQUERY'].fields_by_name['bucket']._options = None + _globals['_DISCOVERYQUERY'].fields_by_name['bucket']._serialized_options = b'\222?\0028\010' + _globals['_DISCOVERYQUERY'].fields_by_name['max_records']._options = None + _globals['_DISCOVERYQUERY'].fields_by_name['max_records']._serialized_options = b'\222?\0028\010' + _globals['_DISCOVERYREPLY'].fields_by_name['records']._options = None + _globals['_DISCOVERYREPLY'].fields_by_name['records']._serialized_options = b'\222?\002\020\004' + _globals['_DISCOVERYREPLY'].fields_by_name['tiers']._options = None + _globals['_DISCOVERYREPLY'].fields_by_name['tiers']._serialized_options = b'\222?\002\020\004' + _globals['_SYNCDIGEST'].fields_by_name['counts']._options = None + _globals['_SYNCDIGEST'].fields_by_name['counts']._serialized_options = b'\222?\004\020\0208\020' + _globals['_SYNCDIGEST'].fields_by_name['hashes']._options = None + _globals['_SYNCDIGEST'].fields_by_name['hashes']._serialized_options = b'\222?\002\020\020' + _globals['_SYNCREQUEST'].fields_by_name['buckets']._options = None + _globals['_SYNCREQUEST'].fields_by_name['buckets']._serialized_options = b'\222?\0028\020' + _globals['_SYNCREQUEST'].fields_by_name['max_records']._options = None + _globals['_SYNCREQUEST'].fields_by_name['max_records']._serialized_options = b'\222?\0028\010' + _globals['_RECORDTIER']._serialized_start=1120 + _globals['_RECORDTIER']._serialized_end=1209 + _globals['_NODERECORD']._serialized_start=129 + _globals['_NODERECORD']._serialized_end=348 + _globals['_DISCOVERYQUERY']._serialized_start=351 + _globals['_DISCOVERYQUERY']._serialized_end=501 + _globals['_DISCOVERYREPLY']._serialized_start=504 + _globals['_DISCOVERYREPLY']._serialized_end=676 + _globals['_SYNCDIGEST']._serialized_start=678 + _globals['_SYNCDIGEST']._serialized_end=738 + _globals['_SYNCREQUEST']._serialized_start=740 + _globals['_SYNCREQUEST']._serialized_end=825 + _globals['_DISCOVERYMESSAGE']._serialized_start=828 + _globals['_DISCOVERYMESSAGE']._serialized_end=1118 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/discovery_pb2.pyi b/meshtastic/protobuf/discovery_pb2.pyi new file mode 100644 index 000000000..5789559d8 --- /dev/null +++ b/meshtastic/protobuf/discovery_pb2.pyi @@ -0,0 +1,435 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import common_pb2 as _common_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +class _RecordTier: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _RecordTierEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_RecordTier.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + TIER_UNSET: _RecordTier.ValueType # 0 + """ + Not stated. + """ + TIER_FIRST_HAND: _RecordTier.ValueType # 1 + """ + The server heard this announce itself, over RF. + """ + TIER_SECOND_HAND: _RecordTier.ValueType # 2 + """ + Another server heard it and passed it on. Admitted under a per-peer quota. + """ + TIER_EXPIRED: _RecordTier.ValueType # 3 + """ + Held past its TTL and served only because nothing fresher exists. A client shows it as + stale and does not pin a key from it. + """ + +class RecordTier(_RecordTier, metaclass=_RecordTierEnumTypeWrapper): + """ + How close the server that answered was to the node it described. A server's statement about + itself, so it sits beside a record rather than inside it: anything inside would have to be + signed by the node, which cannot know who will serve it. + """ + +TIER_UNSET: RecordTier.ValueType # 0 +""" +Not stated. +""" +TIER_FIRST_HAND: RecordTier.ValueType # 1 +""" +The server heard this announce itself, over RF. +""" +TIER_SECOND_HAND: RecordTier.ValueType # 2 +""" +Another server heard it and passed it on. Admitted under a per-peer quota. +""" +TIER_EXPIRED: RecordTier.ValueType # 3 +""" +Held past its TTL and served only because nothing fresher exists. A client shows it as +stale and does not pin a key from it. +""" +Global___RecordTier: _TypeAlias = RecordTier # noqa: Y015 + +@_typing.final +class NodeRecord(_message.Message): + """ + A node's identity, signed by the node it describes. + + A record is valid wherever it is found. The signature covers the content under the key the + content claims, so a router, a backhaul or a file can carry it and a receiver still knows + it is genuine: whoever serves a record cannot forge one, alter one, or roll one back. That + is what lets discovery move off a flood and onto infrastructure without anyone having to + trust the infrastructure. + + The signed bytes are exactly, with no separators beyond the two terminators shown: + + "mnr1" || public_key || varint(seq) || long_name || 0x00 || short_name || 0x00 + || hw_model (2 bytes, little-endian) || role (1 byte) || flags (2 bytes, LE) + + A verifier checks the signature first, then checks that CRC32 of public_key equals the + NodeNum the record was filed under, and drops the record if either fails. + + What is NOT in a record: position, telemetry, and the forward-secrecy ratchet key. The + ratchet key rotates daily (SecurityConfig.ratchet_interval_secs), and a record that changes + daily is a record that is always stale, so it stays in live NodeInfo where freshness is + worth its airtime. + """ + + DESCRIPTOR: _descriptor.Descriptor + + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + SEQ_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 + FLAGS_FIELD_NUMBER: _builtins.int + SIGNATURE_FIELD_NUMBER: _builtins.int + public_key: _builtins.bytes + """ + X25519/Ed25519 identity, and the only identity a record has. A NodeNum is CRC32 of this + key, which is a 32-bit function: a targeted collision costs about 2^32 key generations, + so a NodeNum is a handle for display and indexing and never proof of identity. A lookup + by NodeNum may legitimately return more than one record. + """ + seq: _builtins.int + """ + Monotone per key, persisted before the record is first sent, and bumped only when the + content below changes. A receiver keeps the highest seq it has seen for a key and ignores + anything lower, so a captured older record cannot be replayed over a newer one. Values + are only ever compared within one key. + """ + long_name: _builtins.str + """ + As User.long_name. + """ + short_name: _builtins.str + """ + As User.short_name. + """ + hw_model: _builtins.int + """ + Device hardware model, packed as (vendor_id << 8) | device_id. + """ + role: _common_pb2.Role.ValueType + """ + The node's role. + """ + flags: _builtins.int + """ + A bitwise OR of NodeFlags values, limited to the bits that describe the node to others: + NODE_FLAG_IS_LICENSED, NODE_FLAG_IS_UNMESSAGABLE and NODE_FLAG_HAS_IS_UNMESSAGABLE. The + rest of NodeFlags is a receiver's own opinion - favourite, ignored, muted, verified - and + a record that sets one of those is signed nonsense: a receiver ignores those bits rather + than rejecting the record. + """ + signature: _builtins.bytes + """ + XEdDSA over the canonical bytes above. + """ + def __init__( + self, + *, + public_key: _builtins.bytes = ..., + seq: _builtins.int = ..., + long_name: _builtins.str = ..., + short_name: _builtins.str = ..., + hw_model: _builtins.int = ..., + role: _common_pb2.Role.ValueType = ..., + flags: _builtins.int = ..., + signature: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "hw_model", b"hw_model", "long_name", b"long_name", "public_key", b"public_key", "role", b"role", "seq", b"seq", "short_name", b"short_name", "signature", b"signature"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NodeRecord: _TypeAlias = NodeRecord # noqa: Y015 + +@_typing.final +class DiscoveryQuery(_message.Message): + """ + Ask a server for records. A PKI direct message, so the reply is authenticated to the asker + by the pairwise key and no server can answer as another. + """ + + DESCRIPTOR: _descriptor.Descriptor + + NODE_NUM_FIELD_NUMBER: _builtins.int + KEY_PREFIX_FIELD_NUMBER: _builtins.int + BUCKET_FIELD_NUMBER: _builtins.int + SINCE_TIME_FIELD_NUMBER: _builtins.int + MAX_RECORDS_FIELD_NUMBER: _builtins.int + node_num: _builtins.int + """ + By NodeNum. The reply carries every record whose key hashes to it, which is how a + collision becomes visible rather than silent. + """ + key_prefix: _builtins.bytes + """ + By leading bytes of a public key, 1 to 8 of them, for a client that has a key fragment + from a QR code or a signature it could not check. + """ + bucket: _builtins.int + """ + Everything the server filed in this bucket since `since_time`: bucket is the top four + bits of the public key, 0 to 15. This is how a client bootstraps and how a server pages + through a peer, one bucket at a time. + """ + since_time: _builtins.int + """ + Server-local filing time to start from, for a bucket query. 0 asks for everything the + server holds in that bucket. + """ + max_records: _builtins.int + """ + The asker's cap on records in the reply, because the asker pays the airtime. 0 takes the + server's own cap. + """ + def __init__( + self, + *, + node_num: _builtins.int = ..., + key_prefix: _builtins.bytes = ..., + bucket: _builtins.int = ..., + since_time: _builtins.int = ..., + max_records: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["bucket", b"bucket", "key_prefix", b"key_prefix", "node_num", b"node_num", "selector", b"selector"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bucket", b"bucket", "key_prefix", b"key_prefix", "max_records", b"max_records", "node_num", b"node_num", "selector", b"selector", "since_time", b"since_time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_selector: _TypeAlias = _typing.Literal["node_num", "key_prefix", "bucket"] # noqa: Y015 + _WhichOneofArgType_selector: _TypeAlias = _typing.Literal["selector", b"selector"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_selector) -> _WhichOneofReturnType_selector | None: ... + +Global___DiscoveryQuery: _TypeAlias = DiscoveryQuery # noqa: Y015 + +@_typing.final +class DiscoveryReply(_message.Message): + """ + Records, with the server's provenance for each. + """ + + DESCRIPTOR: _descriptor.Descriptor + + RECORDS_FIELD_NUMBER: _builtins.int + TIERS_FIELD_NUMBER: _builtins.int + TRUNCATED_FIELD_NUMBER: _builtins.int + NEXT_SINCE_TIME_FIELD_NUMBER: _builtins.int + truncated: _builtins.bool + """ + The server had more to send than the cap allowed. Ask again from next_since_time. + """ + next_since_time: _builtins.int + """ + The since_time that continues where this reply stopped, set whenever it carries a record. + Filing times are server-local and strictly increasing, so asking from here repeats nothing + and skips nothing; a server keeps it as its cursor into a peer. + """ + @_builtins.property + def records(self) -> _containers.RepeatedCompositeFieldContainer[Global___NodeRecord]: + """ + The records themselves. + """ + + @_builtins.property + def tiers(self) -> _containers.RepeatedScalarFieldContainer[Global___RecordTier.ValueType]: + """ + One tier per record, in the same order: two parallel columns rather than a tier field + inside NodeRecord, because the tier is the server's statement and the record is the + node's. + """ + + def __init__( + self, + *, + records: _abc.Iterable[Global___NodeRecord] | None = ..., + tiers: _abc.Iterable[Global___RecordTier.ValueType] | None = ..., + truncated: _builtins.bool = ..., + next_since_time: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["next_since_time", b"next_since_time", "records", b"records", "tiers", b"tiers", "truncated", b"truncated"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___DiscoveryReply: _TypeAlias = DiscoveryReply # noqa: Y015 + +@_typing.final +class SyncDigest(_message.Message): + """ + A summary of what a server holds, so two servers can find their differences without + sending records. Sixteen buckets by the top four bits of the public key: a count and an XOR + of the record hashes per bucket, about 150 bytes in all, and a bucket whose count or hash + differs is the only one worth transferring. + + Servers exchange this over the mesh or a wired backhaul between co-located nodes. Not over + MQTT: a broker that aggregates every record of every mesh is a directory, which is a + different thing from a mesh that will answer a question about one node. + """ + + DESCRIPTOR: _descriptor.Descriptor + + COUNTS_FIELD_NUMBER: _builtins.int + HASHES_FIELD_NUMBER: _builtins.int + @_builtins.property + def counts(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + Records held per bucket, 16 entries, bucket 0 first. + """ + + @_builtins.property + def hashes(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + XOR of the record hashes per bucket, 16 entries. A record's hash is the first eight bytes + of SHA-256 over its signed bytes, so two servers holding the same records agree bit for + bit regardless of what order they arrived in. + """ + + def __init__( + self, + *, + counts: _abc.Iterable[_builtins.int] | None = ..., + hashes: _abc.Iterable[_builtins.int] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["counts", b"counts", "hashes", b"hashes"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SyncDigest: _TypeAlias = SyncDigest # noqa: Y015 + +@_typing.final +class SyncRequest(_message.Message): + """ + Ask a peer for the buckets a digest showed to differ. + """ + + DESCRIPTOR: _descriptor.Descriptor + + BUCKETS_FIELD_NUMBER: _builtins.int + SINCE_TIME_FIELD_NUMBER: _builtins.int + MAX_RECORDS_FIELD_NUMBER: _builtins.int + buckets: _builtins.int + """ + Bitmask of the buckets wanted: bit N asks for bucket N. + """ + since_time: _builtins.int + """ + Only records the peer filed at or after this time. + """ + max_records: _builtins.int + """ + Cap on records in each reply. + """ + def __init__( + self, + *, + buckets: _builtins.int = ..., + since_time: _builtins.int = ..., + max_records: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["buckets", b"buckets", "max_records", b"max_records", "since_time", b"since_time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SyncRequest: _TypeAlias = SyncRequest # noqa: Y015 + +@_typing.final +class DiscoveryMessage(_message.Message): + """ + Everything on NODE_DISCOVERY_APP. + + A publish is a broadcast, and while a node hears a discovery server it is the node's + announcement: it goes out in place of NodeInfo, at that announce's hop limit, until a server + serves the record back, and after that on the daily full-budget announce. A node also + publishes once when it first hears a server, and in answer to a broadcast query for itself. + Everything else is a direct message. + + A server admits a record only when it heard the publish itself, at most + StoreForwardConfig.discovery_admit_per_hour new ones an hour, or when a peer that heard it + first-hand passed it on under a quota. Airtime is what makes inventing nodes expensive: + signing a thousand records is free, transmitting for them is not. + """ + + DESCRIPTOR: _descriptor.Descriptor + + PUBLISH_FIELD_NUMBER: _builtins.int + QUERY_FIELD_NUMBER: _builtins.int + REPLY_FIELD_NUMBER: _builtins.int + DIGEST_FIELD_NUMBER: _builtins.int + SYNC_FIELD_NUMBER: _builtins.int + @_builtins.property + def publish(self) -> Global___NodeRecord: + """ + A node announcing itself, or a server refreshing what it holds. + """ + + @_builtins.property + def query(self) -> Global___DiscoveryQuery: + """ + Client or server asking a server. + """ + + @_builtins.property + def reply(self) -> Global___DiscoveryReply: + """ + A server answering. + """ + + @_builtins.property + def digest(self) -> Global___SyncDigest: + """ + Server to server: what I hold. + """ + + @_builtins.property + def sync(self) -> Global___SyncRequest: + """ + Server to server: send me these buckets. + """ + + def __init__( + self, + *, + publish: Global___NodeRecord | None = ..., + query: Global___DiscoveryQuery | None = ..., + reply: Global___DiscoveryReply | None = ..., + digest: Global___SyncDigest | None = ..., + sync: Global___SyncRequest | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["digest", b"digest", "publish", b"publish", "query", b"query", "reply", b"reply", "sync", b"sync", "variant", b"variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["digest", b"digest", "publish", b"publish", "query", b"query", "reply", b"reply", "sync", b"sync", "variant", b"variant"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_variant: _TypeAlias = _typing.Literal["publish", "query", "reply", "digest", "sync"] # noqa: Y015 + _WhichOneofArgType_variant: _TypeAlias = _typing.Literal["variant", b"variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_variant) -> _WhichOneofReturnType_variant | None: ... + +Global___DiscoveryMessage: _TypeAlias = DiscoveryMessage # noqa: Y015 diff --git a/meshtastic/protobuf/field_metadata_pb2.py b/meshtastic/protobuf/field_metadata_pb2.py index 147a7fca6..2bddc61b1 100644 --- a/meshtastic/protobuf/field_metadata_pb2.py +++ b/meshtastic/protobuf/field_metadata_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/field_metadata.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -20,8 +21,8 @@ _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['DESCRIPTOR']._options = None + _globals['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 index f35272634..deb1a0ba1 100644 --- a/meshtastic/protobuf/field_metadata_pb2.pyi +++ b/meshtastic/protobuf/field_metadata_pb2.pyi @@ -3,17 +3,23 @@ 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 +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pb2 as _descriptor_pb2 +from google.protobuf import message as _message +from google.protobuf.internal import extension_dict as _extension_dict +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -@typing.final -class FieldMetadata(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class FieldMetadata(_message.Message): """ Structured, app/UI-relevant metadata describing a protobuf field or enum value. @@ -84,45 +90,45 @@ class FieldMetadata(google.protobuf.message.Message): on pre-assembled boards) directly from the protobuf schema. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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 + 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 + admin_only: _builtins.bool """ Field is only relevant in advanced / administrative contexts and may be hidden from the default UI. """ - min_value: builtins.float + 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 + max_value: _builtins.float """ Inclusive upper bound, for PRESENTATION. Same status as `min_value`. """ - unit: builtins.str + unit: _builtins.str """ Human-facing unit label for the value (e.g. "m", "s", "dBm"). """ - deprecated: builtins.bool + deprecated: _builtins.bool """ Field is deprecated. MIRRORS the field's standard `[deprecated = true]` option - the generators populate this automatically from that option so @@ -132,19 +138,19 @@ class FieldMetadata(google.protobuf.message.Message): ERROR; mark the field `[deprecated = true]` as usual and it flows through here. """ - label: builtins.str + 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 + 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 + 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 @@ -153,7 +159,7 @@ class FieldMetadata(google.protobuf.message.Message): ignored. "|" is used rather than "," because a keyword may itself contain a comma. Source string for localization. """ - since_firmware: builtins.str + since_firmware: _builtins.str """ The first firmware version that has this field, e.g. "2.7.12". @@ -175,7 +181,7 @@ class FieldMetadata(google.protobuf.message.Message): 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 + 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 @@ -202,33 +208,36 @@ class FieldMetadata(google.protobuf.message.Message): 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 = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___FieldMetadata = FieldMetadata +Global___FieldMetadata: _TypeAlias = FieldMetadata # noqa: Y015 -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] +FIELD_METADATA_FIELD_NUMBER: _builtins.int +ENUM_VALUE_METADATA_FIELD_NUMBER: _builtins.int +field_metadata: _extension_dict._ExtensionFieldDescriptor[_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] +enum_value_metadata: _extension_dict._ExtensionFieldDescriptor[_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" }]; diff --git a/meshtastic/protobuf/hw_device_registry_pb2.py b/meshtastic/protobuf/hw_device_registry_pb2.py new file mode 100644 index 000000000..5e4adab71 --- /dev/null +++ b/meshtastic/protobuf/hw_device_registry_pb2.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/hw_device_registry.proto +# Protobuf Python Version: 4.25.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,meshtastic/protobuf/hw_device_registry.proto\x12\x13meshtastic.protobuf\"L\n\x08HwDevice\x12\x11\n\tvendor_id\x18\x01 \x01(\r\x12\x11\n\tdevice_id\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04slug\x18\x04 \x01(\t\"T\n\x10HwDeviceRegistry\x12.\n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x1d.meshtastic.protobuf.HwDevice\x12\x10\n\x08revision\x18\x02 \x01(\rBl\n\x14org.meshtastic.protoB\x16HwDeviceRegistryProtosZ\"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.hw_device_registry_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\026HwDeviceRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_HWDEVICE']._serialized_start=69 + _globals['_HWDEVICE']._serialized_end=145 + _globals['_HWDEVICEREGISTRY']._serialized_start=147 + _globals['_HWDEVICEREGISTRY']._serialized_end=231 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/hw_device_registry_pb2.pyi b/meshtastic/protobuf/hw_device_registry_pb2.pyi new file mode 100644 index 000000000..f601375d3 --- /dev/null +++ b/meshtastic/protobuf/hw_device_registry_pb2.pyi @@ -0,0 +1,112 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class HwDevice(_message.Message): + """ + Hardware Device Registry + + NOT used on-wire; consumed by clients/apps for display purposes only. + Maps (vendor_id, device_id) pairs to human-readable device names. + + Vendor 0x00 holds the HardwareModel enum values as device IDs, so a packed value + equals the enum value: TBEAM = 4 is vendor 0, device 4, packed 0x0004. + Its unused device IDs are allocated to new devices. + + Device IDs 0x00 and 0xFF are reserved under every vendor: 0x00 names the vendor as a + whole and 0xFF any other device from that vendor. Under vendor 0 they are UNSET and + PRIVATE_HW. + + Adding a board is a change to registry/hardware/.yaml, not to this schema; + tools/gen_registry.py validates it and generates registry/generated/hw_devices.json. + + + A single device entry in the registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + VENDOR_ID_FIELD_NUMBER: _builtins.int + DEVICE_ID_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + SLUG_FIELD_NUMBER: _builtins.int + vendor_id: _builtins.int + """Parent vendor ID""" + device_id: _builtins.int + """Device ID within the vendor (0x01-0xFE; 0x00 and 0xFF are reserved)""" + name: _builtins.str + """ + Device name as the vendor gives it, e.g. "Lora V4", "T-Beam Supreme". A client + displays it after HwVendor.name; there is no stored display string. Vendor 0x00 + is not a brand, so its device names are complete, e.g. "LILYGO T-Beam". + """ + slug: _builtins.str + """ + Stable identifier, upper-case words joined by '_', e.g. "HELTEC_V3". Firmware + build metadata refers to a board by slug rather than by number, and a slug never + changes once allocated. + """ + def __init__( + self, + *, + vendor_id: _builtins.int = ..., + device_id: _builtins.int = ..., + name: _builtins.str = ..., + slug: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_id", b"device_id", "name", b"name", "slug", b"slug", "vendor_id", b"vendor_id"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___HwDevice: _TypeAlias = HwDevice # noqa: Y015 + +@_typing.final +class HwDeviceRegistry(_message.Message): + """ + The complete device registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + DEVICES_FIELD_NUMBER: _builtins.int + REVISION_FIELD_NUMBER: _builtins.int + revision: _builtins.int + """ + Number of devices in the registry. An allocation is permanent, so this only + grows, and a client holding revision N can resolve every device allocated up to + that point. + """ + @_builtins.property + def devices(self) -> _containers.RepeatedCompositeFieldContainer[Global___HwDevice]: ... + def __init__( + self, + *, + devices: _abc.Iterable[Global___HwDevice] | None = ..., + revision: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["devices", b"devices", "revision", b"revision"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___HwDeviceRegistry: _TypeAlias = HwDeviceRegistry # noqa: Y015 diff --git a/meshtastic/protobuf/hw_devices.json b/meshtastic/protobuf/hw_devices.json new file mode 100644 index 000000000..5a88e5a96 --- /dev/null +++ b/meshtastic/protobuf/hw_devices.json @@ -0,0 +1,893 @@ +{ + "revision": 148, + "devices": [ + { + "vendor_id": 0, + "device_id": 1, + "slug": "TLORA_V2", + "name": "LILYGO T-LoRa V2" + }, + { + "vendor_id": 0, + "device_id": 2, + "slug": "TLORA_V1", + "name": "LILYGO T-LoRa V1" + }, + { + "vendor_id": 0, + "device_id": 3, + "slug": "TLORA_V2_1_1P6", + "name": "LILYGO T-LoRa V2.1-1.6" + }, + { + "vendor_id": 0, + "device_id": 4, + "slug": "TBEAM", + "name": "LILYGO T-Beam" + }, + { + "vendor_id": 0, + "device_id": 5, + "slug": "HELTEC_V2_0", + "name": "Heltec V2.0" + }, + { + "vendor_id": 0, + "device_id": 6, + "slug": "TBEAM_V0P7", + "name": "LILYGO T-Beam V0.7" + }, + { + "vendor_id": 0, + "device_id": 7, + "slug": "T_ECHO", + "name": "LILYGO T-Echo" + }, + { + "vendor_id": 0, + "device_id": 8, + "slug": "TLORA_V1_1P3", + "name": "TLORA_V1_1P3" + }, + { + "vendor_id": 0, + "device_id": 9, + "slug": "RAK4631", + "name": "RAK WisBlock 4631" + }, + { + "vendor_id": 0, + "device_id": 10, + "slug": "HELTEC_V2_1", + "name": "Heltec V2.1" + }, + { + "vendor_id": 0, + "device_id": 11, + "slug": "HELTEC_V1", + "name": "Heltec V1" + }, + { + "vendor_id": 0, + "device_id": 12, + "slug": "LILYGO_TBEAM_S3_CORE", + "name": "LILYGO T-Beam Supreme" + }, + { + "vendor_id": 0, + "device_id": 13, + "slug": "RAK11200", + "name": "RAK WisBlock 11200" + }, + { + "vendor_id": 0, + "device_id": 14, + "slug": "NANO_G1", + "name": "Nano G1" + }, + { + "vendor_id": 0, + "device_id": 15, + "slug": "TLORA_V2_1_1P8", + "name": "LILYGO T-LoRa V2.1-1.8" + }, + { + "vendor_id": 0, + "device_id": 16, + "slug": "TLORA_T3_S3", + "name": "LILYGO T-LoRa T3-S3" + }, + { + "vendor_id": 0, + "device_id": 17, + "slug": "NANO_G1_EXPLORER", + "name": "Nano G1 Explorer" + }, + { + "vendor_id": 0, + "device_id": 18, + "slug": "NANO_G2_ULTRA", + "name": "Nano G2 Ultra" + }, + { + "vendor_id": 0, + "device_id": 19, + "slug": "LORA_TYPE", + "name": "LORA_TYPE" + }, + { + "vendor_id": 0, + "device_id": 20, + "slug": "WIPHONE", + "name": "WIPHONE" + }, + { + "vendor_id": 0, + "device_id": 21, + "slug": "WIO_WM1110", + "name": "Seeed Wio WM1110 Tracker" + }, + { + "vendor_id": 0, + "device_id": 22, + "slug": "RAK2560", + "name": "RAK WisMesh Repeater" + }, + { + "vendor_id": 0, + "device_id": 23, + "slug": "HELTEC_HRU_3601", + "name": "HELTEC_HRU_3601" + }, + { + "vendor_id": 0, + "device_id": 24, + "slug": "HELTEC_WIRELESS_BRIDGE", + "name": "HELTEC_WIRELESS_BRIDGE" + }, + { + "vendor_id": 0, + "device_id": 25, + "slug": "STATION_G1", + "name": "Station G1" + }, + { + "vendor_id": 0, + "device_id": 26, + "slug": "RAK11310", + "name": "RAK WisBlock 11310" + }, + { + "vendor_id": 0, + "device_id": 27, + "slug": "MAKERFABS_TRACKER", + "name": "MAKERFABS_TRACKER" + }, + { + "vendor_id": 0, + "device_id": 28, + "slug": "MAKERFABS_RESERVED", + "name": "MAKERFABS_RESERVED" + }, + { + "vendor_id": 0, + "device_id": 29, + "slug": "CANARYONE", + "name": "Canary One" + }, + { + "vendor_id": 0, + "device_id": 30, + "slug": "RP2040_LORA", + "name": "RP2040 LoRa" + }, + { + "vendor_id": 0, + "device_id": 31, + "slug": "STATION_G2", + "name": "Station G2" + }, + { + "vendor_id": 0, + "device_id": 32, + "slug": "LORA_RELAY_V1", + "name": "LORA_RELAY_V1" + }, + { + "vendor_id": 0, + "device_id": 33, + "slug": "T_ECHO_PLUS", + "name": "LILYGO T-Echo Plus" + }, + { + "vendor_id": 0, + "device_id": 34, + "slug": "PPR", + "name": "PPR" + }, + { + "vendor_id": 0, + "device_id": 35, + "slug": "GENIEBLOCKS", + "name": "GENIEBLOCKS" + }, + { + "vendor_id": 0, + "device_id": 36, + "slug": "NRF52_UNKNOWN", + "name": "NRF52_UNKNOWN" + }, + { + "vendor_id": 0, + "device_id": 37, + "slug": "PORTDUINO", + "name": "PORTDUINO" + }, + { + "vendor_id": 0, + "device_id": 38, + "slug": "ANDROID_SIM", + "name": "ANDROID_SIM" + }, + { + "vendor_id": 0, + "device_id": 39, + "slug": "DIY_V1", + "name": "DIY V1" + }, + { + "vendor_id": 0, + "device_id": 40, + "slug": "NRF52840_PCA10059", + "name": "NRF52840_PCA10059" + }, + { + "vendor_id": 0, + "device_id": 41, + "slug": "DR_DEV", + "name": "DR-DEV" + }, + { + "vendor_id": 0, + "device_id": 42, + "slug": "M5STACK", + "name": "M5 Stack" + }, + { + "vendor_id": 0, + "device_id": 43, + "slug": "HELTEC_V3", + "name": "Heltec V3" + }, + { + "vendor_id": 0, + "device_id": 44, + "slug": "HELTEC_WSL_V3", + "name": "Heltec Wireless Stick Lite V3" + }, + { + "vendor_id": 0, + "device_id": 45, + "slug": "BETAFPV_2400_TX", + "name": "BETAFPV_2400_TX" + }, + { + "vendor_id": 0, + "device_id": 46, + "slug": "BETAFPV_900_NANO_TX", + "name": "BETAFPV_900_NANO_TX" + }, + { + "vendor_id": 0, + "device_id": 47, + "slug": "RPI_PICO", + "name": "Raspberry Pi Pico" + }, + { + "vendor_id": 0, + "device_id": 48, + "slug": "HELTEC_WIRELESS_TRACKER", + "name": "Heltec Wireless Tracker V1.1" + }, + { + "vendor_id": 0, + "device_id": 49, + "slug": "HELTEC_WIRELESS_PAPER", + "name": "Heltec Wireless Paper" + }, + { + "vendor_id": 0, + "device_id": 50, + "slug": "T_DECK", + "name": "LILYGO T-Deck" + }, + { + "vendor_id": 0, + "device_id": 51, + "slug": "T_WATCH_S3", + "name": "LILYGO T-Watch S3" + }, + { + "vendor_id": 0, + "device_id": 52, + "slug": "PICOMPUTER_S3", + "name": "Pi Computer S3" + }, + { + "vendor_id": 0, + "device_id": 53, + "slug": "HELTEC_HT62", + "name": "Heltec HT62" + }, + { + "vendor_id": 0, + "device_id": 54, + "slug": "EBYTE_ESP32_S3", + "name": "EBYTE_ESP32_S3" + }, + { + "vendor_id": 0, + "device_id": 55, + "slug": "ESP32_S3_PICO", + "name": "ESP32_S3_PICO" + }, + { + "vendor_id": 0, + "device_id": 56, + "slug": "CHATTER_2", + "name": "CHATTER_2" + }, + { + "vendor_id": 0, + "device_id": 57, + "slug": "HELTEC_WIRELESS_PAPER_V1_0", + "name": "Heltec Wireless Paper V1.0" + }, + { + "vendor_id": 0, + "device_id": 58, + "slug": "HELTEC_WIRELESS_TRACKER_V1_0", + "name": "Heltec Wireless Tracker V1.0" + }, + { + "vendor_id": 0, + "device_id": 59, + "slug": "UNPHONE", + "name": "unPhone" + }, + { + "vendor_id": 0, + "device_id": 60, + "slug": "TD_LORAC", + "name": "TD_LORAC" + }, + { + "vendor_id": 0, + "device_id": 61, + "slug": "CDEBYTE_EORA_S3", + "name": "EBYTE EoRa-S3" + }, + { + "vendor_id": 0, + "device_id": 62, + "slug": "TWC_MESH_V4", + "name": "TWC_MESH_V4" + }, + { + "vendor_id": 0, + "device_id": 63, + "slug": "NRF52_PROMICRO_DIY", + "name": "NRF52 Pro-micro DIY" + }, + { + "vendor_id": 0, + "device_id": 64, + "slug": "RADIOMASTER_900_BANDIT_NANO", + "name": "RadioMaster 900 Bandit Nano" + }, + { + "vendor_id": 0, + "device_id": 65, + "slug": "HELTEC_CAPSULE_SENSOR_V3", + "name": "HELTEC_CAPSULE_SENSOR_V3" + }, + { + "vendor_id": 0, + "device_id": 66, + "slug": "HELTEC_VISION_MASTER_T190", + "name": "Heltec Vision Master T190" + }, + { + "vendor_id": 0, + "device_id": 67, + "slug": "HELTEC_VISION_MASTER_E213", + "name": "Heltec Vision Master E213" + }, + { + "vendor_id": 0, + "device_id": 68, + "slug": "HELTEC_VISION_MASTER_E290", + "name": "Heltec Vision Master E290" + }, + { + "vendor_id": 0, + "device_id": 69, + "slug": "HELTEC_MESH_NODE_T114", + "name": "Heltec Mesh Node T114" + }, + { + "vendor_id": 0, + "device_id": 70, + "slug": "SENSECAP_INDICATOR", + "name": "Seeed SenseCAP Indicator" + }, + { + "vendor_id": 0, + "device_id": 71, + "slug": "TRACKER_T1000_E", + "name": "Seeed SenseCAP T1000-E" + }, + { + "vendor_id": 0, + "device_id": 72, + "slug": "RAK3172", + "name": "RAK3172" + }, + { + "vendor_id": 0, + "device_id": 73, + "slug": "WIO_E5", + "name": "WIO_E5" + }, + { + "vendor_id": 0, + "device_id": 74, + "slug": "RADIOMASTER_900_BANDIT", + "name": "RADIOMASTER_900_BANDIT" + }, + { + "vendor_id": 0, + "device_id": 75, + "slug": "ME25LS01_4Y10TD", + "name": "ME25LS01_4Y10TD" + }, + { + "vendor_id": 0, + "device_id": 76, + "slug": "RP2040_FEATHER_RFM95", + "name": "RP2040_FEATHER_RFM95" + }, + { + "vendor_id": 0, + "device_id": 77, + "slug": "M5STACK_COREBASIC", + "name": "M5STACK_COREBASIC" + }, + { + "vendor_id": 0, + "device_id": 78, + "slug": "M5STACK_CORE2", + "name": "M5STACK_CORE2" + }, + { + "vendor_id": 0, + "device_id": 79, + "slug": "RPI_PICO2", + "name": "RPI_PICO2" + }, + { + "vendor_id": 0, + "device_id": 80, + "slug": "M5STACK_CORES3", + "name": "M5STACK_CORES3" + }, + { + "vendor_id": 0, + "device_id": 81, + "slug": "SEEED_XIAO_S3", + "name": "Seeed Xiao ESP32-S3" + }, + { + "vendor_id": 0, + "device_id": 82, + "slug": "MS24SF1", + "name": "MS24SF1" + }, + { + "vendor_id": 0, + "device_id": 83, + "slug": "TLORA_C6", + "name": "LilyGo T3-C6" + }, + { + "vendor_id": 0, + "device_id": 84, + "slug": "WISMESH_TAP", + "name": "RAK WisMesh Tap" + }, + { + "vendor_id": 0, + "device_id": 85, + "slug": "ROUTASTIC", + "name": "ROUTASTIC" + }, + { + "vendor_id": 0, + "device_id": 86, + "slug": "MESH_TAB", + "name": "MESH_TAB" + }, + { + "vendor_id": 0, + "device_id": 87, + "slug": "MESHLINK", + "name": "MESHLINK" + }, + { + "vendor_id": 0, + "device_id": 88, + "slug": "XIAO_NRF52_KIT", + "name": "Seeed Xiao NRF52840 Kit" + }, + { + "vendor_id": 0, + "device_id": 89, + "slug": "THINKNODE_M1", + "name": "ThinkNode M1" + }, + { + "vendor_id": 0, + "device_id": 90, + "slug": "THINKNODE_M2", + "name": "ThinkNode M2" + }, + { + "vendor_id": 0, + "device_id": 91, + "slug": "T_ETH_ELITE", + "name": "T_ETH_ELITE" + }, + { + "vendor_id": 0, + "device_id": 92, + "slug": "HELTEC_SENSOR_HUB", + "name": "HELTEC_SENSOR_HUB" + }, + { + "vendor_id": 0, + "device_id": 93, + "slug": "MUZI_BASE", + "name": "muzi BASE" + }, + { + "vendor_id": 0, + "device_id": 94, + "slug": "HELTEC_MESH_POCKET", + "name": "Heltec Mesh Pocket" + }, + { + "vendor_id": 0, + "device_id": 95, + "slug": "SEEED_SOLAR_NODE", + "name": "Seeed SenseCAP Solar Node" + }, + { + "vendor_id": 0, + "device_id": 96, + "slug": "NOMADSTAR_METEOR_PRO", + "name": "NomadStar Meteor Pro" + }, + { + "vendor_id": 0, + "device_id": 97, + "slug": "CROWPANEL", + "name": "Crowpanel Adv 3.5 TFT" + }, + { + "vendor_id": 0, + "device_id": 98, + "slug": "LINK_32", + "name": "LINK_32" + }, + { + "vendor_id": 0, + "device_id": 99, + "slug": "SEEED_WIO_TRACKER_L1", + "name": "Seeed Wio Tracker L1" + }, + { + "vendor_id": 0, + "device_id": 100, + "slug": "SEEED_WIO_TRACKER_L1_EINK", + "name": "Seeed Wio Tracker L1 E-Ink" + }, + { + "vendor_id": 0, + "device_id": 101, + "slug": "MUZI_R1_NEO", + "name": "muzi R1 Neo" + }, + { + "vendor_id": 0, + "device_id": 102, + "slug": "T_DECK_PRO", + "name": "LILYGO T-Deck Pro" + }, + { + "vendor_id": 0, + "device_id": 103, + "slug": "T_LORA_PAGER", + "name": "LILYGO T-LoRa Pager" + }, + { + "vendor_id": 0, + "device_id": 104, + "slug": "M5STACK_RESERVED", + "name": "M5STACK_RESERVED" + }, + { + "vendor_id": 0, + "device_id": 105, + "slug": "WISMESH_TAG", + "name": "RAK WisMesh Tag" + }, + { + "vendor_id": 0, + "device_id": 106, + "slug": "RAK3312", + "name": "RAK3312" + }, + { + "vendor_id": 0, + "device_id": 107, + "slug": "THINKNODE_M5", + "name": "ThinkNode M5" + }, + { + "vendor_id": 0, + "device_id": 108, + "slug": "HELTEC_MESH_SOLAR", + "name": "Heltec MeshSolar" + }, + { + "vendor_id": 0, + "device_id": 109, + "slug": "T_ECHO_LITE", + "name": "LILYGO T-Echo Lite" + }, + { + "vendor_id": 0, + "device_id": 110, + "slug": "HELTEC_V4", + "name": "Heltec V4" + }, + { + "vendor_id": 0, + "device_id": 111, + "slug": "M5STACK_C6L", + "name": "M5Stack Unit C6L" + }, + { + "vendor_id": 0, + "device_id": 112, + "slug": "M5STACK_CARDPUTER_ADV", + "name": "M5STACK_CARDPUTER_ADV" + }, + { + "vendor_id": 0, + "device_id": 113, + "slug": "HELTEC_WIRELESS_TRACKER_V2", + "name": "Heltec Wireless Tracker V2" + }, + { + "vendor_id": 0, + "device_id": 114, + "slug": "T_WATCH_ULTRA", + "name": "T-Watch Ultra" + }, + { + "vendor_id": 0, + "device_id": 115, + "slug": "THINKNODE_M3", + "name": "Elecrow ThinkNode M3" + }, + { + "vendor_id": 0, + "device_id": 116, + "slug": "WISMESH_TAP_V2", + "name": "RAK WisMesh Tap V2" + }, + { + "vendor_id": 0, + "device_id": 117, + "slug": "RAK3401", + "name": "RAK3401 1W" + }, + { + "vendor_id": 0, + "device_id": 118, + "slug": "RAK6421", + "name": "RAK6421" + }, + { + "vendor_id": 0, + "device_id": 119, + "slug": "THINKNODE_M4", + "name": "THINKNODE_M4" + }, + { + "vendor_id": 0, + "device_id": 120, + "slug": "THINKNODE_M6", + "name": "ThinkNode M6" + }, + { + "vendor_id": 0, + "device_id": 121, + "slug": "MESHSTICK_1262", + "name": "MESHSTICK_1262" + }, + { + "vendor_id": 0, + "device_id": 122, + "slug": "TBEAM_1_WATT", + "name": "LILYGO T-Beam 1W" + }, + { + "vendor_id": 0, + "device_id": 123, + "slug": "T5_S3_EPAPER_PRO", + "name": "T5_S3_EPAPER_PRO" + }, + { + "vendor_id": 0, + "device_id": 124, + "slug": "TBEAM_BPF", + "name": "LILYGO T-Beam BPF" + }, + { + "vendor_id": 0, + "device_id": 125, + "slug": "MINI_EPAPER_S3", + "name": "LILYGO Mini ePaper S3 E-Ink" + }, + { + "vendor_id": 0, + "device_id": 126, + "slug": "TDISPLAY_S3_PRO", + "name": "TDISPLAY_S3_PRO" + }, + { + "vendor_id": 0, + "device_id": 127, + "slug": "HELTEC_MESH_NODE_T096", + "name": "Heltec Mesh Node 096" + }, + { + "vendor_id": 0, + "device_id": 128, + "slug": "MESH_TRACKER_X1", + "name": "Seeed SenseCAP Mesh-Tracker-X1" + }, + { + "vendor_id": 0, + "device_id": 129, + "slug": "THINKNODE_M7", + "name": "THINKNODE_M7" + }, + { + "vendor_id": 0, + "device_id": 130, + "slug": "THINKNODE_M8", + "name": "Elecrow ThinkNode M8" + }, + { + "vendor_id": 0, + "device_id": 131, + "slug": "THINKNODE_M9", + "name": "ThinkNode M9" + }, + { + "vendor_id": 0, + "device_id": 132, + "slug": "HELTEC_V4_R8", + "name": "Heltec V4 R8" + }, + { + "vendor_id": 0, + "device_id": 133, + "slug": "HELTEC_MESH_NODE_T1", + "name": "Heltec Mesh Node T1" + }, + { + "vendor_id": 0, + "device_id": 134, + "slug": "STATION_G3", + "name": "Station G3" + }, + { + "vendor_id": 0, + "device_id": 135, + "slug": "T_IMPULSE_PLUS", + "name": "LILYGO T-Impulse Plus" + }, + { + "vendor_id": 0, + "device_id": 136, + "slug": "T_ECHO_CARD", + "name": "T_ECHO_CARD" + }, + { + "vendor_id": 0, + "device_id": 137, + "slug": "SEEED_WIO_TRACKER_L2", + "name": "Seeed Wio Tracker L2" + }, + { + "vendor_id": 0, + "device_id": 138, + "slug": "CROWPANEL_P4", + "name": "CROWPANEL_P4" + }, + { + "vendor_id": 0, + "device_id": 139, + "slug": "HELTEC_MESH_TOWER_V2", + "name": "Heltec MeshTower V2" + }, + { + "vendor_id": 0, + "device_id": 140, + "slug": "MESHNOLOGY_W10", + "name": "Meshnology W10" + }, + { + "vendor_id": 0, + "device_id": 141, + "slug": "HELTEC_RC32", + "name": "Heltec RC32" + }, + { + "vendor_id": 0, + "device_id": 142, + "slug": "HELTEC_RC52", + "name": "Heltec RC52" + }, + { + "vendor_id": 0, + "device_id": 143, + "slug": "HELTEC_RCC6", + "name": "Heltec RCC6" + }, + { + "vendor_id": 0, + "device_id": 144, + "slug": "SEEED_WIO_TRACKER_L1_PRO_1W", + "name": "Seeed Wio Tracker L1 Pro 1W" + }, + { + "vendor_id": 0, + "device_id": 145, + "slug": "MESHNOLOGY_W12", + "name": "MESHNOLOGY_W12" + }, + { + "vendor_id": 0, + "device_id": 146, + "slug": "MESHPAGER_X2", + "name": "MESHPAGER_X2" + }, + { + "vendor_id": 0, + "device_id": 147, + "slug": "T_CONNECT_PRO", + "name": "T_CONNECT_PRO" + }, + { + "vendor_id": 0, + "device_id": 148, + "slug": "AXIOMETA_GENESIS_MINI", + "name": "Axiometa Genesis Mini" + } + ] +} diff --git a/meshtastic/protobuf/hw_vendor_registry_pb2.py b/meshtastic/protobuf/hw_vendor_registry_pb2.py new file mode 100644 index 000000000..e677c4533 --- /dev/null +++ b/meshtastic/protobuf/hw_vendor_registry_pb2.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/hw_vendor_registry.proto +# Protobuf Python Version: 4.25.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,meshtastic/protobuf/hw_vendor_registry.proto\x12\x13meshtastic.protobuf\"9\n\x08HwVendor\x12\x11\n\tvendor_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04slug\x18\x03 \x01(\t\"T\n\x10HwVendorRegistry\x12.\n\x07vendors\x18\x01 \x03(\x0b\x32\x1d.meshtastic.protobuf.HwVendor\x12\x10\n\x08revision\x18\x02 \x01(\rBl\n\x14org.meshtastic.protoB\x16HwVendorRegistryProtosZ\"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.hw_vendor_registry_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\026HwVendorRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_HWVENDOR']._serialized_start=69 + _globals['_HWVENDOR']._serialized_end=126 + _globals['_HWVENDORREGISTRY']._serialized_start=128 + _globals['_HWVENDORREGISTRY']._serialized_end=212 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/hw_vendor_registry_pb2.pyi b/meshtastic/protobuf/hw_vendor_registry_pb2.pyi new file mode 100644 index 000000000..6a0fc12a3 --- /dev/null +++ b/meshtastic/protobuf/hw_vendor_registry_pb2.pyi @@ -0,0 +1,115 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class HwVendor(_message.Message): + """ + Hardware Vendor Registry + + NOT used on-wire; consumed by clients/apps for display purposes only. + Maps vendor IDs (6-bit, 0x00-0x3F) to human-readable vendor names. + Data lives in registry/hardware/, one file per vendor; tools/gen_registry.py + validates it and generates registry/generated/hw_vendors.json. + + The on-wire hw_model field is a packed uint32: (vendor_id << 8) | device_id. + Vendor IDs are six bits and device IDs a full byte, so every packed value is at + most 0x3FFF and fits a two-byte varint. A seventh vendor bit would put vendors + 0x40 and up at three bytes on every User broadcast. + + Vendor ID 0x00 = the common pool, for devices with no registered vendor. Its ids keep + their device IDs; free slots are allocated to new devices. + Vendor IDs 0x01-0x3F = Registered vendors. + + Two device IDs are reserved under every vendor, leaving 254 to assign: + 0x00 = the vendor as a whole, not a particular device + 0xFF = any other device from that vendor, one without its own ID + Under vendor 0 they are 0x0000 UNSET and 0x00FF PRIVATE_HW. There is no private + vendor range. + + Helper macros for firmware: + #define HW_VENDOR(hw_model) ((uint8_t)(((hw_model) >> 8) & 0x3F)) + #define HW_DEVICE(hw_model) ((uint8_t)((hw_model) & 0xFF)) + #define HW_MODEL(vid, did) (((uint16_t)((vid) & 0x3F) << 8) | (uint8_t)(did)) + + + A single vendor entry in the registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + VENDOR_ID_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + SLUG_FIELD_NUMBER: _builtins.int + vendor_id: _builtins.int + """Vendor ID (0x00-0x3F)""" + name: _builtins.str + """Human-readable vendor name, e.g. "Heltec", "LILYGO", "RAKwireless" """ + slug: _builtins.str + """ + Stable identifier, lower-case words joined by '-', e.g. "heltec". Names the + vendor's data file, registry/hardware/.yaml, except vendor 0x00, whose + file is 00-legacy.yaml. It never changes once allocated. + """ + def __init__( + self, + *, + vendor_id: _builtins.int = ..., + name: _builtins.str = ..., + slug: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "slug", b"slug", "vendor_id", b"vendor_id"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___HwVendor: _TypeAlias = HwVendor # noqa: Y015 + +@_typing.final +class HwVendorRegistry(_message.Message): + """ + The complete vendor registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + VENDORS_FIELD_NUMBER: _builtins.int + REVISION_FIELD_NUMBER: _builtins.int + revision: _builtins.int + """ + Number of vendors in the registry. An allocation is permanent, so this only + grows, and a client holding revision N can resolve every vendor allocated up to + that point. + """ + @_builtins.property + def vendors(self) -> _containers.RepeatedCompositeFieldContainer[Global___HwVendor]: ... + def __init__( + self, + *, + vendors: _abc.Iterable[Global___HwVendor] | None = ..., + revision: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["revision", b"revision", "vendors", b"vendors"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___HwVendorRegistry: _TypeAlias = HwVendorRegistry # noqa: Y015 diff --git a/meshtastic/protobuf/interdevice_pb2.py b/meshtastic/protobuf/interdevice_pb2.py index 4ca8e5a4b..43f7c8f2d 100644 --- a/meshtastic/protobuf/interdevice_pb2.py +++ b/meshtastic/protobuf/interdevice_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/interdevice.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,36 +15,36 @@ 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\"\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') +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\x01 \x01(\r\x12\x16\n\x04nmea\x18\x02 \x01(\tB\x06\x92?\x03\x08\x80\x08H\x00\x12\x15\n\x04\x62\x65\x65p\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x00\x12>\n\x0fi2c_transaction\x18\x04 \x01(\x0b\x32#.meshtastic.protobuf.I2CTransactionH\x00\x12\x34\n\ni2c_result\x18\x05 \x01(\x0b\x32\x1e.meshtastic.protobuf.I2CResultH\x00\x12\x12\n\x08i2c_scan\x18\x06 \x01(\x08H\x00\x12!\n\x0fi2c_scan_result\x18\x07 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x01H\x00\x12:\n\rfile_transfer\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.FileTransferH\x00\x12\x42\n\x11\x64irectory_listing\x18\t \x01(\x0b\x32%.meshtastic.protobuf.DirectoryListingH\x00\x12\x15\n\x0bget_sd_info\x18\n \x01(\x08H\x00\x12\x32\n\x07sd_info\x18\x0b \x01(\x0b\x32\x1f.meshtastic.protobuf.SdCardInfoH\x00\x12\x37\n\x04ping\x18\x0c \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x37\n\x04pong\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x0e\n\x04nack\x18\x0e \x01(\x08H\x00\x12\x34\n\nsd_command\x18\x0f \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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.interdevice_pb2', _globals) 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' - _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['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\021InterdeviceProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_FILETRANSFER'].fields_by_name['filepath']._options = None + _globals['_FILETRANSFER'].fields_by_name['filepath']._serialized_options = b'\222?\003\010\200\002' + _globals['_FILETRANSFER'].fields_by_name['filedata']._options = None + _globals['_FILETRANSFER'].fields_by_name['filedata']._serialized_options = b'\222?\003\010\200 ' + _globals['_FILETRANSFER'].fields_by_name['message']._options = None + _globals['_FILETRANSFER'].fields_by_name['message']._serialized_options = b'\222?\003\010\377\001' + _globals['_DIRECTORYLISTING'].fields_by_name['directory']._options = None + _globals['_DIRECTORYLISTING'].fields_by_name['directory']._serialized_options = b'\222?\003\010\200\002' + _globals['_DIRECTORYLISTING'].fields_by_name['filenames']._options = None + _globals['_DIRECTORYLISTING'].fields_by_name['filenames']._serialized_options = b'\222?\005\020\020p\377\001' + _globals['_DIRECTORYLISTING'].fields_by_name['message']._options = None + _globals['_DIRECTORYLISTING'].fields_by_name['message']._serialized_options = b'\222?\003\010\377\001' + _globals['_I2CTRANSACTION'].fields_by_name['write_data']._options = None + _globals['_I2CTRANSACTION'].fields_by_name['write_data']._serialized_options = b'\222?\003\010\200\002' + _globals['_I2CRESULT'].fields_by_name['read_data']._options = None + _globals['_I2CRESULT'].fields_by_name['read_data']._serialized_options = b'\222?\003\010\200\002' + _globals['_INTERDEVICEMESSAGE'].fields_by_name['nmea']._options = None + _globals['_INTERDEVICEMESSAGE'].fields_by_name['nmea']._serialized_options = b'\222?\003\010\200\010' + _globals['_INTERDEVICEMESSAGE'].fields_by_name['beep']._options = None + _globals['_INTERDEVICEMESSAGE'].fields_by_name['beep']._serialized_options = b'\222?\0028\020' + _globals['_INTERDEVICEMESSAGE'].fields_by_name['i2c_scan_result']._options = None + _globals['_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 diff --git a/meshtastic/protobuf/interdevice_pb2.pyi b/meshtastic/protobuf/interdevice_pb2.pyi index 61c66107d..cf48981ef 100644 --- a/meshtastic/protobuf/interdevice_pb2.pyi +++ b/meshtastic/protobuf/interdevice_pb2.pyi @@ -3,28 +3,28 @@ 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 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _InterdeviceVersion: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _InterdeviceVersionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_InterdeviceVersion.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _InterdeviceVersionEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_InterdeviceVersion.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor 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 @@ -48,14 +48,14 @@ INTERDEVICE_VERSION_CURRENT: InterdeviceVersion.ValueType # 2 bool true is the same varint on the wire as the number 1, so firmware predating the handshake would pass it. """ -global___InterdeviceVersion = InterdeviceVersion +Global___InterdeviceVersion: _TypeAlias = InterdeviceVersion # noqa: Y015 class _FileOperation: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _FileOperationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FileOperation.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _FileOperationEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_FileOperation.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor GET: _FileOperation.ValueType # 0 POST: _FileOperation.ValueType # 1 PUT: _FileOperation.ValueType # 2 @@ -68,14 +68,14 @@ GET: FileOperation.ValueType # 0 POST: FileOperation.ValueType # 1 PUT: FileOperation.ValueType # 2 DELETE: FileOperation.ValueType # 3 -global___FileOperation = FileOperation +Global___FileOperation: _TypeAlias = FileOperation # noqa: Y015 class _FileStatus: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _FileStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FileStatus.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _FileStatusEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_FileStatus.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor FILE_UNSPECIFIED: _FileStatus.ValueType # 0 FILE_OK: _FileStatus.ValueType # 1 FILE_BUSY: _FileStatus.ValueType # 2 @@ -115,14 +115,14 @@ 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 +Global___FileStatus: _TypeAlias = FileStatus # noqa: Y015 class _SdCommand: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _SdCommandEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_SdCommand.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _SdCommandEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_SdCommand.ValueType], _builtins.type): + DESCRIPTOR: _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""" @@ -141,81 +141,85 @@ 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 +Global___SdCommand: _TypeAlias = SdCommand # noqa: Y015 -@typing.final -class FileTransfer(google.protobuf.message.Message): +@_typing.final +class FileTransfer(_message.Message): """Message for file operations""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - 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 + DESCRIPTOR: _descriptor.Descriptor + + 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 + filepath: _builtins.str """Path of the file on the SD card""" - filedata: builtins.bytes + filedata: _builtins.bytes """Chunk content (POST/PUT request, GET response)""" - status: global___FileStatus.ValueType + status: Global___FileStatus.ValueType """Response: outcome of the operation""" - message: builtins.str + message: _builtins.str """Response: human readable detail, may be empty""" - offset: builtins.int + offset: _builtins.int """Byte offset of this chunk within the file (ranged GET/PUT)""" - length: builtins.int + 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 + file_size: _builtins.int """GET response: total size of the file""" def __init__( self, *, - 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 = ..., + 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 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___FileTransfer = FileTransfer +Global___FileTransfer: _TypeAlias = FileTransfer # noqa: Y015 -@typing.final -class DirectoryListing(google.protobuf.message.Message): +@_typing.final +class DirectoryListing(_message.Message): """Message for structured directory listing""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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 + 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 + status: Global___FileStatus.ValueType """Response: outcome of the operation""" - message: builtins.str + message: _builtins.str """Response: human readable detail, may be empty""" - offset: builtins.int + offset: _builtins.int """Request: skip this many entries (paging)""" - total_count: builtins.int + total_count: _builtins.int """Response: total number of entries in the directory""" - @property - def filenames(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + @_builtins.property + def filenames(self) -> _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. @@ -226,34 +230,38 @@ class DirectoryListing(google.protobuf.message.Message): 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 = ..., + directory: _builtins.str = ..., + filenames: _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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["directory", b"directory", "filenames", b"filenames", "message", b"message", "offset", b"offset", "status", b"status", "total_count", b"total_count"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___DirectoryListing = DirectoryListing +Global___DirectoryListing: _TypeAlias = DirectoryListing # noqa: Y015 -@typing.final -class I2CTransaction(google.protobuf.message.Message): +@_typing.final +class I2CTransaction(_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 + DESCRIPTOR: _descriptor.Descriptor - ADDRESS_FIELD_NUMBER: builtins.int - WRITE_DATA_FIELD_NUMBER: builtins.int - READ_LEN_FIELD_NUMBER: builtins.int - address: builtins.int + 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 + write_data: _builtins.bytes """Bytes to write, may be empty""" - read_len: builtins.int + 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. @@ -261,26 +269,30 @@ class I2CTransaction(google.protobuf.message.Message): def __init__( self, *, - address: builtins.int = ..., - write_data: builtins.bytes = ..., - read_len: builtins.int = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["address", b"address", "read_len", b"read_len", "write_data", b"write_data"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___I2CTransaction = I2CTransaction +Global___I2CTransaction: _TypeAlias = I2CTransaction # noqa: Y015 -@typing.final -class SdCardInfo(google.protobuf.message.Message): +@_typing.final +class SdCardInfo(_message.Message): """SD card statistics""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _CardType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _CardTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SdCardInfo._CardType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _CardTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SdCardInfo._CardType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor NONE: SdCardInfo._CardType.ValueType # 0 MMC: SdCardInfo._CardType.ValueType # 1 SD: SdCardInfo._CardType.ValueType # 2 @@ -297,11 +309,11 @@ class SdCardInfo(google.protobuf.message.Message): UNKNOWN_CARD: SdCardInfo.CardType.ValueType # 5 class _FatType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _FatTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SdCardInfo._FatType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _FatTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SdCardInfo._FatType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNKNOWN_FAT: SdCardInfo._FatType.ValueType # 0 FAT16: SdCardInfo._FatType.ValueType # 1 FAT32: SdCardInfo._FatType.ValueType # 2 @@ -313,70 +325,74 @@ class SdCardInfo(google.protobuf.message.Message): 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 + 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 + 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: _builtins.int """Used bytes (may be expensive to compute on FAT32)""" - free_bytes: builtins.int + free_bytes: _builtins.int """Free bytes""" - stats_valid: builtins.bool + 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 + 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 + 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 = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___SdCardInfo = SdCardInfo +Global___SdCardInfo: _TypeAlias = SdCardInfo # noqa: Y015 -@typing.final -class I2CResult(google.protobuf.message.Message): +@_typing.final +class I2CResult(_message.Message): """Result of an I2CTransaction""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Status: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[I2CResult._Status.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _StatusEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[I2CResult._Status.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNSPECIFIED: I2CResult._Status.ValueType # 0 """Never sent: an all-defaults (e.g. accidentally empty) message must not decode as a successful transaction @@ -396,107 +412,115 @@ class I2CResult(google.protobuf.message.Message): 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 + 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 = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["read_data", b"read_data", "status", b"status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___I2CResult = I2CResult +Global___I2CResult: _TypeAlias = I2CResult # noqa: Y015 -@typing.final -class InterdeviceMessage(google.protobuf.message.Message): +@_typing.final +class InterdeviceMessage(_message.Message): """Main message for interdevice communication""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ID_FIELD_NUMBER: builtins.int - NMEA_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 + DESCRIPTOR: _descriptor.Descriptor + + ID_FIELD_NUMBER: _builtins.int + NMEA_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 + nmea: _builtins.str + beep: _builtins.int + i2c_scan: _builtins.bool """Request: scan the secondary I2C bus""" - i2c_scan_result: builtins.bytes + i2c_scan_result: _builtins.bytes """Response: 7-bit addresses of discovered devices""" - get_sd_info: builtins.bool + get_sd_info: _builtins.bool """Request: SD card statistics""" - ping: global___InterdeviceVersion.ValueType + 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 + 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 + 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 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: + @_builtins.property + def i2c_transaction(self) -> Global___I2CTransaction: ... + @_builtins.property + def i2c_result(self) -> Global___I2CResult: ... + @_builtins.property + def file_transfer(self) -> Global___FileTransfer: ... + @_builtins.property + def directory_listing(self) -> Global___DirectoryListing: ... + @_builtins.property + def sd_info(self) -> Global___SdCardInfo: """Response""" def __init__( self, *, - id: builtins.int = ..., - nmea: builtins.str = ..., - 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 = ..., + id: _builtins.int = ..., + nmea: _builtins.str = ..., + 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["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 + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_data: _TypeAlias = _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"] # noqa: Y015 + _WhichOneofArgType_data: _TypeAlias = _typing.Literal["data", b"data"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_data) -> _WhichOneofReturnType_data | None: ... + +Global___InterdeviceMessage: _TypeAlias = InterdeviceMessage # noqa: Y015 diff --git a/meshtastic/protobuf/localonly_pb2.py b/meshtastic/protobuf/localonly_pb2.py index 6a34042f4..cbf99406a 100644 --- a/meshtastic/protobuf/localonly_pb2.py +++ b/meshtastic/protobuf/localonly_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/localonly.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -15,16 +16,16 @@ 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\"\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') +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\"\xa4\x04\n\x0bLocalConfig\x12\x31\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfig\x12\x35\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfig\x12/\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfig\x12\x33\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfig\x12\x33\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfig\x12-\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfig\x12\x37\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfig\x12\x35\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfig\x12/\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfig\x12/\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfig\x12\x0f\n\x07version\x18\r \x01(\r\"\x81\x08\n\x11LocalModuleConfig\x12-\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfig\x12\x31\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfig\x12N\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfig\x12>\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfig\x12\x37\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfig\x12@\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfig\x12/\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfig\x12\x42\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfig\x12>\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfig\x12\x44\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfig\x12\x44\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfig\x12\x39\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfig\x12?\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfig\x12H\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfig\x12+\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfig\x12:\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfig\x12\x0f\n\x07version\x18\x11 \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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.localonly_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_LOCALCONFIG']._serialized_start=136 - _globals['_LOCALCONFIG']._serialized_end=642 - _globals['_LOCALMODULECONFIG']._serialized_start=645 - _globals['_LOCALMODULECONFIG']._serialized_end=1949 + _globals['_LOCALCONFIG']._serialized_end=684 + _globals['_LOCALMODULECONFIG']._serialized_start=687 + _globals['_LOCALMODULECONFIG']._serialized_end=1712 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/localonly_pb2.pyi b/meshtastic/protobuf/localonly_pb2.pyi index 04ae9d490..d327de876 100644 --- a/meshtastic/protobuf/localonly_pb2.pyi +++ b/meshtastic/protobuf/localonly_pb2.pyi @@ -3,231 +3,258 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import meshtastic.protobuf.config_pb2 -import meshtastic.protobuf.module_config_pb2 -import typing - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -@typing.final -class LocalConfig(google.protobuf.message.Message): +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from . import config_pb2 as _config_pb2 +from . import module_config_pb2 as _module_config_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class LocalConfig(_message.Message): """ Protobuf structures common to apponly.proto and deviceonly.proto This is never sent over the wire, only for local use + + + Every config section, stored. A section's field number is its ConfigPayload tag; + the session key is not stored, and version sits above every section tag. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - DEVICE_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - POWER_FIELD_NUMBER: builtins.int - NETWORK_FIELD_NUMBER: builtins.int - DISPLAY_FIELD_NUMBER: builtins.int - LORA_FIELD_NUMBER: builtins.int - BLUETOOTH_FIELD_NUMBER: builtins.int - VERSION_FIELD_NUMBER: builtins.int - SECURITY_FIELD_NUMBER: builtins.int - version: builtins.int + DESCRIPTOR: _descriptor.Descriptor + + DEVICE_FIELD_NUMBER: _builtins.int + POSITION_FIELD_NUMBER: _builtins.int + POWER_FIELD_NUMBER: _builtins.int + NETWORK_FIELD_NUMBER: _builtins.int + DISPLAY_FIELD_NUMBER: _builtins.int + LORA_FIELD_NUMBER: _builtins.int + BLUETOOTH_FIELD_NUMBER: _builtins.int + SECURITY_FIELD_NUMBER: _builtins.int + RELAY_FIELD_NUMBER: _builtins.int + GROUP_FIELD_NUMBER: _builtins.int + VERSION_FIELD_NUMBER: _builtins.int + version: _builtins.int """ A version integer used to invalidate old save files when we make incompatible changes This integer is set at build time and is private to NodeDB.cpp in the device code. """ - @property - def device(self) -> meshtastic.protobuf.config_pb2.Config.DeviceConfig: + @_builtins.property + def device(self) -> _config_pb2.DeviceConfig: """ The part of the config that is specific to the Device """ - @property - def position(self) -> meshtastic.protobuf.config_pb2.Config.PositionConfig: + @_builtins.property + def position(self) -> _config_pb2.PositionConfig: """ The part of the config that is specific to the GPS Position """ - @property - def power(self) -> meshtastic.protobuf.config_pb2.Config.PowerConfig: + @_builtins.property + def power(self) -> _config_pb2.PowerConfig: """ The part of the config that is specific to the Power settings """ - @property - def network(self) -> meshtastic.protobuf.config_pb2.Config.NetworkConfig: + @_builtins.property + def network(self) -> _config_pb2.NetworkConfig: """ The part of the config that is specific to the Wifi Settings """ - @property - def display(self) -> meshtastic.protobuf.config_pb2.Config.DisplayConfig: + @_builtins.property + def display(self) -> _config_pb2.DisplayConfig: """ The part of the config that is specific to the Display """ - @property - def lora(self) -> meshtastic.protobuf.config_pb2.Config.LoRaConfig: + @_builtins.property + def lora(self) -> _config_pb2.LoRaConfig: """ The part of the config that is specific to the Lora Radio """ - @property - def bluetooth(self) -> meshtastic.protobuf.config_pb2.Config.BluetoothConfig: + @_builtins.property + def bluetooth(self) -> _config_pb2.BluetoothConfig: """ The part of the config that is specific to the Bluetooth settings """ - @property - def security(self) -> meshtastic.protobuf.config_pb2.Config.SecurityConfig: + @_builtins.property + def security(self) -> _config_pb2.SecurityConfig: """ The part of the config that is specific to Security settings """ + @_builtins.property + def relay(self) -> _config_pb2.RelayConfig: + """ + The part of the config that decides how this node relays per channel hash + """ + + @_builtins.property + def group(self) -> _config_pb2.GroupConfig: + """ + The part of the config that holds the anycast groups this node sends to or serves + """ + def __init__( self, *, - device: meshtastic.protobuf.config_pb2.Config.DeviceConfig | None = ..., - position: meshtastic.protobuf.config_pb2.Config.PositionConfig | None = ..., - power: meshtastic.protobuf.config_pb2.Config.PowerConfig | None = ..., - network: meshtastic.protobuf.config_pb2.Config.NetworkConfig | None = ..., - display: meshtastic.protobuf.config_pb2.Config.DisplayConfig | None = ..., - lora: meshtastic.protobuf.config_pb2.Config.LoRaConfig | None = ..., - bluetooth: meshtastic.protobuf.config_pb2.Config.BluetoothConfig | None = ..., - version: builtins.int = ..., - security: meshtastic.protobuf.config_pb2.Config.SecurityConfig | None = ..., + device: _config_pb2.DeviceConfig | None = ..., + position: _config_pb2.PositionConfig | None = ..., + power: _config_pb2.PowerConfig | None = ..., + network: _config_pb2.NetworkConfig | None = ..., + display: _config_pb2.DisplayConfig | None = ..., + lora: _config_pb2.LoRaConfig | None = ..., + bluetooth: _config_pb2.BluetoothConfig | None = ..., + security: _config_pb2.SecurityConfig | None = ..., + relay: _config_pb2.RelayConfig | None = ..., + group: _config_pb2.GroupConfig | None = ..., + version: _builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "security", b"security"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "security", b"security", "version", b"version"]) -> None: ... - -global___LocalConfig = LocalConfig - -@typing.final -class LocalModuleConfig(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - MQTT_FIELD_NUMBER: builtins.int - SERIAL_FIELD_NUMBER: builtins.int - EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int - STORE_FORWARD_FIELD_NUMBER: builtins.int - RANGE_TEST_FIELD_NUMBER: builtins.int - TELEMETRY_FIELD_NUMBER: builtins.int - CANNED_MESSAGE_FIELD_NUMBER: builtins.int - AUDIO_FIELD_NUMBER: builtins.int - REMOTE_HARDWARE_FIELD_NUMBER: builtins.int - NEIGHBOR_INFO_FIELD_NUMBER: builtins.int - AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int - DETECTION_SENSOR_FIELD_NUMBER: builtins.int - PAXCOUNTER_FIELD_NUMBER: builtins.int - 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 + _HasFieldArgType: _TypeAlias = _typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "group", b"group", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "relay", b"relay", "security", b"security"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "group", b"group", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "relay", b"relay", "security", b"security", "version", b"version"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___LocalConfig: _TypeAlias = LocalConfig # noqa: Y015 + +@_typing.final +class LocalModuleConfig(_message.Message): + """ + Every module config section, stored. A section's field number is its + ModuleConfigPayload tag, and version sits above every section tag. + """ + + DESCRIPTOR: _descriptor.Descriptor + + MQTT_FIELD_NUMBER: _builtins.int + SERIAL_FIELD_NUMBER: _builtins.int + EXTERNAL_NOTIFICATION_FIELD_NUMBER: _builtins.int + STORE_FORWARD_FIELD_NUMBER: _builtins.int + TELEMETRY_FIELD_NUMBER: _builtins.int + CANNED_MESSAGE_FIELD_NUMBER: _builtins.int + AUDIO_FIELD_NUMBER: _builtins.int + REMOTE_HARDWARE_FIELD_NUMBER: _builtins.int + NEIGHBOR_INFO_FIELD_NUMBER: _builtins.int + AMBIENT_LIGHTING_FIELD_NUMBER: _builtins.int + DETECTION_SENSOR_FIELD_NUMBER: _builtins.int + PAXCOUNTER_FIELD_NUMBER: _builtins.int + 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 """ A version integer used to invalidate old save files when we make incompatible changes This integer is set at build time and is private to NodeDB.cpp in the device code. """ - @property - def mqtt(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.MQTTConfig: + @_builtins.property + def mqtt(self) -> _module_config_pb2.MQTTConfig: """ The part of the config that is specific to the MQTT module """ - @property - def serial(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.SerialConfig: + @_builtins.property + def serial(self) -> _module_config_pb2.SerialConfig: """ The part of the config that is specific to the Serial module """ - @property - def external_notification(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.ExternalNotificationConfig: + @_builtins.property + def external_notification(self) -> _module_config_pb2.ExternalNotificationConfig: """ The part of the config that is specific to the ExternalNotification module """ - @property - def store_forward(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.StoreForwardConfig: + @_builtins.property + def store_forward(self) -> _module_config_pb2.StoreForwardConfig: """ The part of the config that is specific to the Store & Forward module """ - @property - def range_test(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.RangeTestConfig: - """ - The part of the config that is specific to the RangeTest module - """ - - @property - def telemetry(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.TelemetryConfig: + @_builtins.property + def telemetry(self) -> _module_config_pb2.TelemetryConfig: """ The part of the config that is specific to the Telemetry module """ - @property - def canned_message(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.CannedMessageConfig: + @_builtins.property + def canned_message(self) -> _module_config_pb2.CannedMessageConfig: """ The part of the config that is specific to the Canned Message module """ - @property - def audio(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.AudioConfig: + @_builtins.property + def audio(self) -> _module_config_pb2.AudioConfig: """ The part of the config that is specific to the Audio module """ - @property - def remote_hardware(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.RemoteHardwareConfig: + @_builtins.property + def remote_hardware(self) -> _module_config_pb2.RemoteHardwareConfig: """ The part of the config that is specific to the Remote Hardware module """ - @property - def neighbor_info(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.NeighborInfoConfig: + @_builtins.property + def neighbor_info(self) -> _module_config_pb2.NeighborInfoConfig: """ The part of the config that is specific to the Neighbor Info module """ - @property - def ambient_lighting(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.AmbientLightingConfig: + @_builtins.property + def ambient_lighting(self) -> _module_config_pb2.AmbientLightingConfig: """ The part of the config that is specific to the Ambient Lighting module """ - @property - def detection_sensor(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.DetectionSensorConfig: + @_builtins.property + def detection_sensor(self) -> _module_config_pb2.DetectionSensorConfig: """ The part of the config that is specific to the Detection Sensor module """ - @property - def paxcounter(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.PaxcounterConfig: + @_builtins.property + def paxcounter(self) -> _module_config_pb2.PaxcounterConfig: """ Paxcounter Config """ - @property - def statusmessage(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.StatusMessageConfig: + @_builtins.property + def statusmessage(self) -> _module_config_pb2.StatusMessageConfig: """ StatusMessage Config """ - @property - def traffic_management(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.TrafficManagementConfig: + @_builtins.property + def traffic_management(self) -> _module_config_pb2.TrafficManagementConfig: """ The part of the config that is specific to the Traffic Management module """ - @property - def tak(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.TAKConfig: + @_builtins.property + def tak(self) -> _module_config_pb2.TAKConfig: """ TAK Config """ - @property - def mesh_beacon(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.MeshBeaconConfig: + @_builtins.property + def mesh_beacon(self) -> _module_config_pb2.MeshBeaconConfig: """ MeshBeacon Config """ @@ -235,26 +262,28 @@ class LocalModuleConfig(google.protobuf.message.Message): def __init__( self, *, - mqtt: meshtastic.protobuf.module_config_pb2.ModuleConfig.MQTTConfig | None = ..., - serial: meshtastic.protobuf.module_config_pb2.ModuleConfig.SerialConfig | None = ..., - external_notification: meshtastic.protobuf.module_config_pb2.ModuleConfig.ExternalNotificationConfig | None = ..., - store_forward: meshtastic.protobuf.module_config_pb2.ModuleConfig.StoreForwardConfig | None = ..., - range_test: meshtastic.protobuf.module_config_pb2.ModuleConfig.RangeTestConfig | None = ..., - telemetry: meshtastic.protobuf.module_config_pb2.ModuleConfig.TelemetryConfig | None = ..., - canned_message: meshtastic.protobuf.module_config_pb2.ModuleConfig.CannedMessageConfig | None = ..., - audio: meshtastic.protobuf.module_config_pb2.ModuleConfig.AudioConfig | None = ..., - remote_hardware: meshtastic.protobuf.module_config_pb2.ModuleConfig.RemoteHardwareConfig | None = ..., - neighbor_info: meshtastic.protobuf.module_config_pb2.ModuleConfig.NeighborInfoConfig | None = ..., - ambient_lighting: meshtastic.protobuf.module_config_pb2.ModuleConfig.AmbientLightingConfig | None = ..., - detection_sensor: meshtastic.protobuf.module_config_pb2.ModuleConfig.DetectionSensorConfig | None = ..., - paxcounter: meshtastic.protobuf.module_config_pb2.ModuleConfig.PaxcounterConfig | None = ..., - 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 = ..., + mqtt: _module_config_pb2.MQTTConfig | None = ..., + serial: _module_config_pb2.SerialConfig | None = ..., + external_notification: _module_config_pb2.ExternalNotificationConfig | None = ..., + store_forward: _module_config_pb2.StoreForwardConfig | None = ..., + telemetry: _module_config_pb2.TelemetryConfig | None = ..., + canned_message: _module_config_pb2.CannedMessageConfig | None = ..., + audio: _module_config_pb2.AudioConfig | None = ..., + remote_hardware: _module_config_pb2.RemoteHardwareConfig | None = ..., + neighbor_info: _module_config_pb2.NeighborInfoConfig | None = ..., + ambient_lighting: _module_config_pb2.AmbientLightingConfig | None = ..., + detection_sensor: _module_config_pb2.DetectionSensorConfig | None = ..., + paxcounter: _module_config_pb2.PaxcounterConfig | None = ..., + statusmessage: _module_config_pb2.StatusMessageConfig | None = ..., + traffic_management: _module_config_pb2.TrafficManagementConfig | None = ..., + tak: _module_config_pb2.TAKConfig | None = ..., + mesh_beacon: _module_config_pb2.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", "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: ... + _HasFieldArgType: _TypeAlias = _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", "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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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", "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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___LocalModuleConfig = LocalModuleConfig +Global___LocalModuleConfig: _TypeAlias = LocalModuleConfig # noqa: Y015 diff --git a/meshtastic/protobuf/lorawan_bridge_pb2.py b/meshtastic/protobuf/lorawan_bridge_pb2.py index 7c183a04b..f9e5d65cd 100644 --- a/meshtastic/protobuf/lorawan_bridge_pb2.py +++ b/meshtastic/protobuf/lorawan_bridge_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/lorawan_bridge.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,58 +15,46 @@ 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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/lorawan_bridge.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xd3\x07\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\x1a\xaa\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_dbm\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\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x17\n\x07payload\x18\x07 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02\x1a\xa9\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\x14\n\x05\x66lags\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nrequest_id\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x07payload\x18\x07 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02\"}\n\x05\x46lags\x12\x11\n\rDOWNLINK_NONE\x10\x00\x12\x16\n\x12\x44OWNLINK_IMMEDIATE\x10\x01\x12\x1c\n\x18\x44OWNLINK_INVERT_POLARITY\x10\x02\x12\x13\n\x0f\x44OWNLINK_NO_CRC\x10\x04\x12\x16\n\x12\x44OWNLINK_MAY_DEFER\x10\x08\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['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\023LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['rssi_dbm']._options = None + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['rssi_dbm']._serialized_options = b'\222?\0028\020' + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['snr_x10']._options = None + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['snr_x10']._serialized_options = b'\222?\0028\020' + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['radio_params']._options = None + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['radio_params']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['fsk_bitrate']._options = None + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['fsk_bitrate']._serialized_options = b'\222?\0028\020' + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['payload']._options = None + _globals['_LORAWANBRIDGE_UPLINK'].fields_by_name['payload']._serialized_options = b'\222?\003\010\200\002' + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['radio_params']._options = None + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['radio_params']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['power_dbm']._options = None + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['power_dbm']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['flags']._options = None + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['request_id']._options = None + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['request_id']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['payload']._options = None + _globals['_LORAWANBRIDGE_DOWNLINK'].fields_by_name['payload']._serialized_options = b'\222?\003\010\200\002' + _globals['_LORAWANBRIDGE_TXRESULT'].fields_by_name['request_id']._options = None + _globals['_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 + _globals['_LORAWANBRIDGE']._serialized_end=1079 + _globals['_LORAWANBRIDGE_UPLINK']._serialized_start=310 + _globals['_LORAWANBRIDGE_UPLINK']._serialized_end=480 + _globals['_LORAWANBRIDGE_DOWNLINK']._serialized_start=483 + _globals['_LORAWANBRIDGE_DOWNLINK']._serialized_end=780 + _globals['_LORAWANBRIDGE_DOWNLINK_FLAGS']._serialized_start=655 + _globals['_LORAWANBRIDGE_DOWNLINK_FLAGS']._serialized_end=780 + _globals['_LORAWANBRIDGE_TXRESULT']._serialized_start=783 + _globals['_LORAWANBRIDGE_TXRESULT']._serialized_end=1068 + _globals['_LORAWANBRIDGE_TXRESULT_STATUS']._serialized_start=905 + _globals['_LORAWANBRIDGE_TXRESULT_STATUS']._serialized_end=1068 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/lorawan_bridge_pb2.pyi b/meshtastic/protobuf/lorawan_bridge_pb2.pyi index 82f8eac4b..09a100eb2 100644 --- a/meshtastic/protobuf/lorawan_bridge_pb2.pyi +++ b/meshtastic/protobuf/lorawan_bridge_pb2.pyi @@ -3,64 +3,65 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class LoRaWANBridge(google.protobuf.message.Message): +@_typing.final +class LoRaWANBridge(_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 + DESCRIPTOR: _descriptor.Descriptor - @typing.final - class Uplink(google.protobuf.message.Message): + @_typing.final + class Uplink(_message.Message): """ An uplink heard by the gateway, travelling towards the network server. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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 + FREQ_HZ_FIELD_NUMBER: _builtins.int + TMST_FIELD_NUMBER: _builtins.int + RSSI_DBM_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 + freq_hz: _builtins.int """ Receive frequency in Hz. """ - tmst: builtins.int + tmst: _builtins.int """ Concentrator receive timestamp in microseconds. Free running, wraps about every 72 minutes. """ - rssi_x10: builtins.int + rssi_dbm: _builtins.int """ - Received signal strength in tenths of a dBm. Fits signed 16 bit. + Received signal strength in whole dBm, the scale the Semtech UDP protocol's + "rssi" carries in both directions. Fits signed 16 bit. """ - snr_x10: builtins.int + snr_x10: _builtins.int """ - Signal to noise ratio in tenths of a dB. Fits signed 16 bit. + Signal to noise ratio in tenths of a dB. Tenths rather than the mesh's half-dB + because this field round-trips the Semtech UDP protocol's "lsnr", which is a + float emitted to one decimal. Fits signed 16 bit. """ - radio_params: builtins.int + 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 @@ -70,173 +71,142 @@ class LoRaWANBridge(google.protobuf.message.Message): 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_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 + 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. + PHY payload. A packet too large for the room one frame leaves is fragmented by + the v3 header (HeaderOptions.fragment), not by this message. """ 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 = ..., + freq_hz: _builtins.int = ..., + tmst: _builtins.int = ..., + rssi_dbm: _builtins.int = ..., + snr_x10: _builtins.int = ..., + radio_params: _builtins.int = ..., + fsk_bitrate: _builtins.int = ..., + payload: _builtins.bytes = ..., ) -> 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["freq_hz", b"freq_hz", "fsk_bitrate", b"fsk_bitrate", "payload", b"payload", "radio_params", b"radio_params", "rssi_dbm", b"rssi_dbm", "snr_x10", b"snr_x10", "tmst", b"tmst"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class Downlink(google.protobuf.message.Message): + @_typing.final + class Downlink(_message.Message): """ A downlink from the network server, travelling towards the gateway. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LoRaWANBridge.Downlink._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DOWNLINK_NONE: LoRaWANBridge.Downlink._Flags.ValueType # 0 + """Nothing set""" + DOWNLINK_IMMEDIATE: LoRaWANBridge.Downlink._Flags.ValueType # 1 + """Transmit as soon as possible instead of at tmst. Used for Class C.""" + DOWNLINK_INVERT_POLARITY: LoRaWANBridge.Downlink._Flags.ValueType # 2 + """Invert LoRa polarity. Set on every LoRaWAN downlink.""" + DOWNLINK_NO_CRC: LoRaWANBridge.Downlink._Flags.ValueType # 4 + """Transmit without a CRC""" + DOWNLINK_MAY_DEFER: LoRaWANBridge.Downlink._Flags.ValueType # 8 + """The transmission may be deferred""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Downlink transmit options: a bitwise OR of Flags values. + """ + + DOWNLINK_NONE: LoRaWANBridge.Downlink.Flags.ValueType # 0 + """Nothing set""" + DOWNLINK_IMMEDIATE: LoRaWANBridge.Downlink.Flags.ValueType # 1 + """Transmit as soon as possible instead of at tmst. Used for Class C.""" + DOWNLINK_INVERT_POLARITY: LoRaWANBridge.Downlink.Flags.ValueType # 2 + """Invert LoRa polarity. Set on every LoRaWAN downlink.""" + DOWNLINK_NO_CRC: LoRaWANBridge.Downlink.Flags.ValueType # 4 + """Transmit without a CRC""" + DOWNLINK_MAY_DEFER: LoRaWANBridge.Downlink.Flags.ValueType # 8 + """The transmission may be deferred""" - 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 + FREQ_HZ_FIELD_NUMBER: _builtins.int + TMST_FIELD_NUMBER: _builtins.int + RADIO_PARAMS_FIELD_NUMBER: _builtins.int + POWER_DBM_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + REQUEST_ID_FIELD_NUMBER: _builtins.int + PAYLOAD_FIELD_NUMBER: _builtins.int + freq_hz: _builtins.int """ Transmit frequency in Hz. """ - tmst: builtins.int + tmst: _builtins.int """ Concentrator timestamp to transmit at. Ignored when immediate is set. """ - radio_params: builtins.int + 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 + 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 + flags: _builtins.int """ - Disable the physical layer CRC. + Bitwise OR of Flags values. """ - 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 + 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 + payload: _builtins.bytes """ - This part of the PHY payload. + PHY payload. A packet too large for the room one frame leaves is fragmented by + the v3 header (HeaderOptions.fragment), not by this message. """ def __init__( self, *, - payload_id: builtins.int = ..., - chunk_index: builtins.int = ..., - payload_chunk: builtins.bytes = ..., + freq_hz: _builtins.int = ..., + tmst: _builtins.int = ..., + radio_params: _builtins.int = ..., + power_dbm: _builtins.int = ..., + flags: _builtins.int = ..., + request_id: _builtins.int = ..., + payload: _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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "freq_hz", b"freq_hz", "payload", b"payload", "power_dbm", b"power_dbm", "radio_params", b"radio_params", "request_id", b"request_id", "tmst", b"tmst"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class TxResult(google.protobuf.message.Message): + @_typing.final + class TxResult(_message.Message): """ The outcome of a downlink, reported back towards the network server. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Status: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[LoRaWANBridge.TxResult._Status.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _StatusEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LoRaWANBridge.TxResult._Status.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor NONE: LoRaWANBridge.TxResult._Status.ValueType # 0 TOO_LATE: LoRaWANBridge.TxResult._Status.ValueType # 1 TOO_EARLY: LoRaWANBridge.TxResult._Status.ValueType # 2 @@ -277,53 +247,57 @@ class LoRaWANBridge(google.protobuf.message.Message): 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 + 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 + status: Global___LoRaWANBridge.TxResult.Status.ValueType """ What happened to it. """ - request_id: builtins.int + request_id: _builtins.int """ Echoes Downlink.request_id. """ def __init__( self, *, - tmst: builtins.int = ..., - status: global___LoRaWANBridge.TxResult.Status.ValueType = ..., - request_id: builtins.int = ..., + 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["request_id", b"request_id", "status", b"status", "tmst", b"tmst"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> 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: ... + UPLINK_FIELD_NUMBER: _builtins.int + DOWNLINK_FIELD_NUMBER: _builtins.int + TX_RESULT_FIELD_NUMBER: _builtins.int + @_builtins.property + def uplink(self) -> Global___LoRaWANBridge.Uplink: ... + @_builtins.property + def downlink(self) -> Global___LoRaWANBridge.Downlink: ... + @_builtins.property + def tx_result(self) -> Global___LoRaWANBridge.TxResult: ... def __init__( self, *, - uplink: global___LoRaWANBridge.Uplink | None = ..., - downlink: global___LoRaWANBridge.Downlink | None = ..., - tx_result: global___LoRaWANBridge.TxResult | None = ..., - chunk: global___LoRaWANBridge.PayloadChunk | None = ..., + uplink: Global___LoRaWANBridge.Uplink | None = ..., + downlink: Global___LoRaWANBridge.Downlink | None = ..., + tx_result: Global___LoRaWANBridge.TxResult | 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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["downlink", b"downlink", "tx_result", b"tx_result", "uplink", b"uplink", "variant", b"variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["downlink", b"downlink", "tx_result", b"tx_result", "uplink", b"uplink", "variant", b"variant"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_variant: _TypeAlias = _typing.Literal["uplink", "downlink", "tx_result"] # noqa: Y015 + _WhichOneofArgType_variant: _TypeAlias = _typing.Literal["variant", b"variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_variant) -> _WhichOneofReturnType_variant | None: ... -global___LoRaWANBridge = LoRaWANBridge +Global___LoRaWANBridge: _TypeAlias = LoRaWANBridge # noqa: Y015 diff --git a/meshtastic/protobuf/mesh_beacon_pb2.py b/meshtastic/protobuf/mesh_beacon_pb2.py index 1ae8dc619..92e7ddb11 100644 --- a/meshtastic/protobuf/mesh_beacon_pb2.py +++ b/meshtastic/protobuf/mesh_beacon_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/mesh_beacon.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -12,20 +13,24 @@ 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 common_pb2 as meshtastic_dot_protobuf_dot_common__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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/mesh_beacon.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb0\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\x12<\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12\x42\n\x0coffer_preset\x18\x04 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\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['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\020MeshBeaconProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_MESHBEACON'].fields_by_name['message']._options = None + _globals['_MESHBEACON'].fields_by_name['message']._serialized_options = b'\222?\002\010=' + _globals['_MESHBEACON'].fields_by_name['offer_region']._options = None + _globals['_MESHBEACON'].fields_by_name['offer_region']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACON'].fields_by_name['offer_preset']._options = None + _globals['_MESHBEACON'].fields_by_name['offer_preset']._serialized_options = b'\222?\0028\010' _globals['_MESHBEACON']._serialized_start=166 - _globals['_MESHBEACON']._serialized_end=492 + _globals['_MESHBEACON']._serialized_end=470 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mesh_beacon_pb2.pyi b/meshtastic/protobuf/mesh_beacon_pb2.pyi index 42353d88b..42dea2801 100644 --- a/meshtastic/protobuf/mesh_beacon_pb2.pyi +++ b/meshtastic/protobuf/mesh_beacon_pb2.pyi @@ -3,17 +3,23 @@ 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 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from . import channel_pb2 as _channel_pb2 +from . import common_pb2 as _common_pb2 +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 10): + from typing import TypeAlias as _TypeAlias +else: + from typing_extensions import TypeAlias as _TypeAlias -@typing.final -class MeshBeacon(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class MeshBeacon(_message.Message): """ Payload for MESH_BEACON_APP packets. Periodically broadcast by nodes in beacon mode. @@ -21,29 +27,29 @@ class MeshBeacon(google.protobuf.message.Message): channel/preset for the client app to act on - the firmware never auto-applies them. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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 + 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 + offer_region: _common_pb2.RegionCode.ValueType """ Optional region being advertised alongside offer_preset. """ - offer_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + offer_preset: _common_pb2.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 + offer_frequency_slot: _builtins.int """ - Frequency slot this mesh uses, 1-based, matching Config.LoRaConfig.channel_num. + Frequency slot this mesh uses, 1-based, matching 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. @@ -51,8 +57,8 @@ class MeshBeacon(google.protobuf.message.Message): 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: + @_builtins.property + def offer_channel(self) -> _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. @@ -61,17 +67,23 @@ class MeshBeacon(google.protobuf.message.Message): 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 = ..., + message: _builtins.str = ..., + offer_channel: _channel_pb2.ChannelSettings | None = ..., + offer_region: _common_pb2.RegionCode.ValueType = ..., + offer_preset: _common_pb2.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: ... + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__offer_frequency_slot: _TypeAlias = _typing.Literal["offer_frequency_slot"] # noqa: Y015 + _WhichOneofArgType__offer_frequency_slot: _TypeAlias = _typing.Literal["_offer_frequency_slot", b"_offer_frequency_slot"] # noqa: Y015 + _WhichOneofReturnType__offer_preset: _TypeAlias = _typing.Literal["offer_preset"] # noqa: Y015 + _WhichOneofArgType__offer_preset: _TypeAlias = _typing.Literal["_offer_preset", b"_offer_preset"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__offer_frequency_slot) -> _WhichOneofReturnType__offer_frequency_slot | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__offer_preset) -> _WhichOneofReturnType__offer_preset | None: ... -global___MeshBeacon = MeshBeacon +Global___MeshBeacon: _TypeAlias = MeshBeacon # noqa: Y015 diff --git a/meshtastic/protobuf/mesh_pb2.py b/meshtastic/protobuf/mesh_pb2.py deleted file mode 100644 index 050329264..000000000 --- a/meshtastic/protobuf/mesh_pb2.py +++ /dev/null @@ -1,274 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: meshtastic/protobuf/mesh.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 device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 -from meshtastic.protobuf import portnums_pb2 as meshtastic_dot_protobuf_dot_portnums__pb2 -from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 -from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem__pb2 -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\"\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) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mesh_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _USER.fields_by_name['id']._options = None - _USER.fields_by_name['id']._serialized_options = b'\222?\002\010\020' - _USER.fields_by_name['long_name']._options = None - _USER.fields_by_name['long_name']._serialized_options = b'\222?\002\010(' - _USER.fields_by_name['short_name']._options = None - _USER.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' - _USER.fields_by_name['macaddr']._options = None - _USER.fields_by_name['macaddr']._serialized_options = b'\030\001\222?\004\010\006x\001' - _USER.fields_by_name['public_key']._options = None - _USER.fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' - _ROUTEDISCOVERY.fields_by_name['route']._options = None - _ROUTEDISCOVERY.fields_by_name['route']._serialized_options = b'\222?\002\020\010' - _ROUTEDISCOVERY.fields_by_name['snr_towards']._options = None - _ROUTEDISCOVERY.fields_by_name['snr_towards']._serialized_options = b'\222?\004\020\0108\010' - _ROUTEDISCOVERY.fields_by_name['route_back']._options = None - _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 - _KEYVERIFICATION.fields_by_name['hash2']._serialized_options = b'\222?\002\010 ' - _STOREFORWARDPLUSPLUS.fields_by_name['message_hash']._options = None - _STOREFORWARDPLUSPLUS.fields_by_name['message_hash']._serialized_options = b'\222?\002\010 ' - _STOREFORWARDPLUSPLUS.fields_by_name['commit_hash']._options = None - _STOREFORWARDPLUSPLUS.fields_by_name['commit_hash']._serialized_options = b'\222?\002\010 ' - _STOREFORWARDPLUSPLUS.fields_by_name['root_hash']._options = None - _STOREFORWARDPLUSPLUS.fields_by_name['root_hash']._serialized_options = b'\222?\002\010 ' - _STOREFORWARDPLUSPLUS.fields_by_name['message']._options = None - _STOREFORWARDPLUSPLUS.fields_by_name['message']._serialized_options = b'\222?\003\010\360\001' - _REMOTESHELL.fields_by_name['payload']._options = None - _REMOTESHELL.fields_by_name['payload']._serialized_options = b'\222?\003\010\310\001' - _WAYPOINT.fields_by_name['id']._options = None - _WAYPOINT.fields_by_name['id']._serialized_options = b'\222?\002\010\020' - _WAYPOINT.fields_by_name['name']._options = None - _WAYPOINT.fields_by_name['name']._serialized_options = b'\222?\002\010\036' - _WAYPOINT.fields_by_name['description']._options = None - _WAYPOINT.fields_by_name['description']._serialized_options = b'\222?\002\010d' - _STATUSMESSAGE.fields_by_name['status']._options = None - _STATUSMESSAGE.fields_by_name['status']._serialized_options = b'\222?\002\010P' - _MQTTCLIENTPROXYMESSAGE.fields_by_name['topic']._options = None - _MQTTCLIENTPROXYMESSAGE.fields_by_name['topic']._serialized_options = b'\222?\002\010<' - _MQTTCLIENTPROXYMESSAGE.fields_by_name['data']._options = None - _MQTTCLIENTPROXYMESSAGE.fields_by_name['data']._serialized_options = b'\222?\003\010\263\003' - _MQTTCLIENTPROXYMESSAGE.fields_by_name['text']._options = None - _MQTTCLIENTPROXYMESSAGE.fields_by_name['text']._serialized_options = b'\222?\003\010\263\003' - _MESHPACKET.fields_by_name['channel']._options = None - _MESHPACKET.fields_by_name['channel']._serialized_options = b'\222?\0028\010' - _MESHPACKET.fields_by_name['encrypted']._options = None - _MESHPACKET.fields_by_name['encrypted']._serialized_options = b'\222?\003\010\200\002' - _MESHPACKET.fields_by_name['id']._options = None - _MESHPACKET.fields_by_name['id']._serialized_options = b'\222?\002\010\020' - _MESHPACKET.fields_by_name['hop_limit']._options = None - _MESHPACKET.fields_by_name['hop_limit']._serialized_options = b'\222?\0028\010' - _MESHPACKET.fields_by_name['delayed']._options = None - _MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001' - _MESHPACKET.fields_by_name['hop_start']._options = None - _MESHPACKET.fields_by_name['hop_start']._serialized_options = b'\222?\0028\010' - _MESHPACKET.fields_by_name['public_key']._options = None - _MESHPACKET.fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' - _MESHPACKET.fields_by_name['next_hop']._options = None - _MESHPACKET.fields_by_name['next_hop']._serialized_options = b'\222?\0028\010' - _MESHPACKET.fields_by_name['relay_node']._options = None - _MESHPACKET.fields_by_name['relay_node']._serialized_options = b'\222?\0028\010' - _NODEINFO.fields_by_name['channel']._options = None - _NODEINFO.fields_by_name['channel']._serialized_options = b'\222?\0028\010' - _NODEINFO.fields_by_name['hops_away']._options = None - _NODEINFO.fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' - _MYNODEINFO.fields_by_name['device_id']._options = None - _MYNODEINFO.fields_by_name['device_id']._serialized_options = b'\222?\002\010\020' - _MYNODEINFO.fields_by_name['pio_env']._options = None - _MYNODEINFO.fields_by_name['pio_env']._serialized_options = b'\222?\002\010(' - _MYNODEINFO.fields_by_name['firmware_edition']._options = None - _MYNODEINFO.fields_by_name['firmware_edition']._serialized_options = b'\222?\0028\010' - _MYNODEINFO.fields_by_name['nodedb_count']._options = None - _MYNODEINFO.fields_by_name['nodedb_count']._serialized_options = b'\222?\0028\020' - _LOGRECORD.fields_by_name['message']._options = None - _LOGRECORD.fields_by_name['message']._serialized_options = b'\222?\003\010\200\003' - _LOGRECORD.fields_by_name['source']._options = None - _LOGRECORD.fields_by_name['source']._serialized_options = b'\222?\002\010 ' - _QUEUESTATUS.fields_by_name['res']._options = None - _QUEUESTATUS.fields_by_name['res']._serialized_options = b'\222?\0028\010' - _QUEUESTATUS.fields_by_name['free']._options = None - _QUEUESTATUS.fields_by_name['free']._serialized_options = b'\222?\0028\010' - _QUEUESTATUS.fields_by_name['maxlen']._options = None - _QUEUESTATUS.fields_by_name['maxlen']._serialized_options = b'\222?\0028\010' - _FROMRADIO.fields_by_name['id']._options = None - _FROMRADIO.fields_by_name['id']._serialized_options = b'\222?\002\010\020' - _LOCKDOWNSTATUS.fields_by_name['lock_reason']._options = None - _LOCKDOWNSTATUS.fields_by_name['lock_reason']._serialized_options = b'\222?\002\010 ' - _CLIENTNOTIFICATION.fields_by_name['message']._options = None - _CLIENTNOTIFICATION.fields_by_name['message']._serialized_options = b'\222?\003\010\220\003' - _KEYVERIFICATIONNUMBERINFORM.fields_by_name['remote_longname']._options = None - _KEYVERIFICATIONNUMBERINFORM.fields_by_name['remote_longname']._serialized_options = b'\222?\002\010(' - _KEYVERIFICATIONNUMBERREQUEST.fields_by_name['remote_longname']._options = None - _KEYVERIFICATIONNUMBERREQUEST.fields_by_name['remote_longname']._serialized_options = b'\222?\002\010(' - _KEYVERIFICATIONFINAL.fields_by_name['remote_longname']._options = None - _KEYVERIFICATIONFINAL.fields_by_name['remote_longname']._serialized_options = b'\222?\002\010(' - _KEYVERIFICATIONFINAL.fields_by_name['verification_characters']._options = None - _KEYVERIFICATIONFINAL.fields_by_name['verification_characters']._serialized_options = b'\222?\002\010\n' - _FILEINFO.fields_by_name['file_name']._options = None - _FILEINFO.fields_by_name['file_name']._serialized_options = b'\222?\003\010\344\001' - _COMPRESSED.fields_by_name['data']._options = None - _COMPRESSED.fields_by_name['data']._serialized_options = b'\222?\003\010\351\001' - _NEIGHBORINFO.fields_by_name['neighbors']._options = None - _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=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 - _globals['_POSITION_LOCSOURCE']._serialized_end=1038 - _globals['_POSITION_ALTSOURCE']._serialized_start=1040 - _globals['_POSITION_ALTSOURCE']._serialized_end=1138 - _globals['_USER']._serialized_start=1268 - _globals['_USER']._serialized_end=1587 - _globals['_ROUTEDISCOVERY']._serialized_start=1589 - _globals['_ROUTEDISCOVERY']._serialized_end=1711 - _globals['_ROUTING']._serialized_start=1714 - _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 deleted file mode 100644 index 9db175710..000000000 --- a/meshtastic/protobuf/mesh_pb2.pyi +++ /dev/null @@ -1,5018 +0,0 @@ -""" -@generated by mypy-protobuf. Do not edit manually! -isort:skip_file -""" - -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import meshtastic.protobuf.channel_pb2 -import meshtastic.protobuf.config_pb2 -import meshtastic.protobuf.device_ui_pb2 -import meshtastic.protobuf.module_config_pb2 -import meshtastic.protobuf.portnums_pb2 -import meshtastic.protobuf.telemetry_pb2 -import meshtastic.protobuf.xmodem_pb2 -import sys -import typing - -if sys.version_info >= (3, 10): - import typing as typing_extensions -else: - import typing_extensions - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -class _HardwareModel: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_HardwareModel.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: _HardwareModel.ValueType # 0 - """ - TODO: REPLACE - """ - TLORA_V2: _HardwareModel.ValueType # 1 - """ - TODO: REPLACE - """ - TLORA_V1: _HardwareModel.ValueType # 2 - """ - TODO: REPLACE - """ - TLORA_V2_1_1P6: _HardwareModel.ValueType # 3 - """ - TODO: REPLACE - """ - TBEAM: _HardwareModel.ValueType # 4 - """ - TODO: REPLACE - """ - HELTEC_V2_0: _HardwareModel.ValueType # 5 - """ - The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13 - (see HELTEC_V2 for the new version). - """ - TBEAM_V0P7: _HardwareModel.ValueType # 6 - """ - TODO: REPLACE - """ - T_ECHO: _HardwareModel.ValueType # 7 - """ - TODO: REPLACE - """ - TLORA_V1_1P3: _HardwareModel.ValueType # 8 - """ - TODO: REPLACE - """ - RAK4631: _HardwareModel.ValueType # 9 - """ - TODO: REPLACE - """ - HELTEC_V2_1: _HardwareModel.ValueType # 10 - """ - The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. - Sadly they did not update anything on the silkscreen to identify this board - """ - HELTEC_V1: _HardwareModel.ValueType # 11 - """ - Ancient heltec WiFi_Lora_32 board - """ - LILYGO_TBEAM_S3_CORE: _HardwareModel.ValueType # 12 - """ - New T-BEAM with ESP32-S3 CPU - """ - RAK11200: _HardwareModel.ValueType # 13 - """ - RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/ - """ - NANO_G1: _HardwareModel.ValueType # 14 - """ - B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano - """ - TLORA_V2_1_1P8: _HardwareModel.ValueType # 15 - """ - TODO: REPLACE - """ - TLORA_T3_S3: _HardwareModel.ValueType # 16 - """ - TODO: REPLACE - """ - NANO_G1_EXPLORER: _HardwareModel.ValueType # 17 - """ - B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer - """ - NANO_G2_ULTRA: _HardwareModel.ValueType # 18 - """ - B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra - """ - LORA_TYPE: _HardwareModel.ValueType # 19 - """ - LoRAType device: https://loratype.org/ - """ - WIPHONE: _HardwareModel.ValueType # 20 - """ - wiphone https://www.wiphone.io/ - """ - WIO_WM1110: _HardwareModel.ValueType # 21 - """ - WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk - """ - RAK2560: _HardwareModel.ValueType # 22 - """ - RAK2560 Solar base station based on RAK4630 - """ - HELTEC_HRU_3601: _HardwareModel.ValueType # 23 - """ - Heltec HRU-3601: https://heltec.org/project/hru-3601/ - """ - HELTEC_WIRELESS_BRIDGE: _HardwareModel.ValueType # 24 - """ - Heltec Wireless Bridge - """ - STATION_G1: _HardwareModel.ValueType # 25 - """ - B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station - """ - RAK11310: _HardwareModel.ValueType # 26 - """ - RAK11310 (RP2040 + SX1262) - """ - MAKERFABS_TRACKER: _HardwareModel.ValueType # 27 - """ - Makerfabs Tracker Reserved - """ - MAKERFABS_RESERVED: _HardwareModel.ValueType # 28 - """ - Makerfabs Reserved - """ - CANARYONE: _HardwareModel.ValueType # 29 - """ - Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone - """ - RP2040_LORA: _HardwareModel.ValueType # 30 - """ - Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm - """ - STATION_G2: _HardwareModel.ValueType # 31 - """ - B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2 - """ - LORA_RELAY_V1: _HardwareModel.ValueType # 32 - """ - --------------------------------------------------------------------------- - Less common/prototype boards listed here (needs one more byte over the air) - --------------------------------------------------------------------------- - """ - T_ECHO_PLUS: _HardwareModel.ValueType # 33 - """ - T-Echo Plus device from LilyGo - """ - PPR: _HardwareModel.ValueType # 34 - """ - TODO: REPLACE - """ - GENIEBLOCKS: _HardwareModel.ValueType # 35 - """ - TODO: REPLACE - """ - NRF52_UNKNOWN: _HardwareModel.ValueType # 36 - """ - TODO: REPLACE - """ - PORTDUINO: _HardwareModel.ValueType # 37 - """ - TODO: REPLACE - """ - ANDROID_SIM: _HardwareModel.ValueType # 38 - """ - The simulator built into the android app - """ - DIY_V1: _HardwareModel.ValueType # 39 - """ - Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics - """ - NRF52840_PCA10059: _HardwareModel.ValueType # 40 - """ - nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ - """ - DR_DEV: _HardwareModel.ValueType # 41 - """ - Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3 - """ - M5STACK: _HardwareModel.ValueType # 42 - """ - M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ - """ - HELTEC_V3: _HardwareModel.ValueType # 43 - """ - New Heltec LoRA32 with ESP32-S3 CPU - """ - HELTEC_WSL_V3: _HardwareModel.ValueType # 44 - """ - New Heltec Wireless Stick Lite with ESP32-S3 CPU - """ - BETAFPV_2400_TX: _HardwareModel.ValueType # 45 - """ - New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU - """ - BETAFPV_900_NANO_TX: _HardwareModel.ValueType # 46 - """ - BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU - """ - RPI_PICO: _HardwareModel.ValueType # 47 - """ - Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module - """ - HELTEC_WIRELESS_TRACKER: _HardwareModel.ValueType # 48 - """ - Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT - Newer V1.1, version is written on the PCB near the display. - """ - HELTEC_WIRELESS_PAPER: _HardwareModel.ValueType # 49 - """ - Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display - """ - T_DECK: _HardwareModel.ValueType # 50 - """ - LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display - """ - T_WATCH_S3: _HardwareModel.ValueType # 51 - """ - LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display - """ - PICOMPUTER_S3: _HardwareModel.ValueType # 52 - """ - Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display - """ - HELTEC_HT62: _HardwareModel.ValueType # 53 - """ - Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa - """ - EBYTE_ESP32_S3: _HardwareModel.ValueType # 54 - """ - EBYTE SPI LoRa module and ESP32-S3 - """ - ESP32_S3_PICO: _HardwareModel.ValueType # 55 - """ - Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink - """ - CHATTER_2: _HardwareModel.ValueType # 56 - """ - CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom - Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible - with one cut and one jumper Meshtastic works - """ - HELTEC_WIRELESS_PAPER_V1_0: _HardwareModel.ValueType # 57 - """ - Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display - Older "V1.0" Variant, has no "version sticker" - E-Ink model is DEPG0213BNS800 - Tab on the screen protector is RED - Flex connector marking is FPC-7528B - """ - HELTEC_WIRELESS_TRACKER_V1_0: _HardwareModel.ValueType # 58 - """ - Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT - Older "V1.0" Variant - """ - UNPHONE: _HardwareModel.ValueType # 59 - """ - unPhone with ESP32-S3, TFT touchscreen, LSM6DS3TR-C accelerometer and gyroscope - """ - TD_LORAC: _HardwareModel.ValueType # 60 - """ - Teledatics TD-LORAC NRF52840 based M.2 LoRA module - Compatible with the TD-WRLS development board - """ - CDEBYTE_EORA_S3: _HardwareModel.ValueType # 61 - """ - CDEBYTE EoRa-S3 board using their own MM modules, clone of LILYGO T3S3 - """ - TWC_MESH_V4: _HardwareModel.ValueType # 62 - """ - TWC_MESH_V4 - Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS - """ - NRF52_PROMICRO_DIY: _HardwareModel.ValueType # 63 - """ - NRF52_PROMICRO_DIY - Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS - """ - RADIOMASTER_900_BANDIT_NANO: _HardwareModel.ValueType # 64 - """ - RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module - ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS - """ - HELTEC_CAPSULE_SENSOR_V3: _HardwareModel.ValueType # 65 - """ - Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors - """ - HELTEC_VISION_MASTER_T190: _HardwareModel.ValueType # 66 - """ - Heltec Vision Master T190 with ESP32-S3 CPU, and a 1.90 inch TFT display - """ - HELTEC_VISION_MASTER_E213: _HardwareModel.ValueType # 67 - """ - Heltec Vision Master E213 with ESP32-S3 CPU, and a 2.13 inch E-Ink display - """ - HELTEC_VISION_MASTER_E290: _HardwareModel.ValueType # 68 - """ - Heltec Vision Master E290 with ESP32-S3 CPU, and a 2.9 inch E-Ink display - """ - HELTEC_MESH_NODE_T114: _HardwareModel.ValueType # 69 - """ - Heltec Mesh Node T114 board with nRF52840 CPU, and a 1.14 inch TFT display, Ultimate low-power design, - specifically adapted for the Meshtatic project - """ - SENSECAP_INDICATOR: _HardwareModel.ValueType # 70 - """ - Sensecap Indicator from Seeed Studio. ESP32-S3 device with TFT and RP2040 coprocessor - """ - TRACKER_T1000_E: _HardwareModel.ValueType # 71 - """ - Seeed studio T1000-E tracker card. NRF52840 w/ LR1110 radio, GPS, button, buzzer, and sensors. - """ - RAK3172: _HardwareModel.ValueType # 72 - """ - RAK3172 STM32WLE5 Module (https://store.rakwireless.com/products/wisduo-lpwan-module-rak3172) - """ - WIO_E5: _HardwareModel.ValueType # 73 - """ - Seeed Studio Wio-E5 (either mini or Dev kit) using STM32WL chip. - """ - RADIOMASTER_900_BANDIT: _HardwareModel.ValueType # 74 - """ - RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module - SSD1306 OLED and No GPS - """ - ME25LS01_4Y10TD: _HardwareModel.ValueType # 75 - """ - Minewsemi ME25LS01 (ME25LE01_V1.0). NRF52840 w/ LR1110 radio, buttons and leds and pins. - """ - RP2040_FEATHER_RFM95: _HardwareModel.ValueType # 76 - """ - RP2040_FEATHER_RFM95 - Adafruit Feather RP2040 with RFM95 LoRa Radio RFM95 with SX1272, SSD1306 OLED - https://www.adafruit.com/product/5714 - https://www.adafruit.com/product/326 - https://www.adafruit.com/product/938 - ^^^ short A0 to switch to I2C address 0x3C - """ - M5STACK_COREBASIC: _HardwareModel.ValueType # 77 - """M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/""" - M5STACK_CORE2: _HardwareModel.ValueType # 78 - RPI_PICO2: _HardwareModel.ValueType # 79 - """Pico2 with Waveshare Hat, same as Pico""" - M5STACK_CORES3: _HardwareModel.ValueType # 80 - """M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/""" - SEEED_XIAO_S3: _HardwareModel.ValueType # 81 - """Seeed XIAO S3 DK""" - MS24SF1: _HardwareModel.ValueType # 82 - """ - Nordic nRF52840+Semtech SX1262 LoRa BLE Combo Module. nRF52840+SX1262 MS24SF1 - """ - TLORA_C6: _HardwareModel.ValueType # 83 - """ - Lilygo TLora-C6 with the new ESP32-C6 MCU - """ - WISMESH_TAP: _HardwareModel.ValueType # 84 - """ - WisMesh Tap - RAK-4631 w/ TFT in injection modled case - """ - ROUTASTIC: _HardwareModel.ValueType # 85 - """ - Similar to PORTDUINO but used by Routastic devices, this is not any - particular device and does not run Meshtastic's code but supports - the same frame format. - Runs on linux, see https://github.com/Jorropo/routastic - """ - MESH_TAB: _HardwareModel.ValueType # 86 - """ - Mesh-Tab, esp32 based - https://github.com/valzzu/Mesh-Tab - """ - MESHLINK: _HardwareModel.ValueType # 87 - """ - MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog - https://www.loraitalia.it - """ - XIAO_NRF52_KIT: _HardwareModel.ValueType # 88 - """ - Seeed XIAO nRF52840 + Wio SX1262 kit - """ - THINKNODE_M1: _HardwareModel.ValueType # 89 - """ - Elecrow ThinkNode M1 & M2 - https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html - https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) - """ - THINKNODE_M2: _HardwareModel.ValueType # 90 - T_ETH_ELITE: _HardwareModel.ValueType # 91 - """ - Lilygo T-ETH-Elite - """ - HELTEC_SENSOR_HUB: _HardwareModel.ValueType # 92 - """ - Heltec HRI-3621 industrial probe - """ - MUZI_BASE: _HardwareModel.ValueType # 93 - """ - Muzi Works Muzi-Base device - """ - HELTEC_MESH_POCKET: _HardwareModel.ValueType # 94 - """ - Heltec Magnetic Power Bank with Meshtastic compatible - """ - SEEED_SOLAR_NODE: _HardwareModel.ValueType # 95 - """ - Seeed Solar Node - """ - NOMADSTAR_METEOR_PRO: _HardwareModel.ValueType # 96 - """ - NomadStar Meteor Pro https://nomadstar.ch/ - """ - CROWPANEL: _HardwareModel.ValueType # 97 - """ - Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin - """ - LINK_32: _HardwareModel.ValueType # 98 - """ - Lilygo LINK32 board with sensors - """ - SEEED_WIO_TRACKER_L1: _HardwareModel.ValueType # 99 - """ - Seeed Tracker L1 - """ - SEEED_WIO_TRACKER_L1_EINK: _HardwareModel.ValueType # 100 - """ - Seeed Tracker L1 EINK driver - """ - MUZI_R1_NEO: _HardwareModel.ValueType # 101 - """ - Muzi Works R1 Neo - """ - T_DECK_PRO: _HardwareModel.ValueType # 102 - """ - Lilygo T-Deck Pro - """ - T_LORA_PAGER: _HardwareModel.ValueType # 103 - """ - Lilygo TLora Pager - """ - M5STACK_RESERVED: _HardwareModel.ValueType # 104 - """ - M5Stack Reserved - 0x68 - """ - WISMESH_TAG: _HardwareModel.ValueType # 105 - """ - RAKwireless WisMesh Tag - """ - RAK3312: _HardwareModel.ValueType # 106 - """ - RAKwireless WisBlock Core RAK3312 https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/overview/ - """ - THINKNODE_M5: _HardwareModel.ValueType # 107 - """ - Elecrow ThinkNode M5 https://www.elecrow.com/wiki/ThinkNode_M5_Meshtastic_LoRa_Signal_Transceiver_ESP32-S3.html - """ - HELTEC_MESH_SOLAR: _HardwareModel.ValueType # 108 - """ - MeshSolar is an integrated power management and communication solution designed for outdoor low-power devices. - https://heltec.org/project/meshsolar/ - """ - T_ECHO_LITE: _HardwareModel.ValueType # 109 - """ - Lilygo T-Echo Lite - """ - HELTEC_V4: _HardwareModel.ValueType # 110 - """ - New Heltec LoRA32 with ESP32-S3 CPU - """ - M5STACK_C6L: _HardwareModel.ValueType # 111 - """ - M5Stack C6L - """ - M5STACK_CARDPUTER_ADV: _HardwareModel.ValueType # 112 - """ - M5Stack Cardputer Adv - """ - HELTEC_WIRELESS_TRACKER_V2: _HardwareModel.ValueType # 113 - """ - ESP32S3 main controller with GPS and TFT screen. - """ - T_WATCH_ULTRA: _HardwareModel.ValueType # 114 - """ - LilyGo T-Watch Ultra - """ - THINKNODE_M3: _HardwareModel.ValueType # 115 - """ - Elecrow ThinkNode M3 - """ - WISMESH_TAP_V2: _HardwareModel.ValueType # 116 - """ - RAK WISMESH_TAP_V2 with ESP32-S3 CPU - """ - RAK3401: _HardwareModel.ValueType # 117 - """ - RAK3401 - """ - RAK6421: _HardwareModel.ValueType # 118 - """ - RAK6421 Hat+ - """ - THINKNODE_M4: _HardwareModel.ValueType # 119 - """ - Elecrow ThinkNode M4 - """ - THINKNODE_M6: _HardwareModel.ValueType # 120 - """ - Elecrow ThinkNode M6 - """ - MESHSTICK_1262: _HardwareModel.ValueType # 121 - """ - Elecrow Meshstick 1262 - """ - TBEAM_1_WATT: _HardwareModel.ValueType # 122 - """ - LilyGo T-Beam 1W - """ - T5_S3_EPAPER_PRO: _HardwareModel.ValueType # 123 - """ - LilyGo T5 S3 ePaper Pro (V1 and V2) - """ - TBEAM_BPF: _HardwareModel.ValueType # 124 - """ - LilyGo T-Beam BPF (144-148Mhz) - """ - MINI_EPAPER_S3: _HardwareModel.ValueType # 125 - """ - LilyGo T-Mini E-paper S3 Kit - """ - TDISPLAY_S3_PRO: _HardwareModel.ValueType # 126 - """ - LilyGo T-Display S3 Pro LR1121 - """ - HELTEC_MESH_NODE_T096: _HardwareModel.ValueType # 127 - """ - Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. - """ - MESH_TRACKER_X1: _HardwareModel.ValueType # 128 - """ - Seeed studio Mesh Tracker X1card. NRF52840 w/ LR2021 radio, - GPS, button, buzzer, and sensors. - """ - THINKNODE_M7: _HardwareModel.ValueType # 129 - """ - Elecrow ThinkNode M7, M8 and M9 - """ - THINKNODE_M8: _HardwareModel.ValueType # 130 - THINKNODE_M9: _HardwareModel.ValueType # 131 - HELTEC_V4_R8: _HardwareModel.ValueType # 132 - """ - The Heltec-V4-R8 uses an ESP32S3R8 chip, plus an SX1262. - """ - HELTEC_MESH_NODE_T1: _HardwareModel.ValueType # 133 - """ - The HELTEC_MESH_NODE_T1 uses an NRF52840 chip, plus an SX1262. - """ - STATION_G3: _HardwareModel.ValueType # 134 - """ - B&Q Consulting Station G3: TBD - """ - T_IMPULSE_PLUS: _HardwareModel.ValueType # 135 - """ - Lilygo T-Impulse-Plus - """ - T_ECHO_CARD: _HardwareModel.ValueType # 136 - """ - Lilygo T-Echo Card - """ - SEEED_WIO_TRACKER_L2: _HardwareModel.ValueType # 137 - """ - Seeed Tracker L2 - """ - CROWPANEL_P4: _HardwareModel.ValueType # 138 - """ - Elecrow CrowPanel Advance P4 models, ESP32-P4 and TFT with SX1262 radio plugin - """ - HELTEC_MESH_TOWER_V2: _HardwareModel.ValueType # 139 - """ - Heltec Mesh Tower V2 - """ - 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 - """ - ------------------------------------------------------------------------------------------------------------------------------------------ - Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. - ------------------------------------------------------------------------------------------------------------------------------------------ - """ - -class HardwareModel(_HardwareModel, metaclass=_HardwareModelEnumTypeWrapper): - """ - Note: these enum names must EXACTLY match the string used in the device - bin/build-all.sh script. - Because they will be used to find firmware filenames in the android app for OTA updates. - To match the old style filenames, _ is converted to -, p is converted to . - """ - -UNSET: HardwareModel.ValueType # 0 -""" -TODO: REPLACE -""" -TLORA_V2: HardwareModel.ValueType # 1 -""" -TODO: REPLACE -""" -TLORA_V1: HardwareModel.ValueType # 2 -""" -TODO: REPLACE -""" -TLORA_V2_1_1P6: HardwareModel.ValueType # 3 -""" -TODO: REPLACE -""" -TBEAM: HardwareModel.ValueType # 4 -""" -TODO: REPLACE -""" -HELTEC_V2_0: HardwareModel.ValueType # 5 -""" -The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13 -(see HELTEC_V2 for the new version). -""" -TBEAM_V0P7: HardwareModel.ValueType # 6 -""" -TODO: REPLACE -""" -T_ECHO: HardwareModel.ValueType # 7 -""" -TODO: REPLACE -""" -TLORA_V1_1P3: HardwareModel.ValueType # 8 -""" -TODO: REPLACE -""" -RAK4631: HardwareModel.ValueType # 9 -""" -TODO: REPLACE -""" -HELTEC_V2_1: HardwareModel.ValueType # 10 -""" -The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. -Sadly they did not update anything on the silkscreen to identify this board -""" -HELTEC_V1: HardwareModel.ValueType # 11 -""" -Ancient heltec WiFi_Lora_32 board -""" -LILYGO_TBEAM_S3_CORE: HardwareModel.ValueType # 12 -""" -New T-BEAM with ESP32-S3 CPU -""" -RAK11200: HardwareModel.ValueType # 13 -""" -RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/ -""" -NANO_G1: HardwareModel.ValueType # 14 -""" -B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano -""" -TLORA_V2_1_1P8: HardwareModel.ValueType # 15 -""" -TODO: REPLACE -""" -TLORA_T3_S3: HardwareModel.ValueType # 16 -""" -TODO: REPLACE -""" -NANO_G1_EXPLORER: HardwareModel.ValueType # 17 -""" -B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer -""" -NANO_G2_ULTRA: HardwareModel.ValueType # 18 -""" -B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra -""" -LORA_TYPE: HardwareModel.ValueType # 19 -""" -LoRAType device: https://loratype.org/ -""" -WIPHONE: HardwareModel.ValueType # 20 -""" -wiphone https://www.wiphone.io/ -""" -WIO_WM1110: HardwareModel.ValueType # 21 -""" -WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk -""" -RAK2560: HardwareModel.ValueType # 22 -""" -RAK2560 Solar base station based on RAK4630 -""" -HELTEC_HRU_3601: HardwareModel.ValueType # 23 -""" -Heltec HRU-3601: https://heltec.org/project/hru-3601/ -""" -HELTEC_WIRELESS_BRIDGE: HardwareModel.ValueType # 24 -""" -Heltec Wireless Bridge -""" -STATION_G1: HardwareModel.ValueType # 25 -""" -B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station -""" -RAK11310: HardwareModel.ValueType # 26 -""" -RAK11310 (RP2040 + SX1262) -""" -MAKERFABS_TRACKER: HardwareModel.ValueType # 27 -""" -Makerfabs Tracker Reserved -""" -MAKERFABS_RESERVED: HardwareModel.ValueType # 28 -""" -Makerfabs Reserved -""" -CANARYONE: HardwareModel.ValueType # 29 -""" -Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone -""" -RP2040_LORA: HardwareModel.ValueType # 30 -""" -Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm -""" -STATION_G2: HardwareModel.ValueType # 31 -""" -B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2 -""" -LORA_RELAY_V1: HardwareModel.ValueType # 32 -""" ---------------------------------------------------------------------------- -Less common/prototype boards listed here (needs one more byte over the air) ---------------------------------------------------------------------------- -""" -T_ECHO_PLUS: HardwareModel.ValueType # 33 -""" -T-Echo Plus device from LilyGo -""" -PPR: HardwareModel.ValueType # 34 -""" -TODO: REPLACE -""" -GENIEBLOCKS: HardwareModel.ValueType # 35 -""" -TODO: REPLACE -""" -NRF52_UNKNOWN: HardwareModel.ValueType # 36 -""" -TODO: REPLACE -""" -PORTDUINO: HardwareModel.ValueType # 37 -""" -TODO: REPLACE -""" -ANDROID_SIM: HardwareModel.ValueType # 38 -""" -The simulator built into the android app -""" -DIY_V1: HardwareModel.ValueType # 39 -""" -Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics -""" -NRF52840_PCA10059: HardwareModel.ValueType # 40 -""" -nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/ -""" -DR_DEV: HardwareModel.ValueType # 41 -""" -Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3 -""" -M5STACK: HardwareModel.ValueType # 42 -""" -M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ -""" -HELTEC_V3: HardwareModel.ValueType # 43 -""" -New Heltec LoRA32 with ESP32-S3 CPU -""" -HELTEC_WSL_V3: HardwareModel.ValueType # 44 -""" -New Heltec Wireless Stick Lite with ESP32-S3 CPU -""" -BETAFPV_2400_TX: HardwareModel.ValueType # 45 -""" -New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU -""" -BETAFPV_900_NANO_TX: HardwareModel.ValueType # 46 -""" -BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU -""" -RPI_PICO: HardwareModel.ValueType # 47 -""" -Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module -""" -HELTEC_WIRELESS_TRACKER: HardwareModel.ValueType # 48 -""" -Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT -Newer V1.1, version is written on the PCB near the display. -""" -HELTEC_WIRELESS_PAPER: HardwareModel.ValueType # 49 -""" -Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display -""" -T_DECK: HardwareModel.ValueType # 50 -""" -LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display -""" -T_WATCH_S3: HardwareModel.ValueType # 51 -""" -LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display -""" -PICOMPUTER_S3: HardwareModel.ValueType # 52 -""" -Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display -""" -HELTEC_HT62: HardwareModel.ValueType # 53 -""" -Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa -""" -EBYTE_ESP32_S3: HardwareModel.ValueType # 54 -""" -EBYTE SPI LoRa module and ESP32-S3 -""" -ESP32_S3_PICO: HardwareModel.ValueType # 55 -""" -Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink -""" -CHATTER_2: HardwareModel.ValueType # 56 -""" -CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom -Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible -with one cut and one jumper Meshtastic works -""" -HELTEC_WIRELESS_PAPER_V1_0: HardwareModel.ValueType # 57 -""" -Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display -Older "V1.0" Variant, has no "version sticker" -E-Ink model is DEPG0213BNS800 -Tab on the screen protector is RED -Flex connector marking is FPC-7528B -""" -HELTEC_WIRELESS_TRACKER_V1_0: HardwareModel.ValueType # 58 -""" -Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT -Older "V1.0" Variant -""" -UNPHONE: HardwareModel.ValueType # 59 -""" -unPhone with ESP32-S3, TFT touchscreen, LSM6DS3TR-C accelerometer and gyroscope -""" -TD_LORAC: HardwareModel.ValueType # 60 -""" -Teledatics TD-LORAC NRF52840 based M.2 LoRA module -Compatible with the TD-WRLS development board -""" -CDEBYTE_EORA_S3: HardwareModel.ValueType # 61 -""" -CDEBYTE EoRa-S3 board using their own MM modules, clone of LILYGO T3S3 -""" -TWC_MESH_V4: HardwareModel.ValueType # 62 -""" -TWC_MESH_V4 -Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS -""" -NRF52_PROMICRO_DIY: HardwareModel.ValueType # 63 -""" -NRF52_PROMICRO_DIY -Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS -""" -RADIOMASTER_900_BANDIT_NANO: HardwareModel.ValueType # 64 -""" -RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module -ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS -""" -HELTEC_CAPSULE_SENSOR_V3: HardwareModel.ValueType # 65 -""" -Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors -""" -HELTEC_VISION_MASTER_T190: HardwareModel.ValueType # 66 -""" -Heltec Vision Master T190 with ESP32-S3 CPU, and a 1.90 inch TFT display -""" -HELTEC_VISION_MASTER_E213: HardwareModel.ValueType # 67 -""" -Heltec Vision Master E213 with ESP32-S3 CPU, and a 2.13 inch E-Ink display -""" -HELTEC_VISION_MASTER_E290: HardwareModel.ValueType # 68 -""" -Heltec Vision Master E290 with ESP32-S3 CPU, and a 2.9 inch E-Ink display -""" -HELTEC_MESH_NODE_T114: HardwareModel.ValueType # 69 -""" -Heltec Mesh Node T114 board with nRF52840 CPU, and a 1.14 inch TFT display, Ultimate low-power design, -specifically adapted for the Meshtatic project -""" -SENSECAP_INDICATOR: HardwareModel.ValueType # 70 -""" -Sensecap Indicator from Seeed Studio. ESP32-S3 device with TFT and RP2040 coprocessor -""" -TRACKER_T1000_E: HardwareModel.ValueType # 71 -""" -Seeed studio T1000-E tracker card. NRF52840 w/ LR1110 radio, GPS, button, buzzer, and sensors. -""" -RAK3172: HardwareModel.ValueType # 72 -""" -RAK3172 STM32WLE5 Module (https://store.rakwireless.com/products/wisduo-lpwan-module-rak3172) -""" -WIO_E5: HardwareModel.ValueType # 73 -""" -Seeed Studio Wio-E5 (either mini or Dev kit) using STM32WL chip. -""" -RADIOMASTER_900_BANDIT: HardwareModel.ValueType # 74 -""" -RadioMaster 900 Bandit, https://www.radiomasterrc.com/products/bandit-expresslrs-rf-module -SSD1306 OLED and No GPS -""" -ME25LS01_4Y10TD: HardwareModel.ValueType # 75 -""" -Minewsemi ME25LS01 (ME25LE01_V1.0). NRF52840 w/ LR1110 radio, buttons and leds and pins. -""" -RP2040_FEATHER_RFM95: HardwareModel.ValueType # 76 -""" -RP2040_FEATHER_RFM95 -Adafruit Feather RP2040 with RFM95 LoRa Radio RFM95 with SX1272, SSD1306 OLED -https://www.adafruit.com/product/5714 -https://www.adafruit.com/product/326 -https://www.adafruit.com/product/938 - ^^^ short A0 to switch to I2C address 0x3C -""" -M5STACK_COREBASIC: HardwareModel.ValueType # 77 -"""M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/""" -M5STACK_CORE2: HardwareModel.ValueType # 78 -RPI_PICO2: HardwareModel.ValueType # 79 -"""Pico2 with Waveshare Hat, same as Pico""" -M5STACK_CORES3: HardwareModel.ValueType # 80 -"""M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/""" -SEEED_XIAO_S3: HardwareModel.ValueType # 81 -"""Seeed XIAO S3 DK""" -MS24SF1: HardwareModel.ValueType # 82 -""" -Nordic nRF52840+Semtech SX1262 LoRa BLE Combo Module. nRF52840+SX1262 MS24SF1 -""" -TLORA_C6: HardwareModel.ValueType # 83 -""" -Lilygo TLora-C6 with the new ESP32-C6 MCU -""" -WISMESH_TAP: HardwareModel.ValueType # 84 -""" -WisMesh Tap -RAK-4631 w/ TFT in injection modled case -""" -ROUTASTIC: HardwareModel.ValueType # 85 -""" -Similar to PORTDUINO but used by Routastic devices, this is not any -particular device and does not run Meshtastic's code but supports -the same frame format. -Runs on linux, see https://github.com/Jorropo/routastic -""" -MESH_TAB: HardwareModel.ValueType # 86 -""" -Mesh-Tab, esp32 based -https://github.com/valzzu/Mesh-Tab -""" -MESHLINK: HardwareModel.ValueType # 87 -""" -MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog -https://www.loraitalia.it -""" -XIAO_NRF52_KIT: HardwareModel.ValueType # 88 -""" -Seeed XIAO nRF52840 + Wio SX1262 kit -""" -THINKNODE_M1: HardwareModel.ValueType # 89 -""" -Elecrow ThinkNode M1 & M2 -https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html -https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) -""" -THINKNODE_M2: HardwareModel.ValueType # 90 -T_ETH_ELITE: HardwareModel.ValueType # 91 -""" -Lilygo T-ETH-Elite -""" -HELTEC_SENSOR_HUB: HardwareModel.ValueType # 92 -""" -Heltec HRI-3621 industrial probe -""" -MUZI_BASE: HardwareModel.ValueType # 93 -""" -Muzi Works Muzi-Base device -""" -HELTEC_MESH_POCKET: HardwareModel.ValueType # 94 -""" -Heltec Magnetic Power Bank with Meshtastic compatible -""" -SEEED_SOLAR_NODE: HardwareModel.ValueType # 95 -""" -Seeed Solar Node -""" -NOMADSTAR_METEOR_PRO: HardwareModel.ValueType # 96 -""" -NomadStar Meteor Pro https://nomadstar.ch/ -""" -CROWPANEL: HardwareModel.ValueType # 97 -""" -Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin -""" -LINK_32: HardwareModel.ValueType # 98 -""" -Lilygo LINK32 board with sensors -""" -SEEED_WIO_TRACKER_L1: HardwareModel.ValueType # 99 -""" -Seeed Tracker L1 -""" -SEEED_WIO_TRACKER_L1_EINK: HardwareModel.ValueType # 100 -""" -Seeed Tracker L1 EINK driver -""" -MUZI_R1_NEO: HardwareModel.ValueType # 101 -""" -Muzi Works R1 Neo -""" -T_DECK_PRO: HardwareModel.ValueType # 102 -""" -Lilygo T-Deck Pro -""" -T_LORA_PAGER: HardwareModel.ValueType # 103 -""" -Lilygo TLora Pager -""" -M5STACK_RESERVED: HardwareModel.ValueType # 104 -""" -M5Stack Reserved -0x68 -""" -WISMESH_TAG: HardwareModel.ValueType # 105 -""" -RAKwireless WisMesh Tag -""" -RAK3312: HardwareModel.ValueType # 106 -""" -RAKwireless WisBlock Core RAK3312 https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/overview/ -""" -THINKNODE_M5: HardwareModel.ValueType # 107 -""" -Elecrow ThinkNode M5 https://www.elecrow.com/wiki/ThinkNode_M5_Meshtastic_LoRa_Signal_Transceiver_ESP32-S3.html -""" -HELTEC_MESH_SOLAR: HardwareModel.ValueType # 108 -""" -MeshSolar is an integrated power management and communication solution designed for outdoor low-power devices. -https://heltec.org/project/meshsolar/ -""" -T_ECHO_LITE: HardwareModel.ValueType # 109 -""" -Lilygo T-Echo Lite -""" -HELTEC_V4: HardwareModel.ValueType # 110 -""" -New Heltec LoRA32 with ESP32-S3 CPU -""" -M5STACK_C6L: HardwareModel.ValueType # 111 -""" -M5Stack C6L -""" -M5STACK_CARDPUTER_ADV: HardwareModel.ValueType # 112 -""" -M5Stack Cardputer Adv -""" -HELTEC_WIRELESS_TRACKER_V2: HardwareModel.ValueType # 113 -""" -ESP32S3 main controller with GPS and TFT screen. -""" -T_WATCH_ULTRA: HardwareModel.ValueType # 114 -""" -LilyGo T-Watch Ultra -""" -THINKNODE_M3: HardwareModel.ValueType # 115 -""" -Elecrow ThinkNode M3 -""" -WISMESH_TAP_V2: HardwareModel.ValueType # 116 -""" -RAK WISMESH_TAP_V2 with ESP32-S3 CPU -""" -RAK3401: HardwareModel.ValueType # 117 -""" -RAK3401 -""" -RAK6421: HardwareModel.ValueType # 118 -""" -RAK6421 Hat+ -""" -THINKNODE_M4: HardwareModel.ValueType # 119 -""" -Elecrow ThinkNode M4 -""" -THINKNODE_M6: HardwareModel.ValueType # 120 -""" -Elecrow ThinkNode M6 -""" -MESHSTICK_1262: HardwareModel.ValueType # 121 -""" -Elecrow Meshstick 1262 -""" -TBEAM_1_WATT: HardwareModel.ValueType # 122 -""" -LilyGo T-Beam 1W -""" -T5_S3_EPAPER_PRO: HardwareModel.ValueType # 123 -""" -LilyGo T5 S3 ePaper Pro (V1 and V2) -""" -TBEAM_BPF: HardwareModel.ValueType # 124 -""" -LilyGo T-Beam BPF (144-148Mhz) -""" -MINI_EPAPER_S3: HardwareModel.ValueType # 125 -""" -LilyGo T-Mini E-paper S3 Kit -""" -TDISPLAY_S3_PRO: HardwareModel.ValueType # 126 -""" -LilyGo T-Display S3 Pro LR1121 -""" -HELTEC_MESH_NODE_T096: HardwareModel.ValueType # 127 -""" -Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. -""" -MESH_TRACKER_X1: HardwareModel.ValueType # 128 -""" -Seeed studio Mesh Tracker X1card. NRF52840 w/ LR2021 radio, -GPS, button, buzzer, and sensors. -""" -THINKNODE_M7: HardwareModel.ValueType # 129 -""" -Elecrow ThinkNode M7, M8 and M9 -""" -THINKNODE_M8: HardwareModel.ValueType # 130 -THINKNODE_M9: HardwareModel.ValueType # 131 -HELTEC_V4_R8: HardwareModel.ValueType # 132 -""" -The Heltec-V4-R8 uses an ESP32S3R8 chip, plus an SX1262. -""" -HELTEC_MESH_NODE_T1: HardwareModel.ValueType # 133 -""" -The HELTEC_MESH_NODE_T1 uses an NRF52840 chip, plus an SX1262. -""" -STATION_G3: HardwareModel.ValueType # 134 -""" -B&Q Consulting Station G3: TBD -""" -T_IMPULSE_PLUS: HardwareModel.ValueType # 135 -""" -Lilygo T-Impulse-Plus -""" -T_ECHO_CARD: HardwareModel.ValueType # 136 -""" -Lilygo T-Echo Card -""" -SEEED_WIO_TRACKER_L2: HardwareModel.ValueType # 137 -""" -Seeed Tracker L2 -""" -CROWPANEL_P4: HardwareModel.ValueType # 138 -""" -Elecrow CrowPanel Advance P4 models, ESP32-P4 and TFT with SX1262 radio plugin -""" -HELTEC_MESH_TOWER_V2: HardwareModel.ValueType # 139 -""" -Heltec Mesh Tower V2 -""" -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 -""" ------------------------------------------------------------------------------------------------------------------------------------------- -Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. ------------------------------------------------------------------------------------------------------------------------------------------- -""" -global___HardwareModel = HardwareModel - -class _Constants: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _ConstantsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Constants.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - ZERO: _Constants.ValueType # 0 - """ - First enum must be zero, and we are just using this enum to - pass int constants between two very different environments - """ - DATA_PAYLOAD_LEN: _Constants.ValueType # 233 - """ - From mesh.options - note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is - outside of this envelope - """ - -class Constants(_Constants, metaclass=_ConstantsEnumTypeWrapper): - """ - Shared constants between device and phone - """ - -ZERO: Constants.ValueType # 0 -""" -First enum must be zero, and we are just using this enum to -pass int constants between two very different environments -""" -DATA_PAYLOAD_LEN: Constants.ValueType # 233 -""" -From mesh.options -note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is -outside of this envelope -""" -global___Constants = Constants - -class _CriticalErrorCode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _CriticalErrorCodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CriticalErrorCode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - NONE: _CriticalErrorCode.ValueType # 0 - """ - TODO: REPLACE - """ - TX_WATCHDOG: _CriticalErrorCode.ValueType # 1 - """ - A software bug was detected while trying to send lora - """ - SLEEP_ENTER_WAIT: _CriticalErrorCode.ValueType # 2 - """ - A software bug was detected on entry to sleep - """ - NO_RADIO: _CriticalErrorCode.ValueType # 3 - """ - No Lora radio hardware could be found - """ - UNSPECIFIED: _CriticalErrorCode.ValueType # 4 - """ - Not normally used - """ - UBLOX_UNIT_FAILED: _CriticalErrorCode.ValueType # 5 - """ - We failed while configuring a UBlox GPS - """ - NO_AXP192: _CriticalErrorCode.ValueType # 6 - """ - This board was expected to have a power management chip and it is missing or broken - """ - INVALID_RADIO_SETTING: _CriticalErrorCode.ValueType # 7 - """ - The channel tried to set a radio setting which is not supported by this chipset, - radio comms settings are now undefined. - """ - TRANSMIT_FAILED: _CriticalErrorCode.ValueType # 8 - """ - Radio transmit hardware failure. We sent data to the radio chip, but it didn't - reply with an interrupt. - """ - BROWNOUT: _CriticalErrorCode.ValueType # 9 - """ - We detected that the main CPU voltage dropped below the minimum acceptable value - """ - SX1262_FAILURE: _CriticalErrorCode.ValueType # 10 - """Selftest of SX1262 radio chip failed""" - RADIO_SPI_BUG: _CriticalErrorCode.ValueType # 11 - """ - A (likely software but possibly hardware) failure was detected while trying to send packets. - If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug - """ - FLASH_CORRUPTION_RECOVERABLE: _CriticalErrorCode.ValueType # 12 - """ - Corruption was detected on the flash filesystem but we were able to repair things. - If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. - """ - FLASH_CORRUPTION_UNRECOVERABLE: _CriticalErrorCode.ValueType # 13 - """ - Corruption was detected on the flash filesystem but we were unable to repair things. - NOTE: Your node will probably need to be reconfigured the next time it reboots (it will lose the region code etc...) - If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. - """ - -class CriticalErrorCode(_CriticalErrorCode, metaclass=_CriticalErrorCodeEnumTypeWrapper): - """ - Error codes for critical errors - The device might report these fault codes on the screen. - If you encounter a fault code, please post on the meshtastic.discourse.group - and we'll try to help. - """ - -NONE: CriticalErrorCode.ValueType # 0 -""" -TODO: REPLACE -""" -TX_WATCHDOG: CriticalErrorCode.ValueType # 1 -""" -A software bug was detected while trying to send lora -""" -SLEEP_ENTER_WAIT: CriticalErrorCode.ValueType # 2 -""" -A software bug was detected on entry to sleep -""" -NO_RADIO: CriticalErrorCode.ValueType # 3 -""" -No Lora radio hardware could be found -""" -UNSPECIFIED: CriticalErrorCode.ValueType # 4 -""" -Not normally used -""" -UBLOX_UNIT_FAILED: CriticalErrorCode.ValueType # 5 -""" -We failed while configuring a UBlox GPS -""" -NO_AXP192: CriticalErrorCode.ValueType # 6 -""" -This board was expected to have a power management chip and it is missing or broken -""" -INVALID_RADIO_SETTING: CriticalErrorCode.ValueType # 7 -""" -The channel tried to set a radio setting which is not supported by this chipset, -radio comms settings are now undefined. -""" -TRANSMIT_FAILED: CriticalErrorCode.ValueType # 8 -""" -Radio transmit hardware failure. We sent data to the radio chip, but it didn't -reply with an interrupt. -""" -BROWNOUT: CriticalErrorCode.ValueType # 9 -""" -We detected that the main CPU voltage dropped below the minimum acceptable value -""" -SX1262_FAILURE: CriticalErrorCode.ValueType # 10 -"""Selftest of SX1262 radio chip failed""" -RADIO_SPI_BUG: CriticalErrorCode.ValueType # 11 -""" -A (likely software but possibly hardware) failure was detected while trying to send packets. -If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug -""" -FLASH_CORRUPTION_RECOVERABLE: CriticalErrorCode.ValueType # 12 -""" -Corruption was detected on the flash filesystem but we were able to repair things. -If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. -""" -FLASH_CORRUPTION_UNRECOVERABLE: CriticalErrorCode.ValueType # 13 -""" -Corruption was detected on the flash filesystem but we were unable to repair things. -NOTE: Your node will probably need to be reconfigured the next time it reboots (it will lose the region code etc...) -If you see this failure in the field please post in the forum because we are interested in seeing if this is occurring in the field. -""" -global___CriticalErrorCode = CriticalErrorCode - -class _FirmwareEdition: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _FirmwareEditionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FirmwareEdition.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - VANILLA: _FirmwareEdition.ValueType # 0 - """ - Vanilla firmware - """ - SMART_CITIZEN: _FirmwareEdition.ValueType # 1 - """ - Firmware for use in the Smart Citizen environmental monitoring network - """ - OPEN_SAUCE: _FirmwareEdition.ValueType # 16 - """ - Open Sauce, the maker conference held yearly in CA - """ - DEFCON: _FirmwareEdition.ValueType # 17 - """ - DEFCON, the yearly hacker conference - """ - BURNING_MAN: _FirmwareEdition.ValueType # 18 - """ - Burning Man, the yearly hippie gathering in the desert - """ - 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 - """ - -class FirmwareEdition(_FirmwareEdition, metaclass=_FirmwareEditionEnumTypeWrapper): - """ - Enum to indicate to clients whether this firmware is a special firmware build, like an event. - The first 16 values are reserved for non-event special firmwares, like the Smart Citizen use case. - """ - -VANILLA: FirmwareEdition.ValueType # 0 -""" -Vanilla firmware -""" -SMART_CITIZEN: FirmwareEdition.ValueType # 1 -""" -Firmware for use in the Smart Citizen environmental monitoring network -""" -OPEN_SAUCE: FirmwareEdition.ValueType # 16 -""" -Open Sauce, the maker conference held yearly in CA -""" -DEFCON: FirmwareEdition.ValueType # 17 -""" -DEFCON, the yearly hacker conference -""" -BURNING_MAN: FirmwareEdition.ValueType # 18 -""" -Burning Man, the yearly hippie gathering in the desert -""" -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 -""" -global___FirmwareEdition = FirmwareEdition - -class _ExcludedModules: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _ExcludedModulesEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ExcludedModules.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - EXCLUDED_NONE: _ExcludedModules.ValueType # 0 - """ - Default value of 0 indicates no modules are excluded. - """ - MQTT_CONFIG: _ExcludedModules.ValueType # 1 - """ - MQTT module - """ - SERIAL_CONFIG: _ExcludedModules.ValueType # 2 - """ - Serial module - """ - EXTNOTIF_CONFIG: _ExcludedModules.ValueType # 4 - """ - External Notification module - """ - STOREFORWARD_CONFIG: _ExcludedModules.ValueType # 8 - """ - Store and Forward module - """ - RANGETEST_CONFIG: _ExcludedModules.ValueType # 16 - """ - Range Test module - """ - TELEMETRY_CONFIG: _ExcludedModules.ValueType # 32 - """ - Telemetry module - """ - CANNEDMSG_CONFIG: _ExcludedModules.ValueType # 64 - """ - Canned Message module - """ - AUDIO_CONFIG: _ExcludedModules.ValueType # 128 - """ - Audio module - """ - REMOTEHARDWARE_CONFIG: _ExcludedModules.ValueType # 256 - """ - Remote Hardware module - """ - NEIGHBORINFO_CONFIG: _ExcludedModules.ValueType # 512 - """ - Neighbor Info module - """ - AMBIENTLIGHTING_CONFIG: _ExcludedModules.ValueType # 1024 - """ - Ambient Lighting module - """ - DETECTIONSENSOR_CONFIG: _ExcludedModules.ValueType # 2048 - """ - Detection Sensor module - """ - PAXCOUNTER_CONFIG: _ExcludedModules.ValueType # 4096 - """ - Paxcounter module - """ - BLUETOOTH_CONFIG: _ExcludedModules.ValueType # 8192 - """ - Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) - """ - NETWORK_CONFIG: _ExcludedModules.ValueType # 16384 - """ - Network config (not technically a module, but used to indicate network capabilities) - """ - 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): - """ - Enum for modules excluded from a device's configuration. - Each value represents a ModuleConfigType that can be toggled as excluded - by setting its corresponding bit in the `excluded_modules` bitmask field. - """ - -EXCLUDED_NONE: ExcludedModules.ValueType # 0 -""" -Default value of 0 indicates no modules are excluded. -""" -MQTT_CONFIG: ExcludedModules.ValueType # 1 -""" -MQTT module -""" -SERIAL_CONFIG: ExcludedModules.ValueType # 2 -""" -Serial module -""" -EXTNOTIF_CONFIG: ExcludedModules.ValueType # 4 -""" -External Notification module -""" -STOREFORWARD_CONFIG: ExcludedModules.ValueType # 8 -""" -Store and Forward module -""" -RANGETEST_CONFIG: ExcludedModules.ValueType # 16 -""" -Range Test module -""" -TELEMETRY_CONFIG: ExcludedModules.ValueType # 32 -""" -Telemetry module -""" -CANNEDMSG_CONFIG: ExcludedModules.ValueType # 64 -""" -Canned Message module -""" -AUDIO_CONFIG: ExcludedModules.ValueType # 128 -""" -Audio module -""" -REMOTEHARDWARE_CONFIG: ExcludedModules.ValueType # 256 -""" -Remote Hardware module -""" -NEIGHBORINFO_CONFIG: ExcludedModules.ValueType # 512 -""" -Neighbor Info module -""" -AMBIENTLIGHTING_CONFIG: ExcludedModules.ValueType # 1024 -""" -Ambient Lighting module -""" -DETECTIONSENSOR_CONFIG: ExcludedModules.ValueType # 2048 -""" -Detection Sensor module -""" -PAXCOUNTER_CONFIG: ExcludedModules.ValueType # 4096 -""" -Paxcounter module -""" -BLUETOOTH_CONFIG: ExcludedModules.ValueType # 8192 -""" -Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) -""" -NETWORK_CONFIG: ExcludedModules.ValueType # 16384 -""" -Network config (not technically a module, but used to indicate network capabilities) -""" -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 -class Position(google.protobuf.message.Message): - """ - A GPS Position - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _LocSource: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _LocSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Position._LocSource.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - LOC_UNSET: Position._LocSource.ValueType # 0 - """ - TODO: REPLACE - """ - LOC_MANUAL: Position._LocSource.ValueType # 1 - """ - TODO: REPLACE - """ - LOC_INTERNAL: Position._LocSource.ValueType # 2 - """ - TODO: REPLACE - """ - LOC_EXTERNAL: Position._LocSource.ValueType # 3 - """ - TODO: REPLACE - """ - - class LocSource(_LocSource, metaclass=_LocSourceEnumTypeWrapper): - """ - How the location was acquired: manual, onboard GPS, external (EUD) GPS - """ - - LOC_UNSET: Position.LocSource.ValueType # 0 - """ - TODO: REPLACE - """ - LOC_MANUAL: Position.LocSource.ValueType # 1 - """ - TODO: REPLACE - """ - LOC_INTERNAL: Position.LocSource.ValueType # 2 - """ - TODO: REPLACE - """ - LOC_EXTERNAL: Position.LocSource.ValueType # 3 - """ - TODO: REPLACE - """ - - class _AltSource: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _AltSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Position._AltSource.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - ALT_UNSET: Position._AltSource.ValueType # 0 - """ - TODO: REPLACE - """ - ALT_MANUAL: Position._AltSource.ValueType # 1 - """ - TODO: REPLACE - """ - ALT_INTERNAL: Position._AltSource.ValueType # 2 - """ - TODO: REPLACE - """ - ALT_EXTERNAL: Position._AltSource.ValueType # 3 - """ - TODO: REPLACE - """ - ALT_BAROMETRIC: Position._AltSource.ValueType # 4 - """ - TODO: REPLACE - """ - - class AltSource(_AltSource, metaclass=_AltSourceEnumTypeWrapper): - """ - How the altitude was acquired: manual, GPS int/ext, etc - Default: same as location_source if present - """ - - ALT_UNSET: Position.AltSource.ValueType # 0 - """ - TODO: REPLACE - """ - ALT_MANUAL: Position.AltSource.ValueType # 1 - """ - TODO: REPLACE - """ - ALT_INTERNAL: Position.AltSource.ValueType # 2 - """ - TODO: REPLACE - """ - ALT_EXTERNAL: Position.AltSource.ValueType # 3 - """ - TODO: REPLACE - """ - ALT_BAROMETRIC: Position.AltSource.ValueType # 4 - """ - TODO: REPLACE - """ - - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - ALTITUDE_FIELD_NUMBER: builtins.int - TIME_FIELD_NUMBER: builtins.int - LOCATION_SOURCE_FIELD_NUMBER: builtins.int - ALTITUDE_SOURCE_FIELD_NUMBER: builtins.int - TIMESTAMP_FIELD_NUMBER: builtins.int - TIMESTAMP_MILLIS_ADJUST_FIELD_NUMBER: builtins.int - ALTITUDE_HAE_FIELD_NUMBER: builtins.int - ALTITUDE_GEOIDAL_SEPARATION_FIELD_NUMBER: builtins.int - PDOP_FIELD_NUMBER: builtins.int - HDOP_FIELD_NUMBER: builtins.int - VDOP_FIELD_NUMBER: builtins.int - GPS_ACCURACY_FIELD_NUMBER: builtins.int - GROUND_SPEED_FIELD_NUMBER: builtins.int - GROUND_TRACK_FIELD_NUMBER: builtins.int - FIX_QUALITY_FIELD_NUMBER: builtins.int - FIX_TYPE_FIELD_NUMBER: builtins.int - SATS_IN_VIEW_FIELD_NUMBER: builtins.int - SENSOR_ID_FIELD_NUMBER: builtins.int - NEXT_UPDATE_FIELD_NUMBER: builtins.int - SEQ_NUMBER_FIELD_NUMBER: builtins.int - PRECISION_BITS_FIELD_NUMBER: builtins.int - latitude_i: builtins.int - """ - The new preferred location encoding, multiply by 1e-7 to get degrees - in floating point - """ - longitude_i: builtins.int - """ - TODO: REPLACE - """ - altitude: builtins.int - """ - In meters above MSL (but see issue #359) - """ - time: builtins.int - """ - This is usually not sent over the mesh (to save space), but it is sent - from the phone so that the local device can set its time if it is sent over - the mesh (because there are devices on the mesh without GPS or RTC). - seconds since 1970 - """ - location_source: global___Position.LocSource.ValueType - """ - TODO: REPLACE - """ - altitude_source: global___Position.AltSource.ValueType - """ - TODO: REPLACE - """ - timestamp: builtins.int - """ - Positional timestamp (actual timestamp of GPS solution) in integer epoch seconds - """ - timestamp_millis_adjust: builtins.int - """ - Pos. timestamp milliseconds adjustment (rarely available or required) - """ - altitude_hae: builtins.int - """ - HAE altitude in meters - can be used instead of MSL altitude - """ - altitude_geoidal_separation: builtins.int - """ - Geoidal separation in meters - """ - PDOP: builtins.int - """ - Horizontal, Vertical and Position Dilution of Precision, in 1/100 units - - PDOP is sufficient for most cases - - for higher precision scenarios, HDOP and VDOP can be used instead, - in which case PDOP becomes redundant (PDOP=sqrt(HDOP^2 + VDOP^2)) - TODO: REMOVE/INTEGRATE - """ - HDOP: builtins.int - """ - TODO: REPLACE - """ - VDOP: builtins.int - """ - TODO: REPLACE - """ - gps_accuracy: builtins.int - """ - GPS accuracy (a hardware specific constant) in mm - multiplied with DOP to calculate positional accuracy - Default: "'bout three meters-ish" :) - """ - ground_speed: builtins.int - """ - Ground speed in 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) - - "yaw" indicates a relative rotation about the vertical axis - TODO: REMOVE/INTEGRATE - """ - ground_track: builtins.int - """ - TODO: REPLACE - """ - fix_quality: builtins.int - """ - GPS fix quality (from NMEA GxGGA statement or similar) - """ - fix_type: builtins.int - """ - GPS fix type 2D/3D (from NMEA GxGSA statement) - """ - sats_in_view: builtins.int - """ - GPS "Satellites in View" number - """ - sensor_id: builtins.int - """ - Sensor ID - in case multiple positioning sensors are being used - """ - next_update: builtins.int - """ - Estimated/expected time (in seconds) until next update: - - if we update at fixed intervals of X seconds, use X - - if we update at dynamic intervals (based on relative movement etc), - but "AT LEAST every Y seconds", use Y - """ - seq_number: builtins.int - """ - A sequence number, incremented with each Position message to help - detect lost updates if needed - """ - precision_bits: builtins.int - """ - Indicates the bits of precision set by the sending node - """ - def __init__( - self, - *, - latitude_i: builtins.int | None = ..., - longitude_i: builtins.int | None = ..., - altitude: builtins.int | None = ..., - time: builtins.int = ..., - location_source: global___Position.LocSource.ValueType = ..., - altitude_source: global___Position.AltSource.ValueType = ..., - timestamp: builtins.int = ..., - timestamp_millis_adjust: builtins.int = ..., - altitude_hae: builtins.int | None = ..., - altitude_geoidal_separation: builtins.int | None = ..., - PDOP: builtins.int = ..., - HDOP: builtins.int = ..., - VDOP: builtins.int = ..., - gps_accuracy: builtins.int = ..., - ground_speed: builtins.int | None = ..., - ground_track: builtins.int | None = ..., - fix_quality: builtins.int = ..., - fix_type: builtins.int = ..., - sats_in_view: builtins.int = ..., - sensor_id: builtins.int = ..., - next_update: builtins.int = ..., - seq_number: builtins.int = ..., - precision_bits: builtins.int = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_altitude", b"_altitude", "_altitude_geoidal_separation", b"_altitude_geoidal_separation", "_altitude_hae", b"_altitude_hae", "_ground_speed", b"_ground_speed", "_ground_track", b"_ground_track", "_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["HDOP", b"HDOP", "PDOP", b"PDOP", "VDOP", b"VDOP", "_altitude", b"_altitude", "_altitude_geoidal_separation", b"_altitude_geoidal_separation", "_altitude_hae", b"_altitude_hae", "_ground_speed", b"_ground_speed", "_ground_track", b"_ground_track", "_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "altitude_source", b"altitude_source", "fix_quality", b"fix_quality", "fix_type", b"fix_type", "gps_accuracy", b"gps_accuracy", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "next_update", b"next_update", "precision_bits", b"precision_bits", "sats_in_view", b"sats_in_view", "sensor_id", b"sensor_id", "seq_number", b"seq_number", "time", b"time", "timestamp", b"timestamp", "timestamp_millis_adjust", b"timestamp_millis_adjust"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_altitude", b"_altitude"]) -> typing.Literal["altitude"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_altitude_geoidal_separation", b"_altitude_geoidal_separation"]) -> typing.Literal["altitude_geoidal_separation"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_altitude_hae", b"_altitude_hae"]) -> typing.Literal["altitude_hae"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ground_speed", b"_ground_speed"]) -> typing.Literal["ground_speed"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ground_track", b"_ground_track"]) -> typing.Literal["ground_track"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_latitude_i", b"_latitude_i"]) -> typing.Literal["latitude_i"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_longitude_i", b"_longitude_i"]) -> typing.Literal["longitude_i"] | None: ... - -global___Position = Position - -@typing.final -class User(google.protobuf.message.Message): - """ - Broadcast when a newly powered mesh node wants to find a node num it can use - Sent from the phone over bluetooth to set the user id for the owner of this node. - Also sent from nodes to each other when a new node signs on (so all clients can have this info) - The algorithm is as follows: - when a node starts up, it broadcasts their user and the normal flow is for all - other nodes to reply with their User as well (so the new node can build its nodedb) - If a node ever receives a User (not just the first broadcast) message where - the sender node number equals our node number, that indicates a collision has - occurred and the following steps should happen: - If the receiving node (that was already in the mesh)'s macaddr is LOWER than the - new User who just tried to sign in: it gets to keep its nodenum. - We send a broadcast message of OUR User (we use a broadcast so that the other node can - receive our message, considering we have the same id - it also serves to let - observers correct their nodedb) - this case is rare so it should be okay. - If any node receives a User where the macaddr is GTE than their local macaddr, - they have been vetoed and should pick a new random nodenum (filtering against - whatever it knows about the nodedb) and rebroadcast their User. - A few nodenums are reserved and will never be requested: - 0xff - broadcast - 0 through 3 - for future use - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ID_FIELD_NUMBER: builtins.int - LONG_NAME_FIELD_NUMBER: builtins.int - SHORT_NAME_FIELD_NUMBER: builtins.int - MACADDR_FIELD_NUMBER: builtins.int - HW_MODEL_FIELD_NUMBER: builtins.int - IS_LICENSED_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - PUBLIC_KEY_FIELD_NUMBER: builtins.int - IS_UNMESSAGABLE_FIELD_NUMBER: builtins.int - id: builtins.str - """ - A globally unique ID string for this user. - In the case of Signal that would mean +16504442323, for the default macaddr derived id it would be !<8 hexidecimal bytes>. - Note: app developers are encouraged to also use the following standard - node IDs "^all" (for broadcast), "^local" (for the locally connected node) - """ - long_name: builtins.str - """ - A full name for this user, i.e. "Kevin Hester" - 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 - """ - A VERY short name, ideally two characters. - Suitable for a tiny OLED screen - """ - macaddr: builtins.bytes - """ - Deprecated in Meshtastic 2.1.x - This is the addr of the radio. - Not populated by the phone, but added by the esp32 when broadcasting - """ - hw_model: global___HardwareModel.ValueType - """ - TBEAM, HELTEC, etc... - Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. - Apps will still need the string here for older builds - (so OTA update can find the right image), but if the enum is available it will be used instead. - """ - is_licensed: builtins.bool - """ - In some regions Ham radio operators have different bandwidth limitations than others. - If this user is a licensed operator, set this flag. - Also, "long_name" should be their licence number. - """ - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType - """ - Indicates that the user's role in the mesh - """ - public_key: builtins.bytes - """ - The public key of the user's device. - This is sent out to other nodes on the mesh to allow them to compute a shared secret key. - """ - is_unmessagable: builtins.bool - """ - Whether or not the node can be messaged - """ - def __init__( - self, - *, - id: builtins.str = ..., - long_name: builtins.str = ..., - short_name: builtins.str = ..., - macaddr: builtins.bytes = ..., - hw_model: global___HardwareModel.ValueType = ..., - is_licensed: builtins.bool = ..., - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., - public_key: builtins.bytes = ..., - is_unmessagable: builtins.bool | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_is_unmessagable", b"_is_unmessagable"]) -> typing.Literal["is_unmessagable"] | None: ... - -global___User = User - -@typing.final -class RouteDiscovery(google.protobuf.message.Message): - """ - A message used in a traceroute - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ROUTE_FIELD_NUMBER: builtins.int - SNR_TOWARDS_FIELD_NUMBER: builtins.int - ROUTE_BACK_FIELD_NUMBER: builtins.int - SNR_BACK_FIELD_NUMBER: builtins.int - @property - def route(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """ - The list of nodenums this packet has visited so far to the destination. - """ - - @property - def snr_towards(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """ - The list of SNRs (in dB, scaled by 4) in the route towards the destination. - """ - - @property - def route_back(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """ - The list of nodenums the packet has visited on the way back from the destination. - """ - - @property - def snr_back(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """ - The list of SNRs (in dB, scaled by 4) in the route back from the destination. - """ - - def __init__( - self, - *, - route: collections.abc.Iterable[builtins.int] | None = ..., - snr_towards: collections.abc.Iterable[builtins.int] | None = ..., - route_back: collections.abc.Iterable[builtins.int] | None = ..., - snr_back: collections.abc.Iterable[builtins.int] | None = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["route", b"route", "route_back", b"route_back", "snr_back", b"snr_back", "snr_towards", b"snr_towards"]) -> None: ... - -global___RouteDiscovery = RouteDiscovery - -@typing.final -class Routing(google.protobuf.message.Message): - """ - A Routing control Data packet handled by the routing module - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _Error: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _ErrorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Routing._Error.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - NONE: Routing._Error.ValueType # 0 - """ - This message is not a failure - """ - NO_ROUTE: Routing._Error.ValueType # 1 - """ - Our node doesn't have a route to the requested destination anymore. - """ - GOT_NAK: Routing._Error.ValueType # 2 - """ - We received a nak while trying to forward on your behalf - """ - TIMEOUT: Routing._Error.ValueType # 3 - """ - TODO: REPLACE - """ - NO_INTERFACE: Routing._Error.ValueType # 4 - """ - No suitable interface could be found for delivering this packet - """ - MAX_RETRANSMIT: Routing._Error.ValueType # 5 - """ - We reached the max retransmission count (typically for naive flood routing) - """ - NO_CHANNEL: Routing._Error.ValueType # 6 - """ - No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) - """ - TOO_LARGE: Routing._Error.ValueType # 7 - """ - The packet was too big for sending (exceeds interface MTU after encoding) - """ - NO_RESPONSE: Routing._Error.ValueType # 8 - """ - The request had want_response set, the request reached the destination node, but no service on that node wants to send a response - (possibly due to bad channel permissions) - """ - DUTY_CYCLE_LIMIT: Routing._Error.ValueType # 9 - """ - Cannot send currently because duty cycle regulations will be violated. - """ - BAD_REQUEST: Routing._Error.ValueType # 32 - """ - The application layer service on the remote node received your request, but considered your request somehow invalid - """ - NOT_AUTHORIZED: Routing._Error.ValueType # 33 - """ - The application layer service on the remote node received your request, but considered your request not authorized - (i.e you did not send the request on the required bound channel) - """ - PKI_FAILED: Routing._Error.ValueType # 34 - """ - The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) - """ - PKI_UNKNOWN_PUBKEY: Routing._Error.ValueType # 35 - """ - The receiving node does not have a Public Key to decode with - """ - ADMIN_BAD_SESSION_KEY: Routing._Error.ValueType # 36 - """ - Admin packet otherwise checks out, but uses a bogus or expired session key - """ - ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing._Error.ValueType # 37 - """ - Admin packet sent using PKC, but not from a public key on the admin key list - """ - RATE_LIMIT_EXCEEDED: Routing._Error.ValueType # 38 - """ - Airtime fairness rate limit exceeded for a packet - This typically enforced per portnum and is used to prevent a single node from monopolizing airtime - """ - PKI_SEND_FAIL_PUBLIC_KEY: Routing._Error.ValueType # 39 - """ - PKI encryption failed, due to no public key for the remote node - This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet - """ - - class Error(_Error, metaclass=_ErrorEnumTypeWrapper): - """ - A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide - details on the type of failure). - """ - - NONE: Routing.Error.ValueType # 0 - """ - This message is not a failure - """ - NO_ROUTE: Routing.Error.ValueType # 1 - """ - Our node doesn't have a route to the requested destination anymore. - """ - GOT_NAK: Routing.Error.ValueType # 2 - """ - We received a nak while trying to forward on your behalf - """ - TIMEOUT: Routing.Error.ValueType # 3 - """ - TODO: REPLACE - """ - NO_INTERFACE: Routing.Error.ValueType # 4 - """ - No suitable interface could be found for delivering this packet - """ - MAX_RETRANSMIT: Routing.Error.ValueType # 5 - """ - We reached the max retransmission count (typically for naive flood routing) - """ - NO_CHANNEL: Routing.Error.ValueType # 6 - """ - No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) - """ - TOO_LARGE: Routing.Error.ValueType # 7 - """ - The packet was too big for sending (exceeds interface MTU after encoding) - """ - NO_RESPONSE: Routing.Error.ValueType # 8 - """ - The request had want_response set, the request reached the destination node, but no service on that node wants to send a response - (possibly due to bad channel permissions) - """ - DUTY_CYCLE_LIMIT: Routing.Error.ValueType # 9 - """ - Cannot send currently because duty cycle regulations will be violated. - """ - BAD_REQUEST: Routing.Error.ValueType # 32 - """ - The application layer service on the remote node received your request, but considered your request somehow invalid - """ - NOT_AUTHORIZED: Routing.Error.ValueType # 33 - """ - The application layer service on the remote node received your request, but considered your request not authorized - (i.e you did not send the request on the required bound channel) - """ - PKI_FAILED: Routing.Error.ValueType # 34 - """ - The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) - """ - PKI_UNKNOWN_PUBKEY: Routing.Error.ValueType # 35 - """ - The receiving node does not have a Public Key to decode with - """ - ADMIN_BAD_SESSION_KEY: Routing.Error.ValueType # 36 - """ - Admin packet otherwise checks out, but uses a bogus or expired session key - """ - ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing.Error.ValueType # 37 - """ - Admin packet sent using PKC, but not from a public key on the admin key list - """ - RATE_LIMIT_EXCEEDED: Routing.Error.ValueType # 38 - """ - Airtime fairness rate limit exceeded for a packet - This typically enforced per portnum and is used to prevent a single node from monopolizing airtime - """ - PKI_SEND_FAIL_PUBLIC_KEY: Routing.Error.ValueType # 39 - """ - PKI encryption failed, due to no public key for the remote node - This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet - """ - - 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: - """ - A route request going from the requester - """ - - @property - def route_reply(self) -> global___RouteDiscovery: - """ - A route reply - """ - - def __init__( - self, - *, - 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["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 - -@typing.final -class Data(google.protobuf.message.Message): - """ - (Formerly called SubPacket) - The payload portion fo a packet, this is the actual bytes that are sent - inside a radio packet (because from/to are broken out by the comms library) - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PORTNUM_FIELD_NUMBER: builtins.int - PAYLOAD_FIELD_NUMBER: builtins.int - WANT_RESPONSE_FIELD_NUMBER: builtins.int - DEST_FIELD_NUMBER: builtins.int - SOURCE_FIELD_NUMBER: builtins.int - REQUEST_ID_FIELD_NUMBER: builtins.int - REPLY_ID_FIELD_NUMBER: builtins.int - EMOJI_FIELD_NUMBER: builtins.int - 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 - """ - payload: builtins.bytes - """ - TODO: REPLACE - """ - want_response: builtins.bool - """ - Not normally used, but for testing a sender can request that recipient - responds in kind (i.e. if it received a position, it should unicast back it's position). - Note: that if you set this on a broadcast you will receive many replies. - """ - dest: builtins.int - """ - The address of the destination node. - This field is is filled in by the mesh radio device software, application - layer software should never need it. - RouteDiscovery messages _must_ populate this. - Other message types might need to if they are doing multihop routing. - """ - source: builtins.int - """ - The address of the original sender for this message. - This field should _only_ be populated for reliable multihop packets (to keep - packets small). - """ - request_id: builtins.int - """ - Only used in routing or response messages. - Indicates the original message ID that this message is reporting failure on. (formerly called original_id) - """ - reply_id: builtins.int - """ - If set, this message is intened to be a reply to a previously sent message with the defined id. - """ - emoji: builtins.int - """ - Defaults to false. If true, then what is in the payload should be treated as an emoji like giving - a message a heart or poop emoji. - """ - bitfield: builtins.int - """ - 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, - *, - portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType = ..., - payload: builtins.bytes = ..., - want_response: builtins.bool = ..., - dest: builtins.int = ..., - source: builtins.int = ..., - request_id: builtins.int = ..., - reply_id: builtins.int = ..., - emoji: builtins.int = ..., - 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", "xeddsa_signature", b"xeddsa_signature"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["_bitfield", b"_bitfield"]) -> typing.Literal["bitfield"] | None: ... - -global___Data = Data - -@typing.final -class KeyVerification(google.protobuf.message.Message): - """ - The actual over-the-mesh message doing KeyVerification - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NONCE_FIELD_NUMBER: builtins.int - HASH1_FIELD_NUMBER: builtins.int - HASH2_FIELD_NUMBER: builtins.int - nonce: builtins.int - """ - random value Selected by the requesting node - """ - hash1: builtins.bytes - """ - The final authoritative hash, only to be sent by NodeA at the end of the handshake - """ - hash2: builtins.bytes - """ - The intermediary hash (actually derived from hash1), - sent from NodeB to NodeA in response to the initial message. - """ - def __init__( - self, - *, - nonce: builtins.int = ..., - hash1: builtins.bytes = ..., - hash2: builtins.bytes = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["hash1", b"hash1", "hash2", b"hash2", "nonce", b"nonce"]) -> None: ... - -global___KeyVerification = KeyVerification - -@typing.final -class StoreForwardPlusPlus(google.protobuf.message.Message): - """ - The actual over-the-mesh message doing store and forward++ - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _SFPP_message_type: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _SFPP_message_typeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[StoreForwardPlusPlus._SFPP_message_type.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - CANON_ANNOUNCE: StoreForwardPlusPlus._SFPP_message_type.ValueType # 0 - """ - Send an announcement of the canonical tip of a chain - """ - CHAIN_QUERY: StoreForwardPlusPlus._SFPP_message_type.ValueType # 1 - """ - Query whether a specific link is on the chain - """ - LINK_REQUEST: StoreForwardPlusPlus._SFPP_message_type.ValueType # 3 - """ - Request the next link in the chain - """ - LINK_PROVIDE: StoreForwardPlusPlus._SFPP_message_type.ValueType # 4 - """ - Provide a link to add to the chain - """ - LINK_PROVIDE_FIRSTHALF: StoreForwardPlusPlus._SFPP_message_type.ValueType # 5 - """ - If we must fragment, send the first half - """ - LINK_PROVIDE_SECONDHALF: StoreForwardPlusPlus._SFPP_message_type.ValueType # 6 - """ - If we must fragment, send the second half - """ - - class SFPP_message_type(_SFPP_message_type, metaclass=_SFPP_message_typeEnumTypeWrapper): - """ - Enum of message types - """ - - CANON_ANNOUNCE: StoreForwardPlusPlus.SFPP_message_type.ValueType # 0 - """ - Send an announcement of the canonical tip of a chain - """ - CHAIN_QUERY: StoreForwardPlusPlus.SFPP_message_type.ValueType # 1 - """ - Query whether a specific link is on the chain - """ - LINK_REQUEST: StoreForwardPlusPlus.SFPP_message_type.ValueType # 3 - """ - Request the next link in the chain - """ - LINK_PROVIDE: StoreForwardPlusPlus.SFPP_message_type.ValueType # 4 - """ - Provide a link to add to the chain - """ - LINK_PROVIDE_FIRSTHALF: StoreForwardPlusPlus.SFPP_message_type.ValueType # 5 - """ - If we must fragment, send the first half - """ - LINK_PROVIDE_SECONDHALF: StoreForwardPlusPlus.SFPP_message_type.ValueType # 6 - """ - If we must fragment, send the second half - """ - - SFPP_MESSAGE_TYPE_FIELD_NUMBER: builtins.int - MESSAGE_HASH_FIELD_NUMBER: builtins.int - COMMIT_HASH_FIELD_NUMBER: builtins.int - ROOT_HASH_FIELD_NUMBER: builtins.int - MESSAGE_FIELD_NUMBER: builtins.int - ENCAPSULATED_ID_FIELD_NUMBER: builtins.int - ENCAPSULATED_TO_FIELD_NUMBER: builtins.int - ENCAPSULATED_FROM_FIELD_NUMBER: builtins.int - ENCAPSULATED_RXTIME_FIELD_NUMBER: builtins.int - CHAIN_COUNT_FIELD_NUMBER: builtins.int - sfpp_message_type: global___StoreForwardPlusPlus.SFPP_message_type.ValueType - """ - Which message type is this - """ - message_hash: builtins.bytes - """ - The hash of the specific message - """ - commit_hash: builtins.bytes - """ - The hash of a link on a chain - """ - root_hash: builtins.bytes - """ - the root hash of a chain - """ - message: builtins.bytes - """ - The encrypted bytes from a message - """ - encapsulated_id: builtins.int - """ - Message ID of the contained message - """ - encapsulated_to: builtins.int - """ - Destination of the contained message - """ - encapsulated_from: builtins.int - """ - Sender of the contained message - """ - encapsulated_rxtime: builtins.int - """ - The receive time of the message in question - """ - chain_count: builtins.int - """ - Used in a LINK_REQUEST to specify the message X spots back from head - """ - def __init__( - self, - *, - sfpp_message_type: global___StoreForwardPlusPlus.SFPP_message_type.ValueType = ..., - message_hash: builtins.bytes = ..., - commit_hash: builtins.bytes = ..., - root_hash: builtins.bytes = ..., - message: builtins.bytes = ..., - encapsulated_id: builtins.int = ..., - encapsulated_to: builtins.int = ..., - encapsulated_from: builtins.int = ..., - encapsulated_rxtime: builtins.int = ..., - chain_count: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["chain_count", b"chain_count", "commit_hash", b"commit_hash", "encapsulated_from", b"encapsulated_from", "encapsulated_id", b"encapsulated_id", "encapsulated_rxtime", b"encapsulated_rxtime", "encapsulated_to", b"encapsulated_to", "message", b"message", "message_hash", b"message_hash", "root_hash", b"root_hash", "sfpp_message_type", b"sfpp_message_type"]) -> None: ... - -global___StoreForwardPlusPlus = StoreForwardPlusPlus - -@typing.final -class RemoteShell(google.protobuf.message.Message): - """ - The actual over-the-mesh message doing RemoteShell - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _OpCode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _OpCodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[RemoteShell._OpCode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - OP_UNSET: RemoteShell._OpCode.ValueType # 0 - OPEN: RemoteShell._OpCode.ValueType # 1 - """Client -> server""" - INPUT: RemoteShell._OpCode.ValueType # 2 - RESIZE: RemoteShell._OpCode.ValueType # 3 - CLOSE: RemoteShell._OpCode.ValueType # 4 - PING: RemoteShell._OpCode.ValueType # 5 - ACK: RemoteShell._OpCode.ValueType # 6 - OPEN_OK: RemoteShell._OpCode.ValueType # 64 - """Server -> client""" - OUTPUT: RemoteShell._OpCode.ValueType # 65 - CLOSED: RemoteShell._OpCode.ValueType # 66 - ERROR: RemoteShell._OpCode.ValueType # 67 - PONG: RemoteShell._OpCode.ValueType # 68 - - class OpCode(_OpCode, metaclass=_OpCodeEnumTypeWrapper): - """ - Frame op code for PTY session control and stream transport. - - Values 1-63 are client->server requests. - Values 64-127 are server->client responses/events. - """ - - OP_UNSET: RemoteShell.OpCode.ValueType # 0 - OPEN: RemoteShell.OpCode.ValueType # 1 - """Client -> server""" - INPUT: RemoteShell.OpCode.ValueType # 2 - RESIZE: RemoteShell.OpCode.ValueType # 3 - CLOSE: RemoteShell.OpCode.ValueType # 4 - PING: RemoteShell.OpCode.ValueType # 5 - ACK: RemoteShell.OpCode.ValueType # 6 - OPEN_OK: RemoteShell.OpCode.ValueType # 64 - """Server -> client""" - OUTPUT: RemoteShell.OpCode.ValueType # 65 - CLOSED: RemoteShell.OpCode.ValueType # 66 - ERROR: RemoteShell.OpCode.ValueType # 67 - PONG: RemoteShell.OpCode.ValueType # 68 - - OP_FIELD_NUMBER: builtins.int - SESSION_ID_FIELD_NUMBER: builtins.int - SEQ_FIELD_NUMBER: builtins.int - ACK_SEQ_FIELD_NUMBER: builtins.int - PAYLOAD_FIELD_NUMBER: builtins.int - COLS_FIELD_NUMBER: builtins.int - ROWS_FIELD_NUMBER: builtins.int - FLAGS_FIELD_NUMBER: builtins.int - LAST_TX_SEQ_FIELD_NUMBER: builtins.int - LAST_RX_SEQ_FIELD_NUMBER: builtins.int - op: global___RemoteShell.OpCode.ValueType - """ - Structured frame operation. - """ - session_id: builtins.int - """ - Logical PTY session identifier. - """ - seq: builtins.int - """ - Monotonic sequence number for this frame. - """ - ack_seq: builtins.int - """ - Cumulative ack sequence number. - """ - payload: builtins.bytes - """ - Opaque bytes payload for INPUT/OUTPUT/ERROR and other frame bodies. - """ - cols: builtins.int - """ - Terminal size columns used for OPEN/RESIZE signaling. - """ - rows: builtins.int - """ - Terminal size rows used for OPEN/RESIZE signaling. - """ - flags: builtins.int - """ - Bit flags for protocol extensions. - """ - last_tx_seq: builtins.int - """ - The last sequence number TX'd. - """ - last_rx_seq: builtins.int - """ - The last sequence number RX'd. - """ - def __init__( - self, - *, - op: global___RemoteShell.OpCode.ValueType = ..., - session_id: builtins.int = ..., - seq: builtins.int = ..., - ack_seq: builtins.int = ..., - payload: builtins.bytes = ..., - cols: builtins.int = ..., - rows: builtins.int = ..., - flags: builtins.int = ..., - last_tx_seq: builtins.int = ..., - last_rx_seq: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["ack_seq", b"ack_seq", "cols", b"cols", "flags", b"flags", "last_rx_seq", b"last_rx_seq", "last_tx_seq", b"last_tx_seq", "op", b"op", "payload", b"payload", "rows", b"rows", "seq", b"seq", "session_id", b"session_id"]) -> None: ... - -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): - """ - Waypoint message, used to share arbitrary locations across the mesh - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ID_FIELD_NUMBER: builtins.int - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - EXPIRE_FIELD_NUMBER: builtins.int - LOCKED_TO_FIELD_NUMBER: builtins.int - NAME_FIELD_NUMBER: builtins.int - DESCRIPTION_FIELD_NUMBER: builtins.int - ICON_FIELD_NUMBER: builtins.int - 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 - """ - latitude_i: builtins.int - """ - latitude_i - """ - longitude_i: builtins.int - """ - longitude_i - """ - expire: builtins.int - """ - Time the waypoint is to expire (epoch) - """ - locked_to: builtins.int - """ - If greater than zero, treat the value as a nodenum only allowing them to update the waypoint. - If zero, the waypoint is open to be edited by any member of the mesh. - """ - name: builtins.str - """ - Name of the waypoint - max 30 chars - """ - description: builtins.str - """ - Description of the waypoint - max 100 chars - """ - icon: builtins.int - """ - Designator icon for the waypoint in the form of a unicode emoji - """ - 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, - *, - id: builtins.int = ..., - latitude_i: builtins.int | None = ..., - longitude_i: builtins.int | None = ..., - expire: builtins.int = ..., - locked_to: builtins.int = ..., - 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["_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 - def WhichOneof(self, oneof_group: typing.Literal["_longitude_i", b"_longitude_i"]) -> typing.Literal["longitude_i"] | None: ... - -global___Waypoint = Waypoint - -@typing.final -class StatusMessage(google.protobuf.message.Message): - """ - Message for node status - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STATUS_FIELD_NUMBER: builtins.int - status: builtins.str - def __init__( - self, - *, - status: builtins.str = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["status", b"status"]) -> None: ... - -global___StatusMessage = StatusMessage - -@typing.final -class MqttClientProxyMessage(google.protobuf.message.Message): - """ - This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - TOPIC_FIELD_NUMBER: builtins.int - DATA_FIELD_NUMBER: builtins.int - TEXT_FIELD_NUMBER: builtins.int - RETAINED_FIELD_NUMBER: builtins.int - topic: builtins.str - """ - The MQTT topic this message will be sent /received on - """ - data: builtins.bytes - """ - Bytes - """ - text: builtins.str - """ - Text - """ - retained: builtins.bool - """ - Whether the message should be retained (or not) - """ - def __init__( - self, - *, - topic: builtins.str = ..., - data: builtins.bytes = ..., - text: builtins.str = ..., - retained: builtins.bool = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["data", b"data", "payload_variant", b"payload_variant", "text", b"text"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["data", b"data", "payload_variant", b"payload_variant", "retained", b"retained", "text", b"text", "topic", b"topic"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["data", "text"] | None: ... - -global___MqttClientProxyMessage = MqttClientProxyMessage - -@typing.final -class MeshPacket(google.protobuf.message.Message): - """ - A packet envelope sent/received over the mesh - only payload_variant is sent in the payload portion of the LORA packet. - The other fields are either not sent at all, or sent in the special 16 byte LORA header. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _Priority: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _PriorityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._Priority.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: MeshPacket._Priority.ValueType # 0 - """ - Treated as Priority.DEFAULT - """ - MIN: MeshPacket._Priority.ValueType # 1 - """ - TODO: REPLACE - """ - BACKGROUND: MeshPacket._Priority.ValueType # 10 - """ - Background position updates are sent with very low priority - - if the link is super congested they might not go out at all - """ - DEFAULT: MeshPacket._Priority.ValueType # 64 - """ - This priority is used for most messages that don't have a priority set - """ - RELIABLE: MeshPacket._Priority.ValueType # 70 - """ - If priority is unset but the message is marked as want_ack, - assume it is important and use a slightly higher priority - """ - RESPONSE: MeshPacket._Priority.ValueType # 80 - """ - If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. - Furthermore, responses stop relaying packets directed to a node early. - """ - HIGH: MeshPacket._Priority.ValueType # 100 - """ - Higher priority for specific message types (portnums) to distinguish between other reliable packets. - """ - ALERT: MeshPacket._Priority.ValueType # 110 - """ - Higher priority alert message used for critical alerts which take priority over other reliable packets. - """ - ACK: MeshPacket._Priority.ValueType # 120 - """ - Ack/naks are sent with very high priority to ensure that retransmission - stops as soon as possible - """ - MAX: MeshPacket._Priority.ValueType # 127 - """ - TODO: REPLACE - """ - - class Priority(_Priority, metaclass=_PriorityEnumTypeWrapper): - """ - The priority of this message for sending. - Higher priorities are sent first (when managing the transmit queue). - This field is never sent over the air, it is only used internally inside of a local device node. - API clients (either on the local node or connected directly to the node) - can set this parameter if necessary. - (values must be <= 127 to keep protobuf field to one byte in size. - Detailed background on this field: - I noticed a funny side effect of lora being so slow: Usually when making - a protocol there isn’t much need to use message priority to change the order - of transmission (because interfaces are fairly fast). - But for lora where packets can take a few seconds each, it is very important - to make sure that critical packets are sent ASAP. - In the case of meshtastic that means we want to send protocol acks as soon as possible - (to prevent unneeded retransmissions), we want routing messages to be sent next, - then messages marked as reliable and finally 'background' packets like periodic position updates. - So I bit the bullet and implemented a new (internal - not sent over the air) - field in MeshPacket called 'priority'. - And the transmission queue in the router object is now a priority queue. - """ - - UNSET: MeshPacket.Priority.ValueType # 0 - """ - Treated as Priority.DEFAULT - """ - MIN: MeshPacket.Priority.ValueType # 1 - """ - TODO: REPLACE - """ - BACKGROUND: MeshPacket.Priority.ValueType # 10 - """ - Background position updates are sent with very low priority - - if the link is super congested they might not go out at all - """ - DEFAULT: MeshPacket.Priority.ValueType # 64 - """ - This priority is used for most messages that don't have a priority set - """ - RELIABLE: MeshPacket.Priority.ValueType # 70 - """ - If priority is unset but the message is marked as want_ack, - assume it is important and use a slightly higher priority - """ - RESPONSE: MeshPacket.Priority.ValueType # 80 - """ - If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. - Furthermore, responses stop relaying packets directed to a node early. - """ - HIGH: MeshPacket.Priority.ValueType # 100 - """ - Higher priority for specific message types (portnums) to distinguish between other reliable packets. - """ - ALERT: MeshPacket.Priority.ValueType # 110 - """ - Higher priority alert message used for critical alerts which take priority over other reliable packets. - """ - ACK: MeshPacket.Priority.ValueType # 120 - """ - Ack/naks are sent with very high priority to ensure that retransmission - stops as soon as possible - """ - MAX: MeshPacket.Priority.ValueType # 127 - """ - TODO: REPLACE - """ - - class _Delayed: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _DelayedEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._Delayed.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - NO_DELAY: MeshPacket._Delayed.ValueType # 0 - """ - If unset, the message is being sent in real time. - """ - DELAYED_BROADCAST: MeshPacket._Delayed.ValueType # 1 - """ - The message is delayed and was originally a broadcast - """ - DELAYED_DIRECT: MeshPacket._Delayed.ValueType # 2 - """ - The message is delayed and was originally a direct message - """ - - class Delayed(_Delayed, metaclass=_DelayedEnumTypeWrapper): - """ - Identify if this is a delayed packet - """ - - NO_DELAY: MeshPacket.Delayed.ValueType # 0 - """ - If unset, the message is being sent in real time. - """ - DELAYED_BROADCAST: MeshPacket.Delayed.ValueType # 1 - """ - The message is delayed and was originally a broadcast - """ - DELAYED_DIRECT: MeshPacket.Delayed.ValueType # 2 - """ - The message is delayed and was originally a direct message - """ - - class _TransportMechanism: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _TransportMechanismEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._TransportMechanism.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - TRANSPORT_INTERNAL: MeshPacket._TransportMechanism.ValueType # 0 - """ - The default case is that the node generated a packet itself - """ - TRANSPORT_LORA: MeshPacket._TransportMechanism.ValueType # 1 - """ - Arrived via the primary LoRa radio - """ - TRANSPORT_LORA_ALT1: MeshPacket._TransportMechanism.ValueType # 2 - """ - Arrived via a secondary LoRa radio - """ - TRANSPORT_LORA_ALT2: MeshPacket._TransportMechanism.ValueType # 3 - """ - Arrived via a tertiary LoRa radio - """ - TRANSPORT_LORA_ALT3: MeshPacket._TransportMechanism.ValueType # 4 - """ - Arrived via a quaternary LoRa radio - """ - TRANSPORT_MQTT: MeshPacket._TransportMechanism.ValueType # 5 - """ - Arrived via an MQTT connection - """ - TRANSPORT_MULTICAST_UDP: MeshPacket._TransportMechanism.ValueType # 6 - """ - Arrived via Multicast UDP - """ - TRANSPORT_API: MeshPacket._TransportMechanism.ValueType # 7 - """ - Arrived via API connection - """ - TRANSPORT_UNICAST_UDP: MeshPacket._TransportMechanism.ValueType # 8 - """ - Arrived via Unicast UDP - """ - - class TransportMechanism(_TransportMechanism, metaclass=_TransportMechanismEnumTypeWrapper): - """ - Enum to identify which transport mechanism this packet arrived over - """ - - TRANSPORT_INTERNAL: MeshPacket.TransportMechanism.ValueType # 0 - """ - The default case is that the node generated a packet itself - """ - TRANSPORT_LORA: MeshPacket.TransportMechanism.ValueType # 1 - """ - Arrived via the primary LoRa radio - """ - TRANSPORT_LORA_ALT1: MeshPacket.TransportMechanism.ValueType # 2 - """ - Arrived via a secondary LoRa radio - """ - TRANSPORT_LORA_ALT2: MeshPacket.TransportMechanism.ValueType # 3 - """ - Arrived via a tertiary LoRa radio - """ - TRANSPORT_LORA_ALT3: MeshPacket.TransportMechanism.ValueType # 4 - """ - Arrived via a quaternary LoRa radio - """ - TRANSPORT_MQTT: MeshPacket.TransportMechanism.ValueType # 5 - """ - Arrived via an MQTT connection - """ - TRANSPORT_MULTICAST_UDP: MeshPacket.TransportMechanism.ValueType # 6 - """ - Arrived via Multicast UDP - """ - TRANSPORT_API: MeshPacket.TransportMechanism.ValueType # 7 - """ - 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 - CHANNEL_FIELD_NUMBER: builtins.int - DECODED_FIELD_NUMBER: builtins.int - ENCRYPTED_FIELD_NUMBER: builtins.int - ID_FIELD_NUMBER: builtins.int - RX_TIME_FIELD_NUMBER: builtins.int - RX_SNR_FIELD_NUMBER: builtins.int - HOP_LIMIT_FIELD_NUMBER: builtins.int - WANT_ACK_FIELD_NUMBER: builtins.int - PRIORITY_FIELD_NUMBER: builtins.int - RX_RSSI_FIELD_NUMBER: builtins.int - DELAYED_FIELD_NUMBER: builtins.int - VIA_MQTT_FIELD_NUMBER: builtins.int - HOP_START_FIELD_NUMBER: builtins.int - PUBLIC_KEY_FIELD_NUMBER: builtins.int - PKI_ENCRYPTED_FIELD_NUMBER: builtins.int - NEXT_HOP_FIELD_NUMBER: builtins.int - 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 - If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was - not destined for a specific node, but for a channel as indicated by the value of `channel` below. - If the value is another, this indicates that the packet was destined for a specific - node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel. - """ - channel: builtins.int - """ - (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on. - If unset, packet was on the primary channel. - A particular node might know only a subset of channels in use on the mesh. - Therefore channel_index is inherently a local concept and meaningless to send between nodes. - Very briefly, while sending and receiving deep inside the device Router code, this field instead - contains the 'channel hash' instead of the index. - This 'trick' is only used while the payload_variant is an 'encrypted'. - """ - encrypted: builtins.bytes - """ - TODO: REPLACE - """ - id: builtins.int - """ - A unique ID for this packet. - Always 0 for no-ack packets or non broadcast packets (and therefore take zero bytes of space). - Otherwise a unique ID for this packet, useful for flooding algorithms. - ID only needs to be unique on a _per sender_ basis, and it only - needs to be unique for a few minutes (long enough to last for the length of - any ACK or the completion of a mesh broadcast flood). - Note: Our crypto implementation uses this id as well. - See [crypto](/docs/overview/encryption) for details. - """ - rx_time: builtins.int - """ - The time this message was received by the esp32 (secs since 1970). - Note: this field is _never_ sent on the radio link itself (to save space) Times - are typically not sent over the mesh, but they will be added to any Packet - (chain of SubPacket) sent to the phone (so the phone can know exact time of reception) - 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 - """ - *Never* sent over the radio links. - Set during reception to indicate the SNR of this packet. - Used to collect statistics on current link quality. - """ - hop_limit: builtins.int - """ - If unset treated as zero (no forwarding, send to direct neighbor nodes only) - if 1, allow hopping through one node, etc... - For our usecase real world topologies probably have a max of about 3. - This field is normally placed into a few of bits in the header. - """ - want_ack: builtins.bool - """ - This packet is being sent as a reliable message, we would prefer it to arrive at the destination. - We would like to receive a ack packet in response. - Broadcasts messages treat this flag specially: Since acks for broadcasts would - rapidly flood the channel, the normal ack behavior is suppressed. - Instead, the original sender listens to see if at least one node is rebroadcasting this packet (because naive flooding algorithm). - If it hears that the odds (given typical LoRa topologies) the odds are very high that every node should eventually receive the message. - So FloodingRouter.cpp generates an implicit ack which is delivered to the original sender. - If after some time we don't hear anyone rebroadcast our packet, we will timeout and retransmit, using the regular resend logic. - Note: This flag is normally sent in a flag bit in the header when sent over the wire - """ - priority: global___MeshPacket.Priority.ValueType - """ - The priority of this message for sending. - See MeshPacket.Priority description for more details. - """ - rx_rssi: builtins.int - """ - rssi of received packet. Only sent to phone for dispay purposes. - 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 - """ - Describe if this message is delayed - """ - via_mqtt: builtins.bool - """ - Describes whether this packet passed via MQTT somewhere along the path it currently took. - """ - hop_start: builtins.int - """ - Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header. - When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled. - 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 - """ - Records the public key the packet was encrypted with, if applicable. - """ - pki_encrypted: builtins.bool - """ - Indicates whether the packet was en/decrypted using PKI - """ - next_hop: builtins.int - """ - Last byte of the node number of the node that should be used as the next hop in routing. - Set by the firmware internally, clients are not supposed to set this. - """ - relay_node: builtins.int - """ - Last byte of the node number of the node that will relay/relayed this packet. - Set by the firmware internally, clients are not supposed to set this. - """ - tx_after: builtins.int - """ - *Never* sent over the radio links. - Timestamp after which this packet may be sent. - Set by the firmware internally, clients are not supposed to set this. - """ - transport_mechanism: global___MeshPacket.TransportMechanism.ValueType - """ - 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: - """ - TODO: REPLACE - """ - - def __init__( - self, - *, - to: builtins.int = ..., - channel: builtins.int = ..., - decoded: global___Data | None = ..., - encrypted: builtins.bytes = ..., - id: 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 | None = ..., - delayed: global___MeshPacket.Delayed.ValueType = ..., - via_mqtt: builtins.bool = ..., - hop_start: builtins.int = ..., - public_key: builtins.bytes = ..., - pki_encrypted: builtins.bool = ..., - next_hop: builtins.int = ..., - 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["_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 - -@typing.final -class NodeInfo(google.protobuf.message.Message): - """ - The bluetooth to device link: - Old BTLE protocol docs from TODO, merge in above and make real docs... - use protocol buffers, and NanoPB - messages from device to phone: - POSITION_UPDATE (..., time) - TEXT_RECEIVED(from, text, time) - OPAQUE_RECEIVED(from, payload, time) (for signal messages or other applications) - messages from phone to device: - SET_MYID(id, human readable long, human readable short) (send down the unique ID - string used for this node, a human readable string shown for that id, and a very - short human readable string suitable for oled screen) SEND_OPAQUE(dest, payload) - (for signal messages or other applications) SEND_TEXT(dest, text) Get all - nodes() (returns list of nodes, with full info, last time seen, loc, battery - level etc) SET_CONFIG (switches device to a new set of radio params and - preshared key, drops all existing nodes, force our node to rejoin this new group) - Full information about a node on the mesh - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NUM_FIELD_NUMBER: builtins.int - USER_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - SNR_FIELD_NUMBER: builtins.int - LAST_HEARD_FIELD_NUMBER: builtins.int - DEVICE_METRICS_FIELD_NUMBER: builtins.int - CHANNEL_FIELD_NUMBER: builtins.int - VIA_MQTT_FIELD_NUMBER: builtins.int - HOPS_AWAY_FIELD_NUMBER: builtins.int - IS_FAVORITE_FIELD_NUMBER: builtins.int - 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 - """ - snr: builtins.float - """ - Returns the Signal-to-noise ratio (SNR) of the last received message, - as measured by the receiver. Return SNR of the last received message in dB - """ - last_heard: builtins.int - """ - TODO: REMOVE/INTEGRATE - Not currently used (till full DSR deployment?) Our current preferred node node for routing - might be the same as num if - we are direct neighbor or zero if we don't yet know a route to this node. - fixed32 next_hop = 5; - - - Set to indicate the last time we received a packet from this node - """ - channel: builtins.int - """ - local channel index we heard that node on. Only populated if its not the default channel. - """ - via_mqtt: builtins.bool - """ - True if we witnessed the node over MQTT instead of LoRA transport - """ - hops_away: builtins.int - """ - Number of hops away from us this node is (0 if 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 - """ - is_key_manually_verified: builtins.bool - """ - True if node public key has been verified. - Persists between NodeDB internal clean ups - LSB 0 of the bitfield - """ - is_muted: builtins.bool - """ - 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: - """ - The user info for this node - """ - - @property - def position(self) -> global___Position: - """ - This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. - Position.time now indicates the last time we received a POSITION from that node. - """ - - @property - def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics: - """ - The latest device metrics for the node. - """ - - def __init__( - self, - *, - num: builtins.int = ..., - user: global___User | None = ..., - position: global___Position | 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 = ..., - 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", "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 - -@typing.final -class MyNodeInfo(google.protobuf.message.Message): - """ - Unique local debugging info for this node - Note: we don't include position or the user info, because that will come in the - Sent to the phone in response to WantNodes. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - MY_NODE_NUM_FIELD_NUMBER: builtins.int - REBOOT_COUNT_FIELD_NUMBER: builtins.int - MIN_APP_VERSION_FIELD_NUMBER: builtins.int - DEVICE_ID_FIELD_NUMBER: builtins.int - PIO_ENV_FIELD_NUMBER: builtins.int - FIRMWARE_EDITION_FIELD_NUMBER: builtins.int - NODEDB_COUNT_FIELD_NUMBER: builtins.int - my_node_num: builtins.int - """ - Tells the phone what our node number is, default starting value is - lowbyte of macaddr, but it will be fixed if that is already in use - """ - reboot_count: builtins.int - """ - The total number of reboots this node has ever encountered - (well - since the last time we discarded preferences) - """ - min_app_version: builtins.int - """ - The minimum app version that can talk to this device. - Phone/PC apps should compare this to their build number and if too low tell the user they must update their app - """ - device_id: builtins.bytes - """ - Unique hardware identifier for this device - """ - pio_env: builtins.str - """ - The PlatformIO environment used to build this firmware - """ - firmware_edition: global___FirmwareEdition.ValueType - """ - The indicator for whether this device is running event firmware and which - """ - nodedb_count: builtins.int - """ - The number of nodes in the nodedb. - This is used by the phone to know how many NodeInfo packets to expect on want_config - """ - def __init__( - self, - *, - my_node_num: builtins.int = ..., - reboot_count: builtins.int = ..., - min_app_version: builtins.int = ..., - device_id: builtins.bytes = ..., - pio_env: builtins.str = ..., - firmware_edition: global___FirmwareEdition.ValueType = ..., - nodedb_count: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["device_id", b"device_id", "firmware_edition", b"firmware_edition", "min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "nodedb_count", b"nodedb_count", "pio_env", b"pio_env", "reboot_count", b"reboot_count"]) -> None: ... - -global___MyNodeInfo = MyNodeInfo - -@typing.final -class LogRecord(google.protobuf.message.Message): - """ - Debug output from the device. - To minimize the size of records inside the device code, if a time/source/level is not set - on the message it is assumed to be a continuation of the previously sent message. - This allows the device code to use fixed maxlen 64 byte strings for messages, - and then extend as needed by emitting multiple records. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _Level: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _LevelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[LogRecord._Level.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: LogRecord._Level.ValueType # 0 - """ - Log levels, chosen to match python logging conventions. - """ - CRITICAL: LogRecord._Level.ValueType # 50 - """ - Log levels, chosen to match python logging conventions. - """ - ERROR: LogRecord._Level.ValueType # 40 - """ - Log levels, chosen to match python logging conventions. - """ - WARNING: LogRecord._Level.ValueType # 30 - """ - Log levels, chosen to match python logging conventions. - """ - INFO: LogRecord._Level.ValueType # 20 - """ - Log levels, chosen to match python logging conventions. - """ - DEBUG: LogRecord._Level.ValueType # 10 - """ - Log levels, chosen to match python logging conventions. - """ - TRACE: LogRecord._Level.ValueType # 5 - """ - Log levels, chosen to match python logging conventions. - """ - - class Level(_Level, metaclass=_LevelEnumTypeWrapper): - """ - Log levels, chosen to match python logging conventions. - """ - - UNSET: LogRecord.Level.ValueType # 0 - """ - Log levels, chosen to match python logging conventions. - """ - CRITICAL: LogRecord.Level.ValueType # 50 - """ - Log levels, chosen to match python logging conventions. - """ - ERROR: LogRecord.Level.ValueType # 40 - """ - Log levels, chosen to match python logging conventions. - """ - WARNING: LogRecord.Level.ValueType # 30 - """ - Log levels, chosen to match python logging conventions. - """ - INFO: LogRecord.Level.ValueType # 20 - """ - Log levels, chosen to match python logging conventions. - """ - DEBUG: LogRecord.Level.ValueType # 10 - """ - Log levels, chosen to match python logging conventions. - """ - TRACE: LogRecord.Level.ValueType # 5 - """ - Log levels, chosen to match python logging conventions. - """ - - MESSAGE_FIELD_NUMBER: builtins.int - TIME_FIELD_NUMBER: builtins.int - SOURCE_FIELD_NUMBER: builtins.int - LEVEL_FIELD_NUMBER: builtins.int - message: builtins.str - """ - Log levels, chosen to match python logging conventions. - """ - time: builtins.int - """ - Seconds since 1970 - or 0 for unknown/unset - """ - source: builtins.str - """ - Usually based on thread name - if known - """ - level: global___LogRecord.Level.ValueType - """ - Not yet set - """ - def __init__( - self, - *, - message: builtins.str = ..., - time: builtins.int = ..., - source: builtins.str = ..., - level: global___LogRecord.Level.ValueType = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["level", b"level", "message", b"message", "source", b"source", "time", b"time"]) -> None: ... - -global___LogRecord = LogRecord - -@typing.final -class QueueStatus(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RES_FIELD_NUMBER: builtins.int - FREE_FIELD_NUMBER: builtins.int - MAXLEN_FIELD_NUMBER: builtins.int - MESH_PACKET_ID_FIELD_NUMBER: builtins.int - res: builtins.int - """Last attempt to queue status, ErrorCode""" - free: builtins.int - """Free entries in the outgoing queue""" - maxlen: builtins.int - """Maximum entries in the outgoing queue""" - mesh_packet_id: builtins.int - """What was mesh packet id that generated this response?""" - def __init__( - self, - *, - res: builtins.int = ..., - free: builtins.int = ..., - maxlen: builtins.int = ..., - mesh_packet_id: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["free", b"free", "maxlen", b"maxlen", "mesh_packet_id", b"mesh_packet_id", "res", b"res"]) -> None: ... - -global___QueueStatus = QueueStatus - -@typing.final -class FromRadio(google.protobuf.message.Message): - """ - Packets from the radio to the phone will appear on the fromRadio characteristic. - It will support READ and NOTIFY. When a new packet arrives the device will BLE notify? - It will sit in that descriptor until consumed by the phone, - at which point the next item in the FIFO will be populated. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ID_FIELD_NUMBER: builtins.int - PACKET_FIELD_NUMBER: builtins.int - MY_INFO_FIELD_NUMBER: builtins.int - NODE_INFO_FIELD_NUMBER: builtins.int - CONFIG_FIELD_NUMBER: builtins.int - LOG_RECORD_FIELD_NUMBER: builtins.int - CONFIG_COMPLETE_ID_FIELD_NUMBER: builtins.int - REBOOTED_FIELD_NUMBER: builtins.int - MODULECONFIG_FIELD_NUMBER: builtins.int - CHANNEL_FIELD_NUMBER: builtins.int - QUEUESTATUS_FIELD_NUMBER: builtins.int - XMODEMPACKET_FIELD_NUMBER: builtins.int - METADATA_FIELD_NUMBER: builtins.int - MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int - FILEINFO_FIELD_NUMBER: builtins.int - 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, - see our bluetooth docs - """ - config_complete_id: builtins.int - """ - Sent as true once the device has finished sending all of the responses to want_config - recipient should check if this ID matches our original request nonce, if - not, it means your config responses haven't started yet. - NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. - """ - rebooted: builtins.bool - """ - Sent to tell clients the radio has just rebooted. - Set to true if present. - Not used on all transports, currently just used for the serial console. - NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. - """ - @property - def packet(self) -> global___MeshPacket: - """ - Log levels, chosen to match python logging conventions. - """ - - @property - def my_info(self) -> global___MyNodeInfo: - """ - Tells the phone what our node number is, can be -1 if we've not yet joined a mesh. - NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. - """ - - @property - def node_info(self) -> global___NodeInfo: - """ - One packet is sent for each node in the on radio DB - starts over with the first node in our DB - """ - - @property - def config(self) -> meshtastic.protobuf.config_pb2.Config: - """ - Include a part of the config (was: RadioConfig radio) - """ - - @property - def log_record(self) -> global___LogRecord: - """ - Set to send debug console output over our protobuf stream - """ - - @property - def moduleConfig(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig: - """ - Include module config - """ - - @property - def channel(self) -> meshtastic.protobuf.channel_pb2.Channel: - """ - One packet is sent for each channel - """ - - @property - def queueStatus(self) -> global___QueueStatus: - """ - Queue status info - """ - - @property - def xmodemPacket(self) -> meshtastic.protobuf.xmodem_pb2.XModem: - """ - File Transfer Chunk - """ - - @property - def metadata(self) -> global___DeviceMetadata: - """ - Device metadata message - """ - - @property - def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage: - """ - MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) - """ - - @property - def fileInfo(self) -> global___FileInfo: - """ - File system manifest messages - """ - - @property - def clientNotification(self) -> global___ClientNotification: - """ - Notification message to the client - """ - - @property - def deviceuiConfig(self) -> meshtastic.protobuf.device_ui_pb2.DeviceUIConfig: - """ - Persistent data for device-ui - """ - - @property - def lockdown_status(self) -> global___LockdownStatus: - """ - Lockdown state notification for hardened firmware builds. - Sent post-config (so unauthorized clients learn they must - provision/unlock) and after each LockdownAuth admin command - to report success or failure. Replaces the earlier scheme of - 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, - *, - id: builtins.int = ..., - packet: global___MeshPacket | None = ..., - my_info: global___MyNodeInfo | None = ..., - node_info: global___NodeInfo | None = ..., - config: meshtastic.protobuf.config_pb2.Config | None = ..., - log_record: global___LogRecord | None = ..., - config_complete_id: builtins.int = ..., - rebooted: builtins.bool = ..., - moduleConfig: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ..., - channel: meshtastic.protobuf.channel_pb2.Channel | None = ..., - queueStatus: global___QueueStatus | None = ..., - xmodemPacket: meshtastic.protobuf.xmodem_pb2.XModem | None = ..., - metadata: global___DeviceMetadata | None = ..., - mqttClientProxyMessage: global___MqttClientProxyMessage | None = ..., - fileInfo: global___FileInfo | None = ..., - 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", "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 - -@typing.final -class LockdownStatus(google.protobuf.message.Message): - """ - Lockdown state report from firmware to client (for hardened builds - with MESHTASTIC_LOCKDOWN). Sent immediately after config_complete_id - to inform a freshly-connected unauthorized client what it must do, - and again in response to each LockdownAuth admin command. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _State: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _StateEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[LockdownStatus._State.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - STATE_UNSPECIFIED: LockdownStatus._State.ValueType # 0 - """Default; should not be sent.""" - NEEDS_PROVISION: LockdownStatus._State.ValueType # 1 - """ - No passphrase has ever been provisioned on this device. - Client should prompt the operator to set one. - """ - LOCKED: LockdownStatus._State.ValueType # 2 - """ - Storage is locked or this client has not authenticated yet. - lock_reason carries a machine-readable detail string. - Client should present (or auto-replay) a passphrase via - AdminMessage.lockdown_auth. - """ - UNLOCKED: LockdownStatus._State.ValueType # 3 - """ - Passphrase accepted; client is now authorized for this connection. - boots_remaining and valid_until_epoch describe the active session - token's TTL. - """ - UNLOCK_FAILED: LockdownStatus._State.ValueType # 4 - """ - 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 - """Default; should not be sent.""" - NEEDS_PROVISION: LockdownStatus.State.ValueType # 1 - """ - No passphrase has ever been provisioned on this device. - Client should prompt the operator to set one. - """ - LOCKED: LockdownStatus.State.ValueType # 2 - """ - Storage is locked or this client has not authenticated yet. - lock_reason carries a machine-readable detail string. - Client should present (or auto-replay) a passphrase via - AdminMessage.lockdown_auth. - """ - UNLOCKED: LockdownStatus.State.ValueType # 3 - """ - Passphrase accepted; client is now authorized for this connection. - boots_remaining and valid_until_epoch describe the active session - token's TTL. - """ - UNLOCK_FAILED: LockdownStatus.State.ValueType # 4 - """ - 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 - BOOTS_REMAINING_FIELD_NUMBER: builtins.int - VALID_UNTIL_EPOCH_FIELD_NUMBER: builtins.int - BACKOFF_SECONDS_FIELD_NUMBER: builtins.int - state: global___LockdownStatus.State.ValueType - """Current lockdown state being reported.""" - 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 - Other values may be added; clients should treat unknown values as - "locked, ask for passphrase". - """ - boots_remaining: builtins.int - """ - For UNLOCKED: remaining boots on the issued session token. - Decrements by 1 on each subsequent boot. - """ - valid_until_epoch: builtins.int - """ - For UNLOCKED: wall-clock expiry of the issued session token, - absolute Unix-epoch seconds. 0 = no time limit. - """ - backoff_seconds: builtins.int - """ - For UNLOCK_FAILED: seconds the client must wait before another - passphrase attempt will be accepted. 0 = wrong passphrase, no - backoff (immediate retry allowed but advisable to prompt user). - """ - def __init__( - self, - *, - state: global___LockdownStatus.State.ValueType = ..., - lock_reason: builtins.str = ..., - boots_remaining: builtins.int = ..., - valid_until_epoch: builtins.int = ..., - backoff_seconds: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["backoff_seconds", b"backoff_seconds", "boots_remaining", b"boots_remaining", "lock_reason", b"lock_reason", "state", b"state", "valid_until_epoch", b"valid_until_epoch"]) -> None: ... - -global___LockdownStatus = LockdownStatus - -@typing.final -class ClientNotification(google.protobuf.message.Message): - """ - A notification message from the device to the client - To be used for important messages that should to be displayed to the user - in the form of push notifications or validation messages when saving - invalid configuration. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - REPLY_ID_FIELD_NUMBER: builtins.int - TIME_FIELD_NUMBER: builtins.int - LEVEL_FIELD_NUMBER: builtins.int - MESSAGE_FIELD_NUMBER: builtins.int - KEY_VERIFICATION_NUMBER_INFORM_FIELD_NUMBER: builtins.int - KEY_VERIFICATION_NUMBER_REQUEST_FIELD_NUMBER: builtins.int - KEY_VERIFICATION_FINAL_FIELD_NUMBER: builtins.int - DUPLICATED_PUBLIC_KEY_FIELD_NUMBER: builtins.int - LOW_ENTROPY_KEY_FIELD_NUMBER: builtins.int - reply_id: builtins.int - """ - The id of the packet we're notifying in response to - """ - time: builtins.int - """ - Seconds since 1970 - or 0 for unknown/unset - """ - level: global___LogRecord.Level.ValueType - """ - The level type of notification - """ - message: builtins.str - """ - The message body of the notification - """ - @property - def key_verification_number_inform(self) -> global___KeyVerificationNumberInform: ... - @property - def key_verification_number_request(self) -> global___KeyVerificationNumberRequest: ... - @property - def key_verification_final(self) -> global___KeyVerificationFinal: ... - @property - def duplicated_public_key(self) -> global___DuplicatedPublicKey: ... - @property - def low_entropy_key(self) -> global___LowEntropyKey: ... - def __init__( - self, - *, - reply_id: builtins.int | None = ..., - time: builtins.int = ..., - level: global___LogRecord.Level.ValueType = ..., - message: builtins.str = ..., - key_verification_number_inform: global___KeyVerificationNumberInform | None = ..., - key_verification_number_request: global___KeyVerificationNumberRequest | None = ..., - key_verification_final: global___KeyVerificationFinal | None = ..., - duplicated_public_key: global___DuplicatedPublicKey | None = ..., - low_entropy_key: global___LowEntropyKey | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "low_entropy_key", b"low_entropy_key", "payload_variant", b"payload_variant", "reply_id", b"reply_id"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "level", b"level", "low_entropy_key", b"low_entropy_key", "message", b"message", "payload_variant", b"payload_variant", "reply_id", b"reply_id", "time", b"time"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_reply_id", b"_reply_id"]) -> typing.Literal["reply_id"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["key_verification_number_inform", "key_verification_number_request", "key_verification_final", "duplicated_public_key", "low_entropy_key"] | None: ... - -global___ClientNotification = ClientNotification - -@typing.final -class KeyVerificationNumberInform(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NONCE_FIELD_NUMBER: builtins.int - REMOTE_LONGNAME_FIELD_NUMBER: builtins.int - SECURITY_NUMBER_FIELD_NUMBER: builtins.int - nonce: builtins.int - remote_longname: builtins.str - security_number: builtins.int - def __init__( - self, - *, - nonce: builtins.int = ..., - remote_longname: builtins.str = ..., - security_number: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname", "security_number", b"security_number"]) -> None: ... - -global___KeyVerificationNumberInform = KeyVerificationNumberInform - -@typing.final -class KeyVerificationNumberRequest(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NONCE_FIELD_NUMBER: builtins.int - REMOTE_LONGNAME_FIELD_NUMBER: builtins.int - nonce: builtins.int - remote_longname: builtins.str - def __init__( - self, - *, - nonce: builtins.int = ..., - remote_longname: builtins.str = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname"]) -> None: ... - -global___KeyVerificationNumberRequest = KeyVerificationNumberRequest - -@typing.final -class KeyVerificationFinal(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NONCE_FIELD_NUMBER: builtins.int - REMOTE_LONGNAME_FIELD_NUMBER: builtins.int - ISSENDER_FIELD_NUMBER: builtins.int - VERIFICATION_CHARACTERS_FIELD_NUMBER: builtins.int - nonce: builtins.int - remote_longname: builtins.str - isSender: builtins.bool - verification_characters: builtins.str - def __init__( - self, - *, - nonce: builtins.int = ..., - remote_longname: builtins.str = ..., - isSender: builtins.bool = ..., - verification_characters: builtins.str = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["isSender", b"isSender", "nonce", b"nonce", "remote_longname", b"remote_longname", "verification_characters", b"verification_characters"]) -> None: ... - -global___KeyVerificationFinal = KeyVerificationFinal - -@typing.final -class DuplicatedPublicKey(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - def __init__( - self, - ) -> None: ... - -global___DuplicatedPublicKey = DuplicatedPublicKey - -@typing.final -class LowEntropyKey(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - def __init__( - self, - ) -> None: ... - -global___LowEntropyKey = LowEntropyKey - -@typing.final -class FileInfo(google.protobuf.message.Message): - """ - Individual File info for the device - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - FILE_NAME_FIELD_NUMBER: builtins.int - SIZE_BYTES_FIELD_NUMBER: builtins.int - file_name: builtins.str - """ - The fully qualified path of the file - """ - size_bytes: builtins.int - """ - The size of the file in bytes - """ - def __init__( - self, - *, - file_name: builtins.str = ..., - size_bytes: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["file_name", b"file_name", "size_bytes", b"size_bytes"]) -> None: ... - -global___FileInfo = FileInfo - -@typing.final -class ToRadio(google.protobuf.message.Message): - """ - Packets/commands to the radio will be written (reliably) to the toRadio characteristic. - Once the write completes the phone can assume it is handled. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PACKET_FIELD_NUMBER: builtins.int - WANT_CONFIG_ID_FIELD_NUMBER: builtins.int - DISCONNECT_FIELD_NUMBER: builtins.int - XMODEMPACKET_FIELD_NUMBER: builtins.int - MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int - HEARTBEAT_FIELD_NUMBER: builtins.int - want_config_id: builtins.int - """ - Phone wants radio to send full node db to the phone, This is - typically the first packet sent to the radio when the phone gets a - bluetooth connection. The radio will respond by sending back a - MyNodeInfo, a owner, a radio config and a series of - FromRadio.node_infos, and config_complete - the integer you write into this field will be reported back in the - config_complete_id response this allows clients to never be confused by - a stale old partially sent config. - """ - disconnect: builtins.bool - """ - Tell API server we are disconnecting now. - This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link. - (Sending this message is optional for clients) - """ - @property - def packet(self) -> global___MeshPacket: - """ - Send this packet on the mesh - """ - - @property - def xmodemPacket(self) -> meshtastic.protobuf.xmodem_pb2.XModem: - """ - File Transfer Chunk - """ - - @property - def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage: - """ - MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) - """ - - @property - def heartbeat(self) -> global___Heartbeat: - """ - Heartbeat message (used to keep the device connection awake on serial) - """ - - def __init__( - self, - *, - packet: global___MeshPacket | None = ..., - want_config_id: builtins.int = ..., - disconnect: builtins.bool = ..., - xmodemPacket: meshtastic.protobuf.xmodem_pb2.XModem | None = ..., - mqttClientProxyMessage: global___MqttClientProxyMessage | None = ..., - heartbeat: global___Heartbeat | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["packet", "want_config_id", "disconnect", "xmodemPacket", "mqttClientProxyMessage", "heartbeat"] | None: ... - -global___ToRadio = ToRadio - -@typing.final -class Compressed(google.protobuf.message.Message): - """ - Compressed message payload - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PORTNUM_FIELD_NUMBER: builtins.int - DATA_FIELD_NUMBER: builtins.int - portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType - """ - PortNum to determine the how to handle the compressed payload. - """ - data: builtins.bytes - """ - Compressed data. - """ - def __init__( - self, - *, - portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType = ..., - data: builtins.bytes = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["data", b"data", "portnum", b"portnum"]) -> None: ... - -global___Compressed = Compressed - -@typing.final -class NeighborInfo(google.protobuf.message.Message): - """ - Full info on edges for a single node - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NODE_ID_FIELD_NUMBER: builtins.int - LAST_SENT_BY_ID_FIELD_NUMBER: builtins.int - NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: builtins.int - NEIGHBORS_FIELD_NUMBER: builtins.int - node_id: builtins.int - """ - The node ID of the node sending info on its neighbors - """ - last_sent_by_id: builtins.int - """ - Field to pass neighbor info for the next sending cycle - """ - node_broadcast_interval_secs: builtins.int - """ - Broadcast interval of the represented node (in seconds) - """ - @property - def neighbors(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Neighbor]: - """ - The list of out edges from this node - """ - - def __init__( - self, - *, - node_id: builtins.int = ..., - last_sent_by_id: builtins.int = ..., - node_broadcast_interval_secs: builtins.int = ..., - neighbors: collections.abc.Iterable[global___Neighbor] | None = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["last_sent_by_id", b"last_sent_by_id", "neighbors", b"neighbors", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"]) -> None: ... - -global___NeighborInfo = NeighborInfo - -@typing.final -class Neighbor(google.protobuf.message.Message): - """ - A single edge in the mesh - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NODE_ID_FIELD_NUMBER: builtins.int - SNR_FIELD_NUMBER: builtins.int - LAST_RX_TIME_FIELD_NUMBER: builtins.int - NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: builtins.int - node_id: builtins.int - """ - Node ID of neighbor - """ - snr: builtins.float - """ - SNR of last heard message - """ - last_rx_time: builtins.int - """ - Reception time (in secs since 1970) of last message that was last sent by this ID. - Note: this is for local storage only and will not be sent out over the mesh. - """ - node_broadcast_interval_secs: builtins.int - """ - Broadcast interval of this neighbor (in seconds). - Note: this is for local storage only and will not be sent out over the mesh. - """ - def __init__( - self, - *, - node_id: builtins.int = ..., - snr: builtins.float = ..., - last_rx_time: builtins.int = ..., - node_broadcast_interval_secs: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["last_rx_time", b"last_rx_time", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id", "snr", b"snr"]) -> None: ... - -global___Neighbor = Neighbor - -@typing.final -class DeviceMetadata(google.protobuf.message.Message): - """ - Device metadata response - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - FIRMWARE_VERSION_FIELD_NUMBER: builtins.int - DEVICE_STATE_VERSION_FIELD_NUMBER: builtins.int - CANSHUTDOWN_FIELD_NUMBER: builtins.int - HASWIFI_FIELD_NUMBER: builtins.int - HASBLUETOOTH_FIELD_NUMBER: builtins.int - HASETHERNET_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - POSITION_FLAGS_FIELD_NUMBER: builtins.int - HW_MODEL_FIELD_NUMBER: builtins.int - HASREMOTEHARDWARE_FIELD_NUMBER: builtins.int - 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 - """ - device_state_version: builtins.int - """ - Device state version - """ - canShutdown: builtins.bool - """ - Indicates whether the device can shutdown CPU natively or via power management chip - """ - hasWifi: builtins.bool - """ - Indicates that the device has native wifi capability - """ - hasBluetooth: builtins.bool - """ - Indicates that the device has native bluetooth capability - """ - hasEthernet: builtins.bool - """ - Indicates that the device has an ethernet peripheral - """ - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType - """ - Indicates that the device's role in the mesh - """ - position_flags: builtins.int - """ - Indicates the device's current enabled position flags - """ - hw_model: global___HardwareModel.ValueType - """ - Device hardware model - """ - hasRemoteHardware: builtins.bool - """ - Has Remote Hardware enabled - """ - hasPKC: builtins.bool - """ - Has PKC capabilities - """ - excluded_modules: builtins.int - """ - 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, - *, - firmware_version: builtins.str = ..., - device_state_version: builtins.int = ..., - canShutdown: builtins.bool = ..., - hasWifi: builtins.bool = ..., - hasBluetooth: builtins.bool = ..., - hasEthernet: builtins.bool = ..., - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., - position_flags: builtins.int = ..., - hw_model: global___HardwareModel.ValueType = ..., - 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", "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): - """ - A heartbeat message is sent to the node from the client to keep the connection alive. - This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NONCE_FIELD_NUMBER: builtins.int - nonce: builtins.int - """ - The nonce of the heartbeat message - """ - def __init__( - self, - *, - nonce: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["nonce", b"nonce"]) -> None: ... - -global___Heartbeat = Heartbeat - -@typing.final -class NodeRemoteHardwarePin(google.protobuf.message.Message): - """ - RemoteHardwarePins associated with a node - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NODE_NUM_FIELD_NUMBER: builtins.int - PIN_FIELD_NUMBER: builtins.int - node_num: builtins.int - """ - The node_num exposing the available gpio pin - """ - @property - def pin(self) -> meshtastic.protobuf.module_config_pb2.RemoteHardwarePin: - """ - The the available gpio pin for usage with RemoteHardware module - """ - - def __init__( - self, - *, - node_num: builtins.int = ..., - pin: meshtastic.protobuf.module_config_pb2.RemoteHardwarePin | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["pin", b"pin"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["node_num", b"node_num", "pin", b"pin"]) -> None: ... - -global___NodeRemoteHardwarePin = NodeRemoteHardwarePin - -@typing.final -class ChunkedPayload(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PAYLOAD_ID_FIELD_NUMBER: builtins.int - CHUNK_COUNT_FIELD_NUMBER: builtins.int - CHUNK_INDEX_FIELD_NUMBER: builtins.int - PAYLOAD_CHUNK_FIELD_NUMBER: builtins.int - payload_id: builtins.int - """ - The ID of the entire payload - """ - chunk_count: builtins.int - """ - The total number of chunks in the payload - """ - chunk_index: builtins.int - """ - The current chunk index in the total - """ - payload_chunk: builtins.bytes - """ - The binary data of the current chunk - """ - def __init__( - self, - *, - payload_id: builtins.int = ..., - chunk_count: builtins.int = ..., - chunk_index: builtins.int = ..., - payload_chunk: builtins.bytes = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["chunk_count", b"chunk_count", "chunk_index", b"chunk_index", "payload_chunk", b"payload_chunk", "payload_id", b"payload_id"]) -> None: ... - -global___ChunkedPayload = ChunkedPayload - -@typing.final -class resend_chunks(google.protobuf.message.Message): - """ - Wrapper message for broken repeated oneof support - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - CHUNKS_FIELD_NUMBER: builtins.int - @property - def chunks(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ... - def __init__( - self, - *, - chunks: collections.abc.Iterable[builtins.int] | None = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["chunks", b"chunks"]) -> None: ... - -global___resend_chunks = resend_chunks - -@typing.final -class ChunkedPayloadResponse(google.protobuf.message.Message): - """ - Responses to a ChunkedPayload request - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PAYLOAD_ID_FIELD_NUMBER: builtins.int - REQUEST_TRANSFER_FIELD_NUMBER: builtins.int - ACCEPT_TRANSFER_FIELD_NUMBER: builtins.int - RESEND_CHUNKS_FIELD_NUMBER: builtins.int - payload_id: builtins.int - """ - The ID of the entire payload - """ - request_transfer: builtins.bool - """ - Request to transfer chunked payload - """ - accept_transfer: builtins.bool - """ - Accept the transfer chunked payload - """ - @property - def resend_chunks(self) -> global___resend_chunks: - """ - Request missing indexes in the chunked payload - """ - - def __init__( - self, - *, - payload_id: builtins.int = ..., - request_transfer: builtins.bool = ..., - accept_transfer: builtins.bool = ..., - resend_chunks: global___resend_chunks | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["accept_transfer", b"accept_transfer", "payload_variant", b"payload_variant", "request_transfer", b"request_transfer", "resend_chunks", b"resend_chunks"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["accept_transfer", b"accept_transfer", "payload_id", b"payload_id", "payload_variant", b"payload_variant", "request_transfer", b"request_transfer", "resend_chunks", b"resend_chunks"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["request_transfer", "accept_transfer", "resend_chunks"] | None: ... - -global___ChunkedPayloadResponse = ChunkedPayloadResponse diff --git a/meshtastic/protobuf/modem_preset_registry_pb2.py b/meshtastic/protobuf/modem_preset_registry_pb2.py new file mode 100644 index 000000000..178b035ae --- /dev/null +++ b/meshtastic/protobuf/modem_preset_registry_pb2.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/modem_preset_registry.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/meshtastic/protobuf/modem_preset_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\xb0\x01\n\x0fModemPresetInfo\x12\x30\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rbandwidth_khz\x18\x03 \x01(\r\x12\x1a\n\x12wide_bandwidth_khz\x18\x04 \x01(\r\x12\x15\n\rspread_factor\x18\x05 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x06 \x01(\r\"^\n\x13ModemPresetRegistry\x12\x35\n\x07presets\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetInfo\x12\x10\n\x08revision\x18\x02 \x01(\rBo\n\x14org.meshtastic.protoB\x19ModemPresetRegistryProtosZ\"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.modem_preset_registry_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\031ModemPresetRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_MODEMPRESETINFO']._serialized_start=107 + _globals['_MODEMPRESETINFO']._serialized_end=283 + _globals['_MODEMPRESETREGISTRY']._serialized_start=285 + _globals['_MODEMPRESETREGISTRY']._serialized_end=379 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/modem_preset_registry_pb2.pyi b/meshtastic/protobuf/modem_preset_registry_pb2.pyi new file mode 100644 index 000000000..578e8b9a3 --- /dev/null +++ b/meshtastic/protobuf/modem_preset_registry_pb2.pyi @@ -0,0 +1,119 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from . import common_pb2 as _common_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class ModemPresetInfo(_message.Message): + """ + Modem Preset Registry + + NOT used on-wire; consumed by clients/apps and optionally embedded in firmware. + Centralizes the radio parameters of each ModemPreset. Which presets a region + permits, and whether that needs a licensed operator, is region data in + region_registry.proto. + + Data lives in registry/modem_presets.yaml. tools/gen_registry.py validates it + and generates registry/generated/modem_presets.json, which `buf convert` + serializes. + Firmware can generate its modem config table from this data or embed it directly. + + + Complete definition of a single modem preset + """ + + DESCRIPTOR: _descriptor.Descriptor + + PRESET_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + BANDWIDTH_KHZ_FIELD_NUMBER: _builtins.int + WIDE_BANDWIDTH_KHZ_FIELD_NUMBER: _builtins.int + SPREAD_FACTOR_FIELD_NUMBER: _builtins.int + CODING_RATE_FIELD_NUMBER: _builtins.int + preset: _common_pb2.ModemPreset.ValueType + """Which preset this defines""" + name: _builtins.str + """ + The preset's name, and the only place it is written: firmware displays this string, + e.g. "LongFast", "ShortTurbo", and a primary channel with an empty name is named by + it. Because LoRaConfig.channel_num can hash it, changing one of these names moves + every node whose channel took its default from that preset. + """ + bandwidth_khz: _builtins.int + """Bandwidth in kHz in a sub-GHz region (e.g. 125, 250, 500), rounded down""" + wide_bandwidth_khz: _builtins.int + """ + Bandwidth in kHz in a wide LoRa region (RegionInfo.wide_lora, above 1 GHz), + rounded down: 812.5 kHz is 812. 0 = the preset has no wide form, and no wide + region permits it. + """ + spread_factor: _builtins.int + """Spreading factor (5-12)""" + coding_rate: _builtins.int + """Coding rate denominator (5-8, i.e. 4/5 through 4/8)""" + def __init__( + self, + *, + preset: _common_pb2.ModemPreset.ValueType = ..., + name: _builtins.str = ..., + bandwidth_khz: _builtins.int = ..., + wide_bandwidth_khz: _builtins.int = ..., + spread_factor: _builtins.int = ..., + coding_rate: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth_khz", b"bandwidth_khz", "coding_rate", b"coding_rate", "name", b"name", "preset", b"preset", "spread_factor", b"spread_factor", "wide_bandwidth_khz", b"wide_bandwidth_khz"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___ModemPresetInfo: _TypeAlias = ModemPresetInfo # noqa: Y015 + +@_typing.final +class ModemPresetRegistry(_message.Message): + """ + The complete modem preset registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + PRESETS_FIELD_NUMBER: _builtins.int + REVISION_FIELD_NUMBER: _builtins.int + revision: _builtins.int + """ + Raised by every change to the data. CI rejects a change that leaves it where it + was, so a client can tell whether its bundled copy is current. + """ + @_builtins.property + def presets(self) -> _containers.RepeatedCompositeFieldContainer[Global___ModemPresetInfo]: + """Every preset with a definition""" + + def __init__( + self, + *, + presets: _abc.Iterable[Global___ModemPresetInfo] | None = ..., + revision: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["presets", b"presets", "revision", b"revision"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___ModemPresetRegistry: _TypeAlias = ModemPresetRegistry # noqa: Y015 diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index 69996a49b..fa2f1a2b6 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/module_config.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -13,391 +14,387 @@ 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 common_pb2 as meshtastic_dot_protobuf_dot_common__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/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') +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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xeb\x04\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \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\x02 \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\x03 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x04 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xc7\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12\x62\n\x07timeout\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd2\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12P\n\x0bnag_timeout\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\xdc\x07\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12r\n\x16\x64\x65vice_update_interval\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x1e\n\x16sensor_update_interval\x18\x03 \x01(\r\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.module_config_pb2', _globals) 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@\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@\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 \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\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 \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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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=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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_ENABLED"]._options = None + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_ENABLED"]._serialized_options = b'\312\363\030#:\014MQTT EnabledB\023Enable MQTT gateway' + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_ENCRYPTION"]._options = None + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_ENCRYPTION"]._serialized_options = b'\312\363\0304:\022Encryption EnabledB\036Send encrypted packets to MQTT' + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_TLS"]._options = None + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_TLS"]._serialized_options = b'\312\363\030E:\013TLS EnabledB6TLS is required for the public Meshtastic MQTT server.' + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_PROXY_TO_CLIENT"]._options = None + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_PROXY_TO_CLIENT"]._serialized_options = b'\312\363\030V:\021MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.' + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_MAP_REPORTING"]._options = None + _globals['_MQTTCONFIG_FLAGS'].values_by_name["MQTT_MAP_REPORTING"]._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.' + _globals['_MQTTCONFIG'].fields_by_name['flags']._options = None + _globals['_MQTTCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_MQTTCONFIG'].fields_by_name['address']._options = None + _globals['_MQTTCONFIG'].fields_by_name['address']._serialized_options = b'\222?\002\010@\312\363\030\036:\007AddressB\023MQTT server address' + _globals['_MQTTCONFIG'].fields_by_name['username']._options = None + _globals['_MQTTCONFIG'].fields_by_name['username']._serialized_options = b'\222?\002\010@\312\363\030\031:\010UsernameB\rMQTT username' + _globals['_MQTTCONFIG'].fields_by_name['password']._options = None + _globals['_MQTTCONFIG'].fields_by_name['password']._serialized_options = b'\222?\002\010 \312\363\030\031:\010PasswordB\rMQTT password' + _globals['_MQTTCONFIG'].fields_by_name['root']._options = None + _globals['_MQTTCONFIG'].fields_by_name['root']._serialized_options = b'\222?\002\010 \312\363\030\035:\nRoot TopicB\017MQTT root topic' + _globals['_MAPREPORTSETTINGS'].fields_by_name['publish_interval_secs']._options = None + _globals['_MAPREPORTSETTINGS'].fields_by_name['publish_interval_secs']._serialized_options = b'\312\363\030?*\001s:\024Map Publish IntervalB$How often a map report is published.' + _globals['_MAPREPORTSETTINGS'].fields_by_name['should_report_location']._options = None + _globals['_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' + _globals['_REMOTEHARDWARECONFIG'].fields_by_name['available_pins']._options = None + _globals['_REMOTEHARDWARECONFIG'].fields_by_name['available_pins']._serialized_options = b'\222?\002\020\004' + _globals['_REMOTEHARDWARECONFIG'].fields_by_name['authorized_key']._options = None + _globals['_REMOTEHARDWARECONFIG'].fields_by_name['authorized_key']._serialized_options = b'\222?\004\010 \020\003' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['enabled']._options = None + _globals['_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.' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval']._options = None + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval']._serialized_options = b'\312\363\030;*\001s:\017Update IntervalB%How often to broadcast neighbor info.' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['transmit_over_lora']._options = None + _globals['_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.' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_LOW"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_LOW"]._serialized_options = b'\312\363\030\005:\003Low' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_HIGH"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_HIGH"]._serialized_options = b'\312\363\030\006:\004High' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["FALLING_EDGE"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["FALLING_EDGE"]._serialized_options = b'\312\363\030\016:\014Falling Edge' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["RISING_EDGE"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["RISING_EDGE"]._serialized_options = b'\312\363\030\r:\013Rising Edge' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["EITHER_EDGE_ACTIVE_LOW"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["EITHER_EDGE_ACTIVE_LOW"]._serialized_options = b'\312\363\030\021:\017Either Edge Low' + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._options = None + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._serialized_options = b'\312\363\030\022:\020Either Edge High' + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_ENABLED"]._options = None + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_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.' + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_SEND_BELL"]._options = None + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_SEND_BELL"]._serialized_options = b'\312\363\030e:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.' + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_USE_PULLUP"]._options = None + _globals['_DETECTIONSENSORCONFIG_FLAGS'].values_by_name["DETECTION_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' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['flags']._options = None + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['minimum_broadcast_secs']._options = None + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['minimum_broadcast_secs']._serialized_options = b'\312\363\030Z*\001s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['state_broadcast_secs']._options = None + _globals['_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.' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['name']._options = None + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['name']._serialized_options = b'\222?\002\010\024\312\363\030%:\004NameB\035Sensor name for mesh messages' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['monitor_pin']._options = None + _globals['_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.' + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['detection_trigger_type']._options = None + _globals['_DETECTIONSENSORCONFIG'].fields_by_name['detection_trigger_type']._serialized_options = b'\222?\002\010\010\312\363\030$:\013TriggerTypeB\025Type of trigger event' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_DEFAULT"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_3200"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_3200"]._serialized_options = b'\312\363\030\n:\0103200 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_2400"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_2400"]._serialized_options = b'\312\363\030\n:\0102400 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1600"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1600"]._serialized_options = b'\312\363\030\n:\0101600 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1400"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1400"]._serialized_options = b'\312\363\030\n:\0101400 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1300"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1300"]._serialized_options = b'\312\363\030\n:\0101300 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1200"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_1200"]._serialized_options = b'\312\363\030\n:\0101200 bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_700C"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_700C"]._serialized_options = b'\312\363\030\n:\010700C bps' + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_450"]._options = None + _globals['_AUDIOCONFIG_AUDIO_BAUD'].values_by_name["CODEC2_450"]._serialized_options = b'\312\363\030\t:\007450 bps' + _globals['_AUDIOCONFIG'].fields_by_name['codec2_enabled']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['codec2_enabled']._serialized_options = b'\312\363\030^:\016Codec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.' + _globals['_AUDIOCONFIG'].fields_by_name['ptt_pin']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['ptt_pin']._serialized_options = b'\222?\0028\010\312\363\030(:\007PTT PinB\035Push-to-talk GPIO pin number.' + _globals['_AUDIOCONFIG'].fields_by_name['bitrate']._options = None + _globals['_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.' + _globals['_AUDIOCONFIG'].fields_by_name['i2s_ws']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['i2s_ws']._serialized_options = b'\222?\0028\010\312\363\030\010:\006I2S WS' + _globals['_AUDIOCONFIG'].fields_by_name['i2s_sd']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['i2s_sd']._serialized_options = b'\222?\0028\010\312\363\030\010:\006I2S SD' + _globals['_AUDIOCONFIG'].fields_by_name['i2s_din']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['i2s_din']._serialized_options = b'\222?\0028\010\312\363\030\t:\007I2S DIN' + _globals['_AUDIOCONFIG'].fields_by_name['i2s_sck']._options = None + _globals['_AUDIOCONFIG'].fields_by_name['i2s_sck']._serialized_options = b'\222?\0028\010\312\363\030\t:\007I2S SCK' + _globals['_PAXCOUNTERCONFIG'].fields_by_name['enabled']._options = None + _globals['_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.' + _globals['_PAXCOUNTERCONFIG'].fields_by_name['paxcounter_update_interval']._options = None + _globals['_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.' + _globals['_PAXCOUNTERCONFIG'].fields_by_name['wifi_threshold']._options = None + _globals['_PAXCOUNTERCONFIG'].fields_by_name['wifi_threshold']._serialized_options = b'\312\363\030@*\003dBm:\016WiFi ThresholdB)RSSI threshold for counting WiFi devices.' + _globals['_PAXCOUNTERCONFIG'].fields_by_name['ble_threshold']._options = None + _globals['_PAXCOUNTERCONFIG'].fields_by_name['ble_threshold']._serialized_options = b'\312\363\030>*\003dBm:\rBLE ThresholdB(RSSI threshold for counting BLE devices.' + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['position_min_interval_secs']._options = None + _globals['_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.' + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['nodeinfo_direct_response_max_hops']._options = None + _globals['_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.' + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['rate_limit_window_secs']._options = None + _globals['_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.' + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['rate_limit_max_packets']._options = None + _globals['_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.' + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['unknown_packet_threshold']._options = None + _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['unknown_packet_threshold']._serialized_options = b'\312\363\030M:\030Unknown Packet ThresholdB1How many per window before the sender is dropped.' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_DEFAULT"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_110"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_110"]._serialized_options = b'\312\363\030\n:\010110 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_300"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_300"]._serialized_options = b'\312\363\030\n:\010300 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_600"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_600"]._serialized_options = b'\312\363\030\n:\010600 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_1200"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_1200"]._serialized_options = b'\312\363\030\013:\t1200 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_2400"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_2400"]._serialized_options = b'\312\363\030\013:\t2400 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_4800"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_4800"]._serialized_options = b'\312\363\030\013:\t4800 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_9600"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_9600"]._serialized_options = b'\312\363\030\013:\t9600 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_19200"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_19200"]._serialized_options = b'\312\363\030\014:\n19200 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_38400"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_38400"]._serialized_options = b'\312\363\030\014:\n38400 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_57600"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_57600"]._serialized_options = b'\312\363\030\014:\n57600 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_115200"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_115200"]._serialized_options = b'\312\363\030\r:\013115200 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_230400"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_230400"]._serialized_options = b'\312\363\030\r:\013230400 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_460800"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_460800"]._serialized_options = b'\312\363\030\r:\013460800 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_576000"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_576000"]._serialized_options = b'\312\363\030\r:\013576000 Baud' + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_921600"]._options = None + _globals['_SERIALCONFIG_SERIAL_BAUD'].values_by_name["BAUD_921600"]._serialized_options = b'\312\363\030\r:\013921600 Baud' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["DEFAULT"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["SIMPLE"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["SIMPLE"]._serialized_options = b'\312\363\030\010:\006Simple' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["PROTO"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["PROTO"]._serialized_options = b'\312\363\030\013:\tProtobufs' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["TEXTMSG"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["TEXTMSG"]._serialized_options = b'\312\363\030\016:\014Text Message' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["NMEA"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["NMEA"]._serialized_options = b'\312\363\030\020:\016NMEA Positions' + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["CALTOPO"]._options = None + _globals['_SERIALCONFIG_SERIAL_MODE'].values_by_name["CALTOPO"]._serialized_options = b'\312\363\030\t:\007CALTOPO' + _globals['_SERIALCONFIG_FLAGS'].values_by_name["SERIAL_ENABLED"]._options = None + _globals['_SERIALCONFIG_FLAGS'].values_by_name["SERIAL_ENABLED"]._serialized_options = b'\312\363\030&:\016Serial EnabledB\024Enable serial module' + _globals['_SERIALCONFIG_FLAGS'].values_by_name["SERIAL_ECHO"]._options = None + _globals['_SERIALCONFIG_FLAGS'].values_by_name["SERIAL_ECHO"]._serialized_options = b'\312\363\030H:\004EchoB@If set, any packets you send will be echoed back to your device.' + _globals['_SERIALCONFIG'].fields_by_name['flags']._options = None + _globals['_SERIALCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_SERIALCONFIG'].fields_by_name['rxd']._options = None + _globals['_SERIALCONFIG'].fields_by_name['rxd']._serialized_options = b'\312\363\030,:\033Receive data (rxd) GPIO pinB\rRX pin number' + _globals['_SERIALCONFIG'].fields_by_name['txd']._options = None + _globals['_SERIALCONFIG'].fields_by_name['txd']._serialized_options = b'\312\363\030-:\034Transmit data (txd) GPIO pinB\rTX pin number' + _globals['_SERIALCONFIG'].fields_by_name['baud']._options = None + _globals['_SERIALCONFIG'].fields_by_name['baud']._serialized_options = b'\312\363\030\030:\004BaudB\020Serial baud rate' + _globals['_SERIALCONFIG'].fields_by_name['timeout']._options = None + _globals['_SERIALCONFIG'].fields_by_name['timeout']._serialized_options = b'\312\363\030M:\007TimeoutBBThe amount of time to wait before we consider your packet as done.' + _globals['_SERIALCONFIG'].fields_by_name['mode']._options = None + _globals['_SERIALCONFIG'].fields_by_name['mode']._serialized_options = b'\312\363\030$:\004ModeB\034Serial module operation mode' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_ACTIVE"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_ACTIVE"]._serialized_options = b'\312\363\030]:\006ActiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE"]._serialized_options = b'\312\363\030;:\036Alert when receiving a messageB\031Alert on incoming message' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE_VIBRA"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE_VIBRA"]._serialized_options = b'\312\363\030D:\021Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE_BUZZER"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_MESSAGE_BUZZER"]._serialized_options = b'\312\363\030F:*Alert GPIO buzzer when receiving a messageB\030Buzz on incoming message' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL"]._serialized_options = b'\312\363\0306:\033Alert when receiving a bellB\027Alert on bell character' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL_VIBRA"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL_VIBRA"]._serialized_options = b'\312\363\030I:,Alert GPIO vibra motor when receiving a bellB\031Vibrate on bell character' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL_BUZZER"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_BELL_BUZZER"]._serialized_options = b'\312\363\030A:\'Alert GPIO buzzer when receiving a bellB\026Buzz on bell character' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_USE_PWM"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_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.' + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_USE_I2S_AS_BUZZER"]._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_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.' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['enabled']._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['enabled']._serialized_options = b'\312\363\030>:\035External Notification EnabledB\035Enable external notifications' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_ms']._options = None + _globals['_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.' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output']._options = None + _globals['_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.' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_vibra']._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_vibra']._serialized_options = b'\222?\0028\010\312\363\0303:\025Output pin vibra GPIOB\032Vibration motor output pin' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_buzzer']._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_buzzer']._serialized_options = b'\222?\0028\010\312\363\030+:\026Output pin buzzer GPIOB\021Buzzer output pin' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout']._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout']._serialized_options = b'\222?\0028\020\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.' + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_ENABLED"]._options = None + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_ENABLED"]._serialized_options = b'\312\363\030B:\031Store and Forward EnabledB%Enables the store and forward module.' + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_HEARTBEAT"]._options = None + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_HEARTBEAT"]._serialized_options = b'\312\363\030F:\016Send HeartbeatB4Send a heartbeat to advertise the server\'s presence.' + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_IS_SERVER"]._options = None + _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_IS_SERVER"]._serialized_options = b'\312\363\030`:\006ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.' + _globals['_STOREFORWARDCONFIG'].fields_by_name['flags']._options = None + _globals['_STOREFORWARDCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_STOREFORWARDCONFIG'].fields_by_name['max_per_sync']._options = None + _globals['_STOREFORWARDCONFIG'].fields_by_name['max_per_sync']._serialized_options = b'\222?\0028\010' + _globals['_STOREFORWARDCONFIG'].fields_by_name['served_hashes']._options = None + _globals['_STOREFORWARDCONFIG'].fields_by_name['served_hashes']._serialized_options = b'\222?\004\020\0208\010' + _globals['_STOREFORWARDCONFIG'].fields_by_name['discovery_admit_per_hour']._options = None + _globals['_STOREFORWARDCONFIG'].fields_by_name['discovery_admit_per_hour']._serialized_options = b'\222?\0028\020' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_MEASUREMENT"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_MEASUREMENT"]._serialized_options = b'\312\363\030?:\033Environment Metrics EnabledB Collect environment measurements' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_SCREEN"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_SCREEN"]._serialized_options = b'\312\363\030C:\025Show on device screenB*Display environment measurements on device' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY"]._serialized_options = b'\312\363\030::\033Air Quality Metrics EnabledB\033Collect air quality metrics' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY_SCREEN"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY_SCREEN"]._serialized_options = b'\312\363\030\010R\0062.7.18' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_MEASUREMENT"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_MEASUREMENT"]._serialized_options = b'\312\363\0302:\031Power Measurement EnabledB\025Collect power metrics' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_SCREEN"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_SCREEN"]._serialized_options = b'\312\363\030/:\014Power ScreenB\037Display power metrics on device' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._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' + _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._options = None + _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\020' + _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval']._options = None + _globals['_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.' + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._options = None + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._serialized_options = b'\312\363\030!:\010Rotary 1B\025Enable rotary encoder' + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_UPDOWN1"]._options = None + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_UPDOWN1"]._serialized_options = b'\312\363\030(:\tUp Down 1B\033Enable up/down/select input' + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_SEND_BELL"]._options = None + _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_SEND_BELL"]._serialized_options = b'\312\363\030.:\tSend BellB!Send bell character with messages' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['flags']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_a']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_a']._serialized_options = b'\312\363\030,:\005Pin AB#GPIO pin for rotary encoder A port.' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_b']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_b']._serialized_options = b'\312\363\030,:\005Pin BB#GPIO pin for rotary encoder B port.' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_press']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_pin_press']._serialized_options = b'\312\363\0304:\tPress PinB\'GPIO pin for rotary encoder Press port.' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_cw']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_cw']._serialized_options = b'\312\363\030<:\026Clockwise Rotary EventB\"Input event for clockwise rotation' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_ccw']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_ccw']._serialized_options = b'\312\363\030L:\036Counter Clockwise Rotary EventB*Input event for counter-clockwise rotation' + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_press']._options = None + _globals['_CANNEDMESSAGECONFIG'].fields_by_name['inputbroker_event_press']._serialized_options = b'\312\363\0304:\023Encoder Press EventB\035Input event for encoder press' + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['led_state']._options = None + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['led_state']._serialized_options = b'\312\363\030*:\tLED StateB\035The state of the LED (on/off)' + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['current']._options = None + _globals['_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' + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['red']._options = None + _globals['_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' + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['green']._options = None + _globals['_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' + _globals['_AMBIENTLIGHTINGCONFIG'].fields_by_name['blue']._options = None + _globals['_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' + _globals['_STATUSMESSAGECONFIG'].fields_by_name['node_status']._options = None + _globals['_STATUSMESSAGECONFIG'].fields_by_name['node_status']._serialized_options = b'\222?\002\010P' + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['preset']._options = None + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['preset']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['region']._options = None + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['region']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['channel_index']._options = None + _globals['_MESHBEACONCONFIG_BROADCASTTARGET'].fields_by_name['channel_index']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG'].fields_by_name['flags']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_message']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_message']._serialized_options = b'\222?\002\010e\312\363\030(:\007MessageB\035Message for beacon broadcasts' + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_offer_region']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_offer_region']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_offer_preset']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_offer_preset']._serialized_options = b'\222?\0028\010' + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_interval_secs']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_interval_secs']._serialized_options = b'\312\363\030/*\001s:\010IntervalB How often a beacon is broadcast.' + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_targets']._options = None + _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_targets']._serialized_options = b'\222?\002\020\004' + _globals['_TAKCONFIG'].fields_by_name['team']._options = None + _globals['_TAKCONFIG'].fields_by_name['team']._serialized_options = b'\312\363\030\026:\004TeamB\016TAK team color' + _globals['_TAKCONFIG'].fields_by_name['role']._options = None + _globals['_TAKCONFIG'].fields_by_name['role']._serialized_options = b'\312\363\030\027:\004RoleB\017TAK member role' + _globals['_REMOTEHARDWAREPIN'].fields_by_name['gpio_pin']._options = None + _globals['_REMOTEHARDWAREPIN'].fields_by_name['gpio_pin']._serialized_options = b'\222?\0028\010' + _globals['_REMOTEHARDWAREPIN'].fields_by_name['name']._options = None + _globals['_REMOTEHARDWAREPIN'].fields_by_name['name']._serialized_options = b'\222?\002\010\017' + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['statusmessage']._options = None + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['statusmessage']._serialized_options = b'\312\363\030\010R\0062.7.20' + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['traffic_management']._options = None + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['traffic_management']._serialized_options = b'\312\363\030\007R\0052.8.0' + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._options = None + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None + _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14611 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14684 + _globals['_MQTTCONFIG']._serialized_start=242 + _globals['_MQTTCONFIG']._serialized_end=1235 + _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 + _globals['_MQTTCONFIG_FLAGS']._serialized_end=1235 + _globals['_MAPREPORTSETTINGS']._serialized_start=1238 + _globals['_MAPREPORTSETTINGS']._serialized_end=1569 + _globals['_REMOTEHARDWARECONFIG']._serialized_start=1572 + _globals['_REMOTEHARDWARECONFIG']._serialized_end=1751 + _globals['_NEIGHBORINFOCONFIG']._serialized_start=1754 + _globals['_NEIGHBORINFOCONFIG']._serialized_end=2235 + _globals['_DETECTIONSENSORCONFIG']._serialized_start=2238 + _globals['_DETECTIONSENSORCONFIG']._serialized_end=3714 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2866 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=3111 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_start=3114 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_end=3714 + _globals['_AUDIOCONFIG']._serialized_start=3717 + _globals['_AUDIOCONFIG']._serialized_end=4579 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=4270 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=4579 + _globals['_PAXCOUNTERCONFIG']._serialized_start=4582 + _globals['_PAXCOUNTERCONFIG']._serialized_end=5135 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=5138 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5757 + _globals['_SERIALCONFIG']._serialized_start=5760 + _globals['_SERIALCONFIG']._serialized_end=7239 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6220 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6766 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6769 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=7019 + _globals['_SERIALCONFIG_FLAGS']._serialized_start=7022 + _globals['_SERIALCONFIG_FLAGS']._serialized_end=7239 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7242 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=8988 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7837 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=8988 + _globals['_STOREFORWARDCONFIG']._serialized_start=8991 + _globals['_STOREFORWARDCONFIG']._serialized_end=9661 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9240 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9661 + _globals['_TELEMETRYCONFIG']._serialized_start=9664 + _globals['_TELEMETRYCONFIG']._serialized_end=10652 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9854 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10652 + _globals['_CANNEDMESSAGECONFIG']._serialized_start=10655 + _globals['_CANNEDMESSAGECONFIG']._serialized_end=11599 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11364 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11599 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11602 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12217 + _globals['_STATUSMESSAGECONFIG']._serialized_start=12219 + _globals['_STATUSMESSAGECONFIG']._serialized_end=12268 + _globals['_MESHBEACONCONFIG']._serialized_start=12271 + _globals['_MESHBEACONCONFIG']._serialized_end=13112 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12788 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12987 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12989 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13085 + _globals['_TAKCONFIG']._serialized_start=13115 + _globals['_TAKCONFIG']._serialized_end=13271 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13273 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13396 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13398 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13492 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13495 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14609 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 0ea8e0cb4..85fff4fae 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -3,31 +3,31 @@ isort:skip_file """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import meshtastic.protobuf.atak_pb2 -import meshtastic.protobuf.channel_pb2 -import meshtastic.protobuf.config_pb2 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import atak_pb2 as _atak_pb2 +from . import channel_pb2 as _channel_pb2 +from . import common_pb2 as _common_pb2 +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _RemoteHardwarePinType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _RemoteHardwarePinTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_RemoteHardwarePinType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _RemoteHardwarePinTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_RemoteHardwarePinType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNKNOWN: _RemoteHardwarePinType.ValueType # 0 """ Unset/unused @@ -55,1634 +55,1726 @@ DIGITAL_WRITE: RemoteHardwarePinType.ValueType # 2 """ GPIO pin can be written to (high / low) """ -global___RemoteHardwarePinType = RemoteHardwarePinType +Global___RemoteHardwarePinType: _TypeAlias = RemoteHardwarePinType # noqa: Y015 -@typing.final -class ModuleConfig(google.protobuf.message.Message): +@_typing.final +class MQTTConfig(_message.Message): """ - Module Config + MQTT Client Config """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - @typing.final - class MQTTConfig(google.protobuf.message.Message): - """ - MQTT Client Config - """ + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ENABLED_FIELD_NUMBER: builtins.int - ADDRESS_FIELD_NUMBER: builtins.int - USERNAME_FIELD_NUMBER: builtins.int - PASSWORD_FIELD_NUMBER: builtins.int - ENCRYPTION_ENABLED_FIELD_NUMBER: builtins.int - JSON_ENABLED_FIELD_NUMBER: builtins.int - TLS_ENABLED_FIELD_NUMBER: builtins.int - ROOT_FIELD_NUMBER: builtins.int - PROXY_TO_CLIENT_ENABLED_FIELD_NUMBER: builtins.int - MAP_REPORTING_ENABLED_FIELD_NUMBER: builtins.int - MAP_REPORT_SETTINGS_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as - is_uplink_enabled or is_downlink_enabled. - """ - address: builtins.str - """ - The server to use for our MQTT global message gateway feature. - If not set, the default server will be used - """ - username: builtins.str - """ - MQTT username to use (most useful for a custom MQTT server). - If using a custom server, this will be honoured even if empty. - If using the default server, this will only be honoured if set, otherwise the device will use the default username - """ - password: builtins.str - """ - MQTT password to use (most useful for a custom MQTT server). - If using a custom server, this will be honoured even if empty. - If using the default server, this will only be honoured if set, otherwise the device will use the default password - """ - encryption_enabled: builtins.bool - """ - Whether to send encrypted or decrypted packets to MQTT. - This parameter is only honoured if you also set server - (the default official mqtt.meshtastic.org server can handle encrypted packets) - Decrypted packets may be useful for external systems that want to consume meshtastic packets - """ - json_enabled: builtins.bool - """ - Deprecated: JSON packet support on MQTT was removed, and this field is ignored. + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MQTTConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + MQTT_NONE: MQTTConfig._Flags.ValueType # 0 + """Nothing enabled""" + MQTT_ENABLED: MQTTConfig._Flags.ValueType # 1 """ - tls_enabled: builtins.bool + Gateway any channels marked is_uplink_enabled or is_downlink_enabled, when + this node can reach the internet. """ - If true, we attempt to establish a secure connection using TLS + MQTT_ENCRYPTION: MQTTConfig._Flags.ValueType # 2 """ - root: builtins.str + Send encrypted rather than decrypted packets. Only honoured when a custom + server is set; the default mqtt.meshtastic.org server handles encrypted + packets. Decrypted packets suit external systems consuming meshtastic traffic. """ - The root topic to use for MQTT messages. Default is "msh". - This is useful if you want to use a single MQTT server for multiple meshtastic networks and separate them via ACLs - """ - proxy_to_client_enabled: builtins.bool + MQTT_TLS: MQTTConfig._Flags.ValueType # 4 + """Establish the connection using TLS""" + MQTT_PROXY_TO_CLIENT: MQTTConfig._Flags.ValueType # 8 + """Proxy messages via the connected phone or client instead of connecting directly""" + MQTT_MAP_REPORTING: MQTTConfig._Flags.ValueType # 16 + """Periodically report unencrypted information about this node to a map""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - If true, we can use the connected phone / client to proxy messages to MQTT instead of a direct connection + MQTT behaviour toggles: a bitwise OR of Flags values. """ - map_reporting_enabled: builtins.bool + + MQTT_NONE: MQTTConfig.Flags.ValueType # 0 + """Nothing enabled""" + MQTT_ENABLED: MQTTConfig.Flags.ValueType # 1 + """ + Gateway any channels marked is_uplink_enabled or is_downlink_enabled, when + this node can reach the internet. + """ + MQTT_ENCRYPTION: MQTTConfig.Flags.ValueType # 2 + """ + Send encrypted rather than decrypted packets. Only honoured when a custom + server is set; the default mqtt.meshtastic.org server handles encrypted + packets. Decrypted packets suit external systems consuming meshtastic traffic. + """ + MQTT_TLS: MQTTConfig.Flags.ValueType # 4 + """Establish the connection using TLS""" + MQTT_PROXY_TO_CLIENT: MQTTConfig.Flags.ValueType # 8 + """Proxy messages via the connected phone or client instead of connecting directly""" + MQTT_MAP_REPORTING: MQTTConfig.Flags.ValueType # 16 + """Periodically report unencrypted information about this node to a map""" + + FLAGS_FIELD_NUMBER: _builtins.int + ADDRESS_FIELD_NUMBER: _builtins.int + USERNAME_FIELD_NUMBER: _builtins.int + PASSWORD_FIELD_NUMBER: _builtins.int + ROOT_FIELD_NUMBER: _builtins.int + MAP_REPORT_SETTINGS_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + address: _builtins.str + """ + The server to use for our MQTT global message gateway feature. + If not set, the default server will be used + """ + username: _builtins.str + """ + MQTT username to use (most useful for a custom MQTT server). + If using a custom server, this will be honoured even if empty. + If using the default server, this will only be honoured if set, otherwise the device will use the default username + """ + password: _builtins.str + """ + MQTT password to use (most useful for a custom MQTT server). + If using a custom server, this will be honoured even if empty. + If using the default server, this will only be honoured if set, otherwise the device will use the default password + """ + root: _builtins.str + """ + The root topic to use for MQTT messages. Default is "msh". + This is useful if you want to use a single MQTT server for multiple meshtastic networks and separate them via ACLs + """ + @_builtins.property + def map_report_settings(self) -> Global___MapReportSettings: """ - If true, we will periodically report unencrypted information about our node to a map via MQTT + Settings for reporting information about our node to a map via MQTT """ - @property - def map_report_settings(self) -> global___ModuleConfig.MapReportSettings: - """ - Settings for reporting information about our node to a map via MQTT - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - address: builtins.str = ..., - username: builtins.str = ..., - password: builtins.str = ..., - encryption_enabled: builtins.bool = ..., - json_enabled: builtins.bool = ..., - tls_enabled: builtins.bool = ..., - root: builtins.str = ..., - proxy_to_client_enabled: builtins.bool = ..., - map_reporting_enabled: builtins.bool = ..., - map_report_settings: global___ModuleConfig.MapReportSettings | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["map_report_settings", b"map_report_settings"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["address", b"address", "enabled", b"enabled", "encryption_enabled", b"encryption_enabled", "json_enabled", b"json_enabled", "map_report_settings", b"map_report_settings", "map_reporting_enabled", b"map_reporting_enabled", "password", b"password", "proxy_to_client_enabled", b"proxy_to_client_enabled", "root", b"root", "tls_enabled", b"tls_enabled", "username", b"username"]) -> None: ... + def __init__( + self, + *, + flags: _builtins.int = ..., + address: _builtins.str = ..., + username: _builtins.str = ..., + password: _builtins.str = ..., + root: _builtins.str = ..., + map_report_settings: Global___MapReportSettings | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["map_report_settings", b"map_report_settings"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["address", b"address", "flags", b"flags", "map_report_settings", b"map_report_settings", "password", b"password", "root", b"root", "username", b"username"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class MapReportSettings(google.protobuf.message.Message): - """ - Settings for reporting unencrypted information about our node to a map via MQTT - """ +Global___MQTTConfig: _TypeAlias = MQTTConfig # noqa: Y015 - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class MapReportSettings(_message.Message): + """ + Settings for reporting unencrypted information about our node to a map via MQTT + """ - PUBLISH_INTERVAL_SECS_FIELD_NUMBER: builtins.int - POSITION_PRECISION_FIELD_NUMBER: builtins.int - SHOULD_REPORT_LOCATION_FIELD_NUMBER: builtins.int - publish_interval_secs: builtins.int - """ - How often we should report our info to the map (in seconds) - """ - position_precision: builtins.int - """ - Bits of precision for the location sent (default of 32 is full precision). - """ - should_report_location: builtins.bool - """ - Whether we have opted-in to report our location to the map - """ - def __init__( - self, - *, - publish_interval_secs: builtins.int = ..., - position_precision: builtins.int = ..., - should_report_location: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs", "should_report_location", b"should_report_location"]) -> None: ... + DESCRIPTOR: _descriptor.Descriptor - @typing.final - class RemoteHardwareConfig(google.protobuf.message.Message): - """ - RemoteHardwareModule Config - """ + PUBLISH_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + POSITION_PRECISION_FIELD_NUMBER: _builtins.int + SHOULD_REPORT_LOCATION_FIELD_NUMBER: _builtins.int + publish_interval_secs: _builtins.int + """ + How often we should report our info to the map (in seconds) + """ + position_precision: _builtins.int + """ + Bits of precision for the location sent (default of 32 is full precision). + """ + should_report_location: _builtins.bool + """ + Whether we have opted-in to report our location to the map + """ + def __init__( + self, + *, + publish_interval_secs: _builtins.int = ..., + position_precision: _builtins.int = ..., + should_report_location: _builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs", "should_report_location", b"should_report_location"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - DESCRIPTOR: google.protobuf.descriptor.Descriptor +Global___MapReportSettings: _TypeAlias = MapReportSettings # noqa: Y015 - ENABLED_FIELD_NUMBER: builtins.int - ALLOW_UNDEFINED_PIN_ACCESS_FIELD_NUMBER: builtins.int - AVAILABLE_PINS_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Whether the Module is enabled +@_typing.final +class RemoteHardwareConfig(_message.Message): + """ + RemoteHardwareModule Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + ENABLED_FIELD_NUMBER: _builtins.int + ALLOW_UNDEFINED_PIN_ACCESS_FIELD_NUMBER: _builtins.int + AVAILABLE_PINS_FIELD_NUMBER: _builtins.int + AUTHORIZED_KEY_FIELD_NUMBER: _builtins.int + enabled: _builtins.bool + """ + Whether the Module is enabled + """ + allow_undefined_pin_access: _builtins.bool + """ + Whether the Module allows consumers to read / write to pins not defined in available_pins + """ + @_builtins.property + def available_pins(self) -> _containers.RepeatedCompositeFieldContainer[Global___RemoteHardwarePin]: """ - allow_undefined_pin_access: builtins.bool + Exposes the available pins to the mesh for reading and writing """ - Whether the Module allows consumers to read / write to pins not defined in available_pins + + @_builtins.property + def authorized_key(self) -> _containers.RepeatedScalarFieldContainer[_builtins.bytes]: """ - @property - def available_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RemoteHardwarePin]: - """ - Exposes the available pins to the mesh for reading and writing - """ + Public keys authorized to drive this node's GPIO. - def __init__( - self, - *, - enabled: builtins.bool = ..., - allow_undefined_pin_access: builtins.bool = ..., - available_pins: collections.abc.Iterable[global___RemoteHardwarePin] | None = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["allow_undefined_pin_access", b"allow_undefined_pin_access", "available_pins", b"available_pins", "enabled", b"enabled"]) -> None: ... + A HardwareMessage is accepted only as a PKI direct message from a key in + this list, the same rule AdminMessage follows. A channel key is shared by + everyone on the channel, so authorising by channel authorises everyone on + it; authority has to belong to a named entity instead. - @typing.final - class NeighborInfoConfig(google.protobuf.message.Message): - """ - NeighborInfoModule Config + Empty means no remote entity is authorized, which is what an enabled module + with no configuration should do. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( + self, + *, + enabled: _builtins.bool = ..., + allow_undefined_pin_access: _builtins.bool = ..., + available_pins: _abc.Iterable[Global___RemoteHardwarePin] | None = ..., + authorized_key: _abc.Iterable[_builtins.bytes] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["allow_undefined_pin_access", b"allow_undefined_pin_access", "authorized_key", b"authorized_key", "available_pins", b"available_pins", "enabled", b"enabled"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RemoteHardwareConfig: _TypeAlias = RemoteHardwareConfig # noqa: Y015 - ENABLED_FIELD_NUMBER: builtins.int - UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - TRANSMIT_OVER_LORA_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Whether the Module is enabled - """ - update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - Neighbor Info (minimum is 14400, i.e., 4 hours) - """ - transmit_over_lora: builtins.bool - """ - Whether in addition to sending it to MQTT and the PhoneAPI, our NeighborInfo should be transmitted over LoRa. - Note that this is not available on a channel with default key and name. - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - update_interval: builtins.int = ..., - transmit_over_lora: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "transmit_over_lora", b"transmit_over_lora", "update_interval", b"update_interval"]) -> None: ... - - @typing.final - class DetectionSensorConfig(google.protobuf.message.Message): - """ - Detection Sensor Module Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _TriggerType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _TriggerTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.DetectionSensorConfig._TriggerType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - LOGIC_LOW: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 0 - """Event is triggered if pin is low""" - LOGIC_HIGH: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 1 - """Event is triggered if pin is high""" - FALLING_EDGE: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 2 - """Event is triggered when pin goes high to low""" - RISING_EDGE: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 3 - """Event is triggered when pin goes low to high""" - EITHER_EDGE_ACTIVE_LOW: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 4 - """Event is triggered on every pin state change, low is considered to be - "active" - """ - EITHER_EDGE_ACTIVE_HIGH: ModuleConfig.DetectionSensorConfig._TriggerType.ValueType # 5 - """Event is triggered on every pin state change, high is considered to be - "active" - """ - - class TriggerType(_TriggerType, metaclass=_TriggerTypeEnumTypeWrapper): ... - LOGIC_LOW: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 0 +@_typing.final +class NeighborInfoConfig(_message.Message): + """ + NeighborInfoModule Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + ENABLED_FIELD_NUMBER: _builtins.int + UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + TRANSMIT_OVER_LORA_FIELD_NUMBER: _builtins.int + enabled: _builtins.bool + """ + Whether the Module is enabled + """ + update_interval: _builtins.int + """ + Interval in seconds of how often we should try to send our + Neighbor Info (minimum is 14400, i.e., 4 hours) + """ + transmit_over_lora: _builtins.bool + """ + Whether in addition to sending it to MQTT and the PhoneAPI, our NeighborInfo should be transmitted over LoRa. + Note that this is not available on a channel with default key and name. + """ + def __init__( + self, + *, + enabled: _builtins.bool = ..., + update_interval: _builtins.int = ..., + transmit_over_lora: _builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "transmit_over_lora", b"transmit_over_lora", "update_interval", b"update_interval"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NeighborInfoConfig: _TypeAlias = NeighborInfoConfig # noqa: Y015 + +@_typing.final +class DetectionSensorConfig(_message.Message): + """ + Detection Sensor Module Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _TriggerType: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _TriggerTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DetectionSensorConfig._TriggerType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + LOGIC_LOW: DetectionSensorConfig._TriggerType.ValueType # 0 """Event is triggered if pin is low""" - LOGIC_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 1 + LOGIC_HIGH: DetectionSensorConfig._TriggerType.ValueType # 1 """Event is triggered if pin is high""" - FALLING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 2 + FALLING_EDGE: DetectionSensorConfig._TriggerType.ValueType # 2 """Event is triggered when pin goes high to low""" - RISING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 3 + RISING_EDGE: DetectionSensorConfig._TriggerType.ValueType # 3 """Event is triggered when pin goes low to high""" - EITHER_EDGE_ACTIVE_LOW: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 4 + EITHER_EDGE_ACTIVE_LOW: DetectionSensorConfig._TriggerType.ValueType # 4 """Event is triggered on every pin state change, low is considered to be "active" """ - EITHER_EDGE_ACTIVE_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType.ValueType # 5 + EITHER_EDGE_ACTIVE_HIGH: DetectionSensorConfig._TriggerType.ValueType # 5 """Event is triggered on every pin state change, high is considered to be "active" """ - ENABLED_FIELD_NUMBER: builtins.int - MINIMUM_BROADCAST_SECS_FIELD_NUMBER: builtins.int - STATE_BROADCAST_SECS_FIELD_NUMBER: builtins.int - SEND_BELL_FIELD_NUMBER: builtins.int - NAME_FIELD_NUMBER: builtins.int - MONITOR_PIN_FIELD_NUMBER: builtins.int - DETECTION_TRIGGER_TYPE_FIELD_NUMBER: builtins.int - USE_PULLUP_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Whether the Module is enabled - """ - minimum_broadcast_secs: builtins.int - """ - Interval in seconds of how often we can send a message to the mesh when a - trigger event is detected - """ - state_broadcast_secs: builtins.int - """ - Interval in seconds of how often we should send a message to the mesh - with the current state regardless of trigger events When set to 0, only - trigger events will be broadcasted Works as a sort of status heartbeat - for peace of mind - """ - send_bell: builtins.bool - """ - Send ASCII bell with alert message - Useful for triggering ext. notification on bell - """ - name: builtins.str - """ - Friendly name used to format message sent to mesh - Example: A name "Motion" would result in a message "Motion detected" - Maximum length of 20 characters - """ - monitor_pin: builtins.int - """ - GPIO pin to monitor for state changes - """ - detection_trigger_type: global___ModuleConfig.DetectionSensorConfig.TriggerType.ValueType + class TriggerType(_TriggerType, metaclass=_TriggerTypeEnumTypeWrapper): ... + LOGIC_LOW: DetectionSensorConfig.TriggerType.ValueType # 0 + """Event is triggered if pin is low""" + LOGIC_HIGH: DetectionSensorConfig.TriggerType.ValueType # 1 + """Event is triggered if pin is high""" + FALLING_EDGE: DetectionSensorConfig.TriggerType.ValueType # 2 + """Event is triggered when pin goes high to low""" + RISING_EDGE: DetectionSensorConfig.TriggerType.ValueType # 3 + """Event is triggered when pin goes low to high""" + EITHER_EDGE_ACTIVE_LOW: DetectionSensorConfig.TriggerType.ValueType # 4 + """Event is triggered on every pin state change, low is considered to be + "active" + """ + EITHER_EDGE_ACTIVE_HIGH: DetectionSensorConfig.TriggerType.ValueType # 5 + """Event is triggered on every pin state change, high is considered to be + "active" + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[DetectionSensorConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DETECTION_NONE: DetectionSensorConfig._Flags.ValueType # 0 + """Nothing enabled""" + DETECTION_ENABLED: DetectionSensorConfig._Flags.ValueType # 1 + """The module is enabled""" + DETECTION_SEND_BELL: DetectionSensorConfig._Flags.ValueType # 2 """ - The type of trigger event to be used + Send an ASCII bell with the alert message, useful for triggering an + external notification on bell. """ - use_pullup: builtins.bool + DETECTION_USE_PULLUP: DetectionSensorConfig._Flags.ValueType # 4 """ - Whether or not use INPUT_PULLUP mode for GPIO pin - Only applicable if the board uses pull-up resistors on the pin + Use INPUT_PULLUP mode for the GPIO pin. Only applicable when the board has + pull-up resistors on that pin. """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - minimum_broadcast_secs: builtins.int = ..., - state_broadcast_secs: builtins.int = ..., - send_bell: builtins.bool = ..., - name: builtins.str = ..., - monitor_pin: builtins.int = ..., - detection_trigger_type: global___ModuleConfig.DetectionSensorConfig.TriggerType.ValueType = ..., - use_pullup: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["detection_trigger_type", b"detection_trigger_type", "enabled", b"enabled", "minimum_broadcast_secs", b"minimum_broadcast_secs", "monitor_pin", b"monitor_pin", "name", b"name", "send_bell", b"send_bell", "state_broadcast_secs", b"state_broadcast_secs", "use_pullup", b"use_pullup"]) -> None: ... - @typing.final - class AudioConfig(google.protobuf.message.Message): + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - Audio Config for codec2 voice + Detection sensor toggles: a bitwise OR of Flags values. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DETECTION_NONE: DetectionSensorConfig.Flags.ValueType # 0 + """Nothing enabled""" + DETECTION_ENABLED: DetectionSensorConfig.Flags.ValueType # 1 + """The module is enabled""" + DETECTION_SEND_BELL: DetectionSensorConfig.Flags.ValueType # 2 + """ + Send an ASCII bell with the alert message, useful for triggering an + external notification on bell. + """ + DETECTION_USE_PULLUP: DetectionSensorConfig.Flags.ValueType # 4 + """ + Use INPUT_PULLUP mode for the GPIO pin. Only applicable when the board has + pull-up resistors on that pin. + """ - class _Audio_Baud: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + FLAGS_FIELD_NUMBER: _builtins.int + MINIMUM_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + STATE_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + MONITOR_PIN_FIELD_NUMBER: _builtins.int + DETECTION_TRIGGER_TYPE_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + minimum_broadcast_secs: _builtins.int + """ + Interval in seconds of how often we can send a message to the mesh when a + trigger event is detected + """ + state_broadcast_secs: _builtins.int + """ + Interval in seconds of how often we should send a message to the mesh + with the current state regardless of trigger events When set to 0, only + trigger events will be broadcasted Works as a sort of status heartbeat + for peace of mind + """ + name: _builtins.str + """ + Friendly name used to format message sent to mesh + Example: A name "Motion" would result in a message "Motion detected" + Limited to 19 bytes + """ + monitor_pin: _builtins.int + """ + GPIO pin to monitor for state changes + """ + detection_trigger_type: Global___DetectionSensorConfig.TriggerType.ValueType + """ + The type of trigger event to be used + """ + def __init__( + self, + *, + flags: _builtins.int = ..., + minimum_broadcast_secs: _builtins.int = ..., + state_broadcast_secs: _builtins.int = ..., + name: _builtins.str = ..., + monitor_pin: _builtins.int = ..., + detection_trigger_type: Global___DetectionSensorConfig.TriggerType.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["detection_trigger_type", b"detection_trigger_type", "flags", b"flags", "minimum_broadcast_secs", b"minimum_broadcast_secs", "monitor_pin", b"monitor_pin", "name", b"name", "state_broadcast_secs", b"state_broadcast_secs"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - class _Audio_BaudEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.AudioConfig._Audio_Baud.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - CODEC2_DEFAULT: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 0 - CODEC2_3200: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 1 - CODEC2_2400: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 2 - CODEC2_1600: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 3 - CODEC2_1400: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 4 - CODEC2_1300: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 5 - CODEC2_1200: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 6 - CODEC2_700: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 7 - """ - 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. - """ +Global___DetectionSensorConfig: _TypeAlias = DetectionSensorConfig # noqa: Y015 - class Audio_Baud(_Audio_Baud, metaclass=_Audio_BaudEnumTypeWrapper): - """ - Baudrate for codec2 voice - """ +@_typing.final +class AudioConfig(_message.Message): + """ + Audio Config for codec2 voice + """ - CODEC2_DEFAULT: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 0 - CODEC2_3200: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 1 - CODEC2_2400: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 2 - CODEC2_1600: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 3 - CODEC2_1400: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 4 - CODEC2_1300: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 5 - CODEC2_1200: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 6 - CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 7 - """ - 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. - """ + DESCRIPTOR: _descriptor.Descriptor + + class _Audio_Baud: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _Audio_BaudEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[AudioConfig._Audio_Baud.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CODEC2_DEFAULT: AudioConfig._Audio_Baud.ValueType # 0 + """Default codec2 bitrate""" + CODEC2_3200: AudioConfig._Audio_Baud.ValueType # 1 + """3200 bps - highest quality""" + CODEC2_2400: AudioConfig._Audio_Baud.ValueType # 2 + """2400 bps""" + CODEC2_1600: AudioConfig._Audio_Baud.ValueType # 3 + """1600 bps""" + CODEC2_1400: AudioConfig._Audio_Baud.ValueType # 4 + """1400 bps""" + CODEC2_1300: AudioConfig._Audio_Baud.ValueType # 5 + """1300 bps""" + CODEC2_1200: AudioConfig._Audio_Baud.ValueType # 6 + """1200 bps""" + CODEC2_700C: AudioConfig._Audio_Baud.ValueType # 7 + """700C bps - replaces the withdrawn 700 and 700B modes""" + CODEC2_450: AudioConfig._Audio_Baud.ValueType # 8 + """450 bps - lowest rate, and the only one usable on slower modem presets""" + + class Audio_Baud(_Audio_Baud, metaclass=_Audio_BaudEnumTypeWrapper): + """ + Baudrate for codec2 voice + """ + + CODEC2_DEFAULT: AudioConfig.Audio_Baud.ValueType # 0 + """Default codec2 bitrate""" + CODEC2_3200: AudioConfig.Audio_Baud.ValueType # 1 + """3200 bps - highest quality""" + CODEC2_2400: AudioConfig.Audio_Baud.ValueType # 2 + """2400 bps""" + CODEC2_1600: AudioConfig.Audio_Baud.ValueType # 3 + """1600 bps""" + CODEC2_1400: AudioConfig.Audio_Baud.ValueType # 4 + """1400 bps""" + CODEC2_1300: AudioConfig.Audio_Baud.ValueType # 5 + """1300 bps""" + CODEC2_1200: AudioConfig.Audio_Baud.ValueType # 6 + """1200 bps""" + CODEC2_700C: AudioConfig.Audio_Baud.ValueType # 7 + """700C bps - replaces the withdrawn 700 and 700B modes""" + CODEC2_450: AudioConfig.Audio_Baud.ValueType # 8 + """450 bps - lowest rate, and the only one usable on slower modem presets""" + + CODEC2_ENABLED_FIELD_NUMBER: _builtins.int + PTT_PIN_FIELD_NUMBER: _builtins.int + BITRATE_FIELD_NUMBER: _builtins.int + I2S_WS_FIELD_NUMBER: _builtins.int + I2S_SD_FIELD_NUMBER: _builtins.int + I2S_DIN_FIELD_NUMBER: _builtins.int + I2S_SCK_FIELD_NUMBER: _builtins.int + codec2_enabled: _builtins.bool + """ + Whether Audio is enabled + """ + ptt_pin: _builtins.int + """ + PTT Pin + """ + bitrate: Global___AudioConfig.Audio_Baud.ValueType + """ + The codec2 bitrate to encode at. Sample rate is always 8 kHz. + """ + i2s_ws: _builtins.int + """ + I2S Word Select + """ + i2s_sd: _builtins.int + """ + I2S Data IN + """ + i2s_din: _builtins.int + """ + I2S Data OUT + """ + i2s_sck: _builtins.int + """ + I2S Clock + """ + def __init__( + self, + *, + codec2_enabled: _builtins.bool = ..., + ptt_pin: _builtins.int = ..., + bitrate: Global___AudioConfig.Audio_Baud.ValueType = ..., + i2s_ws: _builtins.int = ..., + i2s_sd: _builtins.int = ..., + i2s_din: _builtins.int = ..., + i2s_sck: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bitrate", b"bitrate", "codec2_enabled", b"codec2_enabled", "i2s_din", b"i2s_din", "i2s_sck", b"i2s_sck", "i2s_sd", b"i2s_sd", "i2s_ws", b"i2s_ws", "ptt_pin", b"ptt_pin"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - CODEC2_ENABLED_FIELD_NUMBER: builtins.int - PTT_PIN_FIELD_NUMBER: builtins.int - BITRATE_FIELD_NUMBER: builtins.int - I2S_WS_FIELD_NUMBER: builtins.int - I2S_SD_FIELD_NUMBER: builtins.int - I2S_DIN_FIELD_NUMBER: builtins.int - I2S_SCK_FIELD_NUMBER: builtins.int - codec2_enabled: builtins.bool - """ - Whether Audio is enabled - """ - ptt_pin: builtins.int - """ - PTT Pin - """ - bitrate: global___ModuleConfig.AudioConfig.Audio_Baud.ValueType - """ - The codec2 bitrate to encode at. Sample rate is always 8 kHz. - """ - i2s_ws: builtins.int - """ - I2S Word Select - """ - i2s_sd: builtins.int - """ - I2S Data IN - """ - i2s_din: builtins.int - """ - I2S Data OUT - """ - i2s_sck: builtins.int - """ - I2S Clock - """ - def __init__( - self, - *, - codec2_enabled: builtins.bool = ..., - ptt_pin: builtins.int = ..., - bitrate: global___ModuleConfig.AudioConfig.Audio_Baud.ValueType = ..., - i2s_ws: builtins.int = ..., - i2s_sd: builtins.int = ..., - i2s_din: builtins.int = ..., - i2s_sck: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["bitrate", b"bitrate", "codec2_enabled", b"codec2_enabled", "i2s_din", b"i2s_din", "i2s_sck", b"i2s_sck", "i2s_sd", b"i2s_sd", "i2s_ws", b"i2s_ws", "ptt_pin", b"ptt_pin"]) -> None: ... +Global___AudioConfig: _TypeAlias = AudioConfig # noqa: Y015 - @typing.final - class PaxcounterConfig(google.protobuf.message.Message): - """ - Config for the Paxcounter Module - """ +@_typing.final +class PaxcounterConfig(_message.Message): + """ + Config for the Paxcounter Module + """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - ENABLED_FIELD_NUMBER: builtins.int - PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - WIFI_THRESHOLD_FIELD_NUMBER: builtins.int - BLE_THRESHOLD_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Enable the Paxcounter Module - """ - paxcounter_update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - metrics to the mesh - """ - wifi_threshold: builtins.int - """ - WiFi RSSI threshold. Defaults to -80 - """ - ble_threshold: builtins.int - """ - BLE RSSI threshold. Defaults to -80 - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - paxcounter_update_interval: builtins.int = ..., - wifi_threshold: builtins.int = ..., - ble_threshold: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["ble_threshold", b"ble_threshold", "enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval", "wifi_threshold", b"wifi_threshold"]) -> None: ... + ENABLED_FIELD_NUMBER: _builtins.int + PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + WIFI_THRESHOLD_FIELD_NUMBER: _builtins.int + BLE_THRESHOLD_FIELD_NUMBER: _builtins.int + enabled: _builtins.bool + """ + Enable the Paxcounter Module + """ + paxcounter_update_interval: _builtins.int + """ + Interval in seconds of how often we should try to send our + metrics to the mesh + """ + wifi_threshold: _builtins.int + """ + WiFi RSSI threshold. Defaults to -80 + """ + ble_threshold: _builtins.int + """ + BLE RSSI threshold. Defaults to -80 + """ + def __init__( + self, + *, + enabled: _builtins.bool = ..., + paxcounter_update_interval: _builtins.int = ..., + wifi_threshold: _builtins.int = ..., + ble_threshold: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ble_threshold", b"ble_threshold", "enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval", "wifi_threshold", b"wifi_threshold"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class TrafficManagementConfig(google.protobuf.message.Message): - """ - Config for the Traffic Management module. - 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. - """ +Global___PaxcounterConfig: _TypeAlias = PaxcounterConfig # noqa: Y015 - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class TrafficManagementConfig(_message.Message): + """ + Config for the Traffic Management module. + 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. + """ - POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: builtins.int - NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: builtins.int - RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: builtins.int - RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: builtins.int - UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: builtins.int - position_min_interval_secs: builtins.int - """ - 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 - """ - 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 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. - A non-zero value implicitly enables rate limiting; 0 disables it. - """ - unknown_packet_threshold: builtins.int - """ - 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, - *, - position_min_interval_secs: builtins.int = ..., - nodeinfo_direct_response_max_hops: builtins.int = ..., - rate_limit_window_secs: builtins.int = ..., - rate_limit_max_packets: builtins.int = ..., - unknown_packet_threshold: builtins.int = ..., - ) -> 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): - """ - Serial Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _Serial_Baud: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _Serial_BaudEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.SerialConfig._Serial_Baud.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - BAUD_DEFAULT: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 0 - BAUD_110: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 1 - BAUD_300: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 2 - BAUD_600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 3 - BAUD_1200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 4 - BAUD_2400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 5 - BAUD_4800: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 6 - BAUD_9600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 7 - BAUD_19200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 8 - BAUD_38400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 9 - BAUD_57600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 10 - BAUD_115200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 11 - BAUD_230400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 12 - BAUD_460800: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 13 - BAUD_576000: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 14 - BAUD_921600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 15 - - class Serial_Baud(_Serial_Baud, metaclass=_Serial_BaudEnumTypeWrapper): - """ - TODO: REPLACE - """ - - BAUD_DEFAULT: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 0 - BAUD_110: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 1 - BAUD_300: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 2 - BAUD_600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 3 - BAUD_1200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 4 - BAUD_2400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 5 - BAUD_4800: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 6 - BAUD_9600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 7 - BAUD_19200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 8 - BAUD_38400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 9 - BAUD_57600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 10 - BAUD_115200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 11 - BAUD_230400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 12 - BAUD_460800: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 13 - BAUD_576000: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 14 - BAUD_921600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 15 - - class _Serial_Mode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _Serial_ModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.SerialConfig._Serial_Mode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - DEFAULT: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 0 - SIMPLE: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 1 - PROTO: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 2 - TEXTMSG: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 3 - NMEA: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 4 - CALTOPO: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 5 - """NMEA messages specifically tailored for CalTopo""" - WS85: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 6 - """Ecowitt WS85 weather station""" - VE_DIRECT: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 7 - """VE.Direct is a serial protocol used by Victron Energy products - https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable - """ - MS_CONFIG: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 8 - """Used to configure and view some parameters of MeshSolar. - https://heltec.org/project/meshsolar/ - """ - LOG: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 9 - """Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. - includes other packets - """ - LOGTEXT: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 10 - """only text (channel & DM)""" - - class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper): - """ - TODO: REPLACE - """ - - DEFAULT: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 0 - SIMPLE: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 1 - PROTO: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 2 - TEXTMSG: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 3 - NMEA: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 4 - CALTOPO: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 5 + DESCRIPTOR: _descriptor.Descriptor + + POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: _builtins.int + RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: _builtins.int + RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: _builtins.int + UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: _builtins.int + position_min_interval_secs: _builtins.int + """ + 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 + """ + 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 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. + A non-zero value implicitly enables rate limiting; 0 disables it. + """ + unknown_packet_threshold: _builtins.int + """ + 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, + *, + position_min_interval_secs: _builtins.int = ..., + nodeinfo_direct_response_max_hops: _builtins.int = ..., + rate_limit_window_secs: _builtins.int = ..., + rate_limit_max_packets: _builtins.int = ..., + unknown_packet_threshold: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___TrafficManagementConfig: _TypeAlias = TrafficManagementConfig # noqa: Y015 + +@_typing.final +class SerialConfig(_message.Message): + """ + Serial Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Serial_Baud: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _Serial_BaudEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SerialConfig._Serial_Baud.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + BAUD_DEFAULT: SerialConfig._Serial_Baud.ValueType # 0 + BAUD_110: SerialConfig._Serial_Baud.ValueType # 1 + BAUD_300: SerialConfig._Serial_Baud.ValueType # 2 + BAUD_600: SerialConfig._Serial_Baud.ValueType # 3 + BAUD_1200: SerialConfig._Serial_Baud.ValueType # 4 + BAUD_2400: SerialConfig._Serial_Baud.ValueType # 5 + BAUD_4800: SerialConfig._Serial_Baud.ValueType # 6 + BAUD_9600: SerialConfig._Serial_Baud.ValueType # 7 + BAUD_19200: SerialConfig._Serial_Baud.ValueType # 8 + BAUD_38400: SerialConfig._Serial_Baud.ValueType # 9 + BAUD_57600: SerialConfig._Serial_Baud.ValueType # 10 + BAUD_115200: SerialConfig._Serial_Baud.ValueType # 11 + BAUD_230400: SerialConfig._Serial_Baud.ValueType # 12 + BAUD_460800: SerialConfig._Serial_Baud.ValueType # 13 + BAUD_576000: SerialConfig._Serial_Baud.ValueType # 14 + BAUD_921600: SerialConfig._Serial_Baud.ValueType # 15 + + class Serial_Baud(_Serial_Baud, metaclass=_Serial_BaudEnumTypeWrapper): + """ + Baud rate for serial module communication + """ + + BAUD_DEFAULT: SerialConfig.Serial_Baud.ValueType # 0 + BAUD_110: SerialConfig.Serial_Baud.ValueType # 1 + BAUD_300: SerialConfig.Serial_Baud.ValueType # 2 + BAUD_600: SerialConfig.Serial_Baud.ValueType # 3 + BAUD_1200: SerialConfig.Serial_Baud.ValueType # 4 + BAUD_2400: SerialConfig.Serial_Baud.ValueType # 5 + BAUD_4800: SerialConfig.Serial_Baud.ValueType # 6 + BAUD_9600: SerialConfig.Serial_Baud.ValueType # 7 + BAUD_19200: SerialConfig.Serial_Baud.ValueType # 8 + BAUD_38400: SerialConfig.Serial_Baud.ValueType # 9 + BAUD_57600: SerialConfig.Serial_Baud.ValueType # 10 + BAUD_115200: SerialConfig.Serial_Baud.ValueType # 11 + BAUD_230400: SerialConfig.Serial_Baud.ValueType # 12 + BAUD_460800: SerialConfig.Serial_Baud.ValueType # 13 + BAUD_576000: SerialConfig.Serial_Baud.ValueType # 14 + BAUD_921600: SerialConfig.Serial_Baud.ValueType # 15 + + class _Serial_Mode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _Serial_ModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SerialConfig._Serial_Mode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DEFAULT: SerialConfig._Serial_Mode.ValueType # 0 + SIMPLE: SerialConfig._Serial_Mode.ValueType # 1 + PROTO: SerialConfig._Serial_Mode.ValueType # 2 + TEXTMSG: SerialConfig._Serial_Mode.ValueType # 3 + NMEA: SerialConfig._Serial_Mode.ValueType # 4 + CALTOPO: SerialConfig._Serial_Mode.ValueType # 5 """NMEA messages specifically tailored for CalTopo""" - WS85: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 6 + WS85: SerialConfig._Serial_Mode.ValueType # 6 """Ecowitt WS85 weather station""" - VE_DIRECT: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 7 + VE_DIRECT: SerialConfig._Serial_Mode.ValueType # 7 """VE.Direct is a serial protocol used by Victron Energy products https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable """ - MS_CONFIG: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 8 + MS_CONFIG: SerialConfig._Serial_Mode.ValueType # 8 """Used to configure and view some parameters of MeshSolar. https://heltec.org/project/meshsolar/ """ - LOG: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 9 + LOG: SerialConfig._Serial_Mode.ValueType # 9 """Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. includes other packets """ - LOGTEXT: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 10 + LOGTEXT: SerialConfig._Serial_Mode.ValueType # 10 """only text (channel & DM)""" - ENABLED_FIELD_NUMBER: builtins.int - ECHO_FIELD_NUMBER: builtins.int - RXD_FIELD_NUMBER: builtins.int - TXD_FIELD_NUMBER: builtins.int - BAUD_FIELD_NUMBER: builtins.int - TIMEOUT_FIELD_NUMBER: builtins.int - MODE_FIELD_NUMBER: builtins.int - OVERRIDE_CONSOLE_SERIAL_PORT_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Preferences for the SerialModule - """ - echo: builtins.bool - """ - TODO: REPLACE - """ - rxd: builtins.int - """ - RX pin (should match Arduino gpio pin number) - """ - txd: builtins.int - """ - TX pin (should match Arduino gpio pin number) - """ - baud: global___ModuleConfig.SerialConfig.Serial_Baud.ValueType - """ - Serial baud rate - """ - timeout: builtins.int - """ - TODO: REPLACE - """ - mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType - """ - Mode for serial module operation - """ - override_console_serial_port: builtins.bool - """ - Overrides the platform's defacto Serial port instance to use with Serial module config settings - This is currently only usable in output modes like NMEA / CalTopo and may behave strangely or not work at all in other modes - Existing logging over the Serial Console will still be present - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - echo: builtins.bool = ..., - rxd: builtins.int = ..., - txd: builtins.int = ..., - baud: global___ModuleConfig.SerialConfig.Serial_Baud.ValueType = ..., - timeout: builtins.int = ..., - mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType = ..., - override_console_serial_port: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["baud", b"baud", "echo", b"echo", "enabled", b"enabled", "mode", b"mode", "override_console_serial_port", b"override_console_serial_port", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"]) -> None: ... - - @typing.final - class ExternalNotificationConfig(google.protobuf.message.Message): - """ - External Notifications Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ENABLED_FIELD_NUMBER: builtins.int - OUTPUT_MS_FIELD_NUMBER: builtins.int - OUTPUT_FIELD_NUMBER: builtins.int - OUTPUT_VIBRA_FIELD_NUMBER: builtins.int - OUTPUT_BUZZER_FIELD_NUMBER: builtins.int - ACTIVE_FIELD_NUMBER: builtins.int - ALERT_MESSAGE_FIELD_NUMBER: builtins.int - ALERT_MESSAGE_VIBRA_FIELD_NUMBER: builtins.int - ALERT_MESSAGE_BUZZER_FIELD_NUMBER: builtins.int - ALERT_BELL_FIELD_NUMBER: builtins.int - ALERT_BELL_VIBRA_FIELD_NUMBER: builtins.int - ALERT_BELL_BUZZER_FIELD_NUMBER: builtins.int - USE_PWM_FIELD_NUMBER: builtins.int - NAG_TIMEOUT_FIELD_NUMBER: builtins.int - USE_I2S_AS_BUZZER_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Enable the ExternalNotificationModule - """ - output_ms: builtins.int - """ - When using in On/Off mode, keep the output on for this many - milliseconds. Default 1000ms (1 second). - """ - output: builtins.int - """ - Define the output pin GPIO setting Defaults to - EXT_NOTIFY_OUT if set for the board. - In standalone devices this pin should drive the LED to match the UI. - """ - output_vibra: builtins.int - """ - Optional: Define a secondary output pin for a vibra motor - This is used in standalone devices to match the UI. - """ - output_buzzer: builtins.int - """ - Optional: Define a tertiary output pin for an active buzzer - This is used in standalone devices to to match the UI. - """ - active: builtins.bool - """ - IF this is true, the 'output' Pin will be pulled active high, false - means active low. - """ - alert_message: builtins.bool - """ - True: Alert when a text message arrives (output) - """ - alert_message_vibra: builtins.bool - """ - True: Alert when a text message arrives (output_vibra) - """ - alert_message_buzzer: builtins.bool - """ - True: Alert when a text message arrives (output_buzzer) - """ - alert_bell: builtins.bool - """ - True: Alert when the bell character is received (output) - """ - alert_bell_vibra: builtins.bool - """ - True: Alert when the bell character is received (output_vibra) - """ - alert_bell_buzzer: builtins.bool - """ - True: Alert when the bell character is received (output_buzzer) - """ - use_pwm: builtins.bool - """ - use a PWM output instead of a simple on/off output. This will ignore - the 'output', 'output_ms' and 'active' settings and use the - device.buzzer_gpio instead. - """ - nag_timeout: builtins.int - """ - The notification will toggle with 'output_ms' for this time of seconds. - Default is 0 which means don't repeat at all. 60 would mean blink - and/or beep for 60 seconds - """ - use_i2s_as_buzzer: builtins.bool - """ - When true, enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer - T-Watch S3 and T-Deck for example have this capability - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - output_ms: builtins.int = ..., - output: builtins.int = ..., - output_vibra: builtins.int = ..., - output_buzzer: builtins.int = ..., - active: builtins.bool = ..., - alert_message: builtins.bool = ..., - alert_message_vibra: builtins.bool = ..., - alert_message_buzzer: builtins.bool = ..., - alert_bell: builtins.bool = ..., - alert_bell_vibra: builtins.bool = ..., - alert_bell_buzzer: builtins.bool = ..., - use_pwm: builtins.bool = ..., - nag_timeout: builtins.int = ..., - use_i2s_as_buzzer: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["active", b"active", "alert_bell", b"alert_bell", "alert_bell_buzzer", b"alert_bell_buzzer", "alert_bell_vibra", b"alert_bell_vibra", "alert_message", b"alert_message", "alert_message_buzzer", b"alert_message_buzzer", "alert_message_vibra", b"alert_message_vibra", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra", "use_i2s_as_buzzer", b"use_i2s_as_buzzer", "use_pwm", b"use_pwm"]) -> None: ... - - @typing.final - class StoreForwardConfig(google.protobuf.message.Message): + class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper): """ - Store and Forward Module Config + Operating mode for the serial module """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - ENABLED_FIELD_NUMBER: builtins.int - HEARTBEAT_FIELD_NUMBER: builtins.int - RECORDS_FIELD_NUMBER: builtins.int - HISTORY_RETURN_MAX_FIELD_NUMBER: builtins.int - HISTORY_RETURN_WINDOW_FIELD_NUMBER: builtins.int - IS_SERVER_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Enable the Store and Forward Module - """ - heartbeat: builtins.bool - """ - TODO: REPLACE - """ - records: builtins.int - """ - TODO: REPLACE - """ - history_return_max: builtins.int - """ - TODO: REPLACE - """ - history_return_window: builtins.int - """ - TODO: REPLACE - """ - is_server: builtins.bool - """ - Set to true to let this node act as a server that stores received messages and resends them upon request. - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - heartbeat: builtins.bool = ..., - records: builtins.int = ..., - history_return_max: builtins.int = ..., - history_return_window: builtins.int = ..., - is_server: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "heartbeat", b"heartbeat", "history_return_max", b"history_return_max", "history_return_window", b"history_return_window", "is_server", b"is_server", "records", b"records"]) -> None: ... - - @typing.final - class RangeTestConfig(google.protobuf.message.Message): - """ - Preferences for the RangeTestModule - """ + DEFAULT: SerialConfig.Serial_Mode.ValueType # 0 + SIMPLE: SerialConfig.Serial_Mode.ValueType # 1 + PROTO: SerialConfig.Serial_Mode.ValueType # 2 + TEXTMSG: SerialConfig.Serial_Mode.ValueType # 3 + NMEA: SerialConfig.Serial_Mode.ValueType # 4 + CALTOPO: SerialConfig.Serial_Mode.ValueType # 5 + """NMEA messages specifically tailored for CalTopo""" + WS85: SerialConfig.Serial_Mode.ValueType # 6 + """Ecowitt WS85 weather station""" + VE_DIRECT: SerialConfig.Serial_Mode.ValueType # 7 + """VE.Direct is a serial protocol used by Victron Energy products + https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable + """ + MS_CONFIG: SerialConfig.Serial_Mode.ValueType # 8 + """Used to configure and view some parameters of MeshSolar. + https://heltec.org/project/meshsolar/ + """ + LOG: SerialConfig.Serial_Mode.ValueType # 9 + """Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. + includes other packets + """ + LOGTEXT: SerialConfig.Serial_Mode.ValueType # 10 + """only text (channel & DM)""" - DESCRIPTOR: google.protobuf.descriptor.Descriptor + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - ENABLED_FIELD_NUMBER: builtins.int - SENDER_FIELD_NUMBER: builtins.int - SAVE_FIELD_NUMBER: builtins.int - CLEAR_ON_REBOOT_FIELD_NUMBER: builtins.int - enabled: builtins.bool + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SerialConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + SERIAL_NONE: SerialConfig._Flags.ValueType # 0 + """Nothing enabled""" + SERIAL_ENABLED: SerialConfig._Flags.ValueType # 1 + """The module is enabled""" + SERIAL_ECHO: SerialConfig._Flags.ValueType # 2 + """Echo received serial data back to the sender""" + SERIAL_OVERRIDE_CONSOLE_PORT: SerialConfig._Flags.ValueType # 4 """ - Enable the Range Test Module + Override the platform's defacto Serial port instance and use the console + port for the serial module. Currently only usable in output modes like + NMEA / CalTopo, and may behave strangely or not at all in other modes. + Existing logging over the serial console is still present. """ - sender: builtins.int - """ - Send out range test messages from this node - """ - save: builtins.bool - """ - Bool value indicating that this node should save a RangeTest.csv file. - ESP32 Only - """ - clear_on_reboot: builtins.bool - """ - Bool indicating that the node should cleanup / destroy it's RangeTest.csv file. - ESP32 Only - """ - def __init__( - self, - *, - enabled: builtins.bool = ..., - sender: builtins.int = ..., - save: builtins.bool = ..., - clear_on_reboot: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["clear_on_reboot", b"clear_on_reboot", "enabled", b"enabled", "save", b"save", "sender", b"sender"]) -> None: ... - @typing.final - class TelemetryConfig(google.protobuf.message.Message): + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - Configuration for both device and environment metrics + Serial module toggles: a bitwise OR of Flags values. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - ENVIRONMENT_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - ENVIRONMENT_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int - ENVIRONMENT_SCREEN_ENABLED_FIELD_NUMBER: builtins.int - ENVIRONMENT_DISPLAY_FAHRENHEIT_FIELD_NUMBER: builtins.int - AIR_QUALITY_ENABLED_FIELD_NUMBER: builtins.int - AIR_QUALITY_INTERVAL_FIELD_NUMBER: builtins.int - POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int - POWER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - POWER_SCREEN_ENABLED_FIELD_NUMBER: builtins.int - HEALTH_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int - HEALTH_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int - HEALTH_SCREEN_ENABLED_FIELD_NUMBER: builtins.int - DEVICE_TELEMETRY_ENABLED_FIELD_NUMBER: builtins.int - AIR_QUALITY_SCREEN_ENABLED_FIELD_NUMBER: builtins.int - device_update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - device metrics to the mesh - """ - environment_update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - environment measurements to the mesh - """ - environment_measurement_enabled: builtins.bool - """ - Preferences for the Telemetry Module (Environment) - Enable/Disable the telemetry measurement module measurement collection - """ - environment_screen_enabled: builtins.bool - """ - Enable/Disable the telemetry measurement module on-device display - """ - environment_display_fahrenheit: builtins.bool - """ - We'll always read the sensor in Celsius, but sometimes we might want to - display the results in Fahrenheit as a "user preference". - """ - air_quality_enabled: builtins.bool - """ - Enable/Disable the air quality metrics - """ - air_quality_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - air quality metrics to the mesh - """ - power_measurement_enabled: builtins.bool - """ - Enable/disable Power metrics - """ - power_update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - power metrics to the mesh - """ - power_screen_enabled: builtins.bool - """ - Enable/Disable the power measurement module on-device display - """ - health_measurement_enabled: builtins.bool - """ - Preferences for the (Health) Telemetry Module - Enable/Disable the telemetry measurement module measurement collection - """ - health_update_interval: builtins.int - """ - Interval in seconds of how often we should try to send our - health metrics to the mesh - """ - health_screen_enabled: builtins.bool - """ - Enable/Disable the health telemetry module on-device display - """ - device_telemetry_enabled: builtins.bool - """ - Enable/Disable the device telemetry module to send metrics to the mesh - Note: We will still send telemtry to the connected phone / client every minute over the API - """ - air_quality_screen_enabled: builtins.bool - """ - Enable/Disable the air quality telemetry measurement module on-device display - """ - def __init__( - self, - *, - device_update_interval: builtins.int = ..., - environment_update_interval: builtins.int = ..., - environment_measurement_enabled: builtins.bool = ..., - environment_screen_enabled: builtins.bool = ..., - environment_display_fahrenheit: builtins.bool = ..., - air_quality_enabled: builtins.bool = ..., - air_quality_interval: builtins.int = ..., - power_measurement_enabled: builtins.bool = ..., - power_update_interval: builtins.int = ..., - power_screen_enabled: builtins.bool = ..., - health_measurement_enabled: builtins.bool = ..., - health_update_interval: builtins.int = ..., - health_screen_enabled: builtins.bool = ..., - device_telemetry_enabled: builtins.bool = ..., - air_quality_screen_enabled: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "air_quality_screen_enabled", b"air_quality_screen_enabled", "device_telemetry_enabled", b"device_telemetry_enabled", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "health_measurement_enabled", b"health_measurement_enabled", "health_screen_enabled", b"health_screen_enabled", "health_update_interval", b"health_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ... - - @typing.final - class CannedMessageConfig(google.protobuf.message.Message): - """ - Canned Messages Module Config - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor + SERIAL_NONE: SerialConfig.Flags.ValueType # 0 + """Nothing enabled""" + SERIAL_ENABLED: SerialConfig.Flags.ValueType # 1 + """The module is enabled""" + SERIAL_ECHO: SerialConfig.Flags.ValueType # 2 + """Echo received serial data back to the sender""" + SERIAL_OVERRIDE_CONSOLE_PORT: SerialConfig.Flags.ValueType # 4 + """ + Override the platform's defacto Serial port instance and use the console + port for the serial module. Currently only usable in output modes like + NMEA / CalTopo, and may behave strangely or not at all in other modes. + Existing logging over the serial console is still present. + """ - class _InputEventChar: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + FLAGS_FIELD_NUMBER: _builtins.int + RXD_FIELD_NUMBER: _builtins.int + TXD_FIELD_NUMBER: _builtins.int + BAUD_FIELD_NUMBER: _builtins.int + TIMEOUT_FIELD_NUMBER: _builtins.int + MODE_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + rxd: _builtins.int + """ + RX pin (should match Arduino gpio pin number) + """ + txd: _builtins.int + """ + TX pin (should match Arduino gpio pin number) + """ + baud: Global___SerialConfig.Serial_Baud.ValueType + """ + Serial baud rate + """ + timeout: _builtins.int + """ + Timeout in seconds for serial module operations (0 = no timeout) + """ + mode: Global___SerialConfig.Serial_Mode.ValueType + """ + Mode for serial module operation + """ + def __init__( + self, + *, + flags: _builtins.int = ..., + rxd: _builtins.int = ..., + txd: _builtins.int = ..., + baud: Global___SerialConfig.Serial_Baud.ValueType = ..., + timeout: _builtins.int = ..., + mode: Global___SerialConfig.Serial_Mode.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["baud", b"baud", "flags", b"flags", "mode", b"mode", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - class _InputEventCharEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.CannedMessageConfig._InputEventChar.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - NONE: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 0 - """ - TODO: REPLACE - """ - UP: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 17 - """ - TODO: REPLACE - """ - DOWN: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 18 - """ - TODO: REPLACE - """ - LEFT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 19 - """ - TODO: REPLACE - """ - RIGHT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 20 - """ - TODO: REPLACE - """ - SELECT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 10 - """ - '\\n' - """ - BACK: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 27 - """ - TODO: REPLACE - """ - CANCEL: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 24 - """ - TODO: REPLACE - """ +Global___SerialConfig: _TypeAlias = SerialConfig # noqa: Y015 - class InputEventChar(_InputEventChar, metaclass=_InputEventCharEnumTypeWrapper): - """ - TODO: REPLACE - """ +@_typing.final +class ExternalNotificationConfig(_message.Message): + """ + External Notifications Config + """ - NONE: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 0 - """ - TODO: REPLACE - """ - UP: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 17 - """ - TODO: REPLACE - """ - DOWN: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 18 - """ - TODO: REPLACE - """ - LEFT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 19 - """ - TODO: REPLACE - """ - RIGHT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 20 - """ - TODO: REPLACE - """ - SELECT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 10 - """ - '\\n' - """ - BACK: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 27 - """ - TODO: REPLACE - """ - CANCEL: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 24 - """ - TODO: REPLACE - """ + DESCRIPTOR: _descriptor.Descriptor + + class _AlertFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _AlertFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[ExternalNotificationConfig._AlertFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + ALERT_NONE: ExternalNotificationConfig._AlertFlags.ValueType # 0 + """Nothing enabled""" + ALERT_ACTIVE: ExternalNotificationConfig._AlertFlags.ValueType # 1 + """Output pin is pulled active high; clear means active low""" + ALERT_MESSAGE: ExternalNotificationConfig._AlertFlags.ValueType # 2 + """Alert on an incoming text message, via `output`""" + ALERT_MESSAGE_VIBRA: ExternalNotificationConfig._AlertFlags.ValueType # 4 + """Alert on an incoming text message, via `output_vibra`""" + ALERT_MESSAGE_BUZZER: ExternalNotificationConfig._AlertFlags.ValueType # 8 + """Alert on an incoming text message, via `output_buzzer`""" + ALERT_BELL: ExternalNotificationConfig._AlertFlags.ValueType # 16 + """Alert on a received bell character, via `output`""" + ALERT_BELL_VIBRA: ExternalNotificationConfig._AlertFlags.ValueType # 32 + """Alert on a received bell character, via `output_vibra`""" + ALERT_BELL_BUZZER: ExternalNotificationConfig._AlertFlags.ValueType # 64 + """Alert on a received bell character, via `output_buzzer`""" + ALERT_USE_PWM: ExternalNotificationConfig._AlertFlags.ValueType # 128 + """Drive the output with PWM instead of simple on/off""" + ALERT_USE_I2S_AS_BUZZER: ExternalNotificationConfig._AlertFlags.ValueType # 256 + """Use I2S audio output as the buzzer (e.g. T-Watch S3, T-Deck)""" + + class AlertFlags(_AlertFlags, metaclass=_AlertFlagsEnumTypeWrapper): + """ + External notification behaviour: a bitwise OR of AlertFlags values. + """ + + ALERT_NONE: ExternalNotificationConfig.AlertFlags.ValueType # 0 + """Nothing enabled""" + ALERT_ACTIVE: ExternalNotificationConfig.AlertFlags.ValueType # 1 + """Output pin is pulled active high; clear means active low""" + ALERT_MESSAGE: ExternalNotificationConfig.AlertFlags.ValueType # 2 + """Alert on an incoming text message, via `output`""" + ALERT_MESSAGE_VIBRA: ExternalNotificationConfig.AlertFlags.ValueType # 4 + """Alert on an incoming text message, via `output_vibra`""" + ALERT_MESSAGE_BUZZER: ExternalNotificationConfig.AlertFlags.ValueType # 8 + """Alert on an incoming text message, via `output_buzzer`""" + ALERT_BELL: ExternalNotificationConfig.AlertFlags.ValueType # 16 + """Alert on a received bell character, via `output`""" + ALERT_BELL_VIBRA: ExternalNotificationConfig.AlertFlags.ValueType # 32 + """Alert on a received bell character, via `output_vibra`""" + ALERT_BELL_BUZZER: ExternalNotificationConfig.AlertFlags.ValueType # 64 + """Alert on a received bell character, via `output_buzzer`""" + ALERT_USE_PWM: ExternalNotificationConfig.AlertFlags.ValueType # 128 + """Drive the output with PWM instead of simple on/off""" + ALERT_USE_I2S_AS_BUZZER: ExternalNotificationConfig.AlertFlags.ValueType # 256 + """Use I2S audio output as the buzzer (e.g. T-Watch S3, T-Deck)""" + + ENABLED_FIELD_NUMBER: _builtins.int + OUTPUT_MS_FIELD_NUMBER: _builtins.int + OUTPUT_FIELD_NUMBER: _builtins.int + ALERT_FLAGS_FIELD_NUMBER: _builtins.int + OUTPUT_VIBRA_FIELD_NUMBER: _builtins.int + OUTPUT_BUZZER_FIELD_NUMBER: _builtins.int + NAG_TIMEOUT_FIELD_NUMBER: _builtins.int + enabled: _builtins.bool + """ + Enable the ExternalNotificationModule + """ + output_ms: _builtins.int + """ + When using in On/Off mode, keep the output on for this many + milliseconds. Default 1000ms (1 second). + """ + output: _builtins.int + """ + Define the output pin GPIO setting Defaults to + EXT_NOTIFY_OUT if set for the board. + In standalone devices this pin should drive the LED to match the UI. + """ + alert_flags: _builtins.int + """ + Bitwise OR of AlertFlags values. + """ + output_vibra: _builtins.int + """ + Optional: Define a secondary output pin for a vibra motor + This is used in standalone devices to match the UI. + """ + output_buzzer: _builtins.int + """ + Optional: GPIO an active (on/off) buzzer is connected to, driven when + ALERT_USE_PWM is clear. 0 is GPIO0, not "unset": the ALERT_*_BUZZER flags say + whether it sounds. In standalone devices it matches the UI. + """ + nag_timeout: _builtins.int + """ + The notification will toggle with 'output_ms' for this time of seconds. + Default is 0 which means don't repeat at all. 60 would mean blink + and/or beep for 60 seconds + """ + def __init__( + self, + *, + enabled: _builtins.bool = ..., + output_ms: _builtins.int = ..., + output: _builtins.int = ..., + alert_flags: _builtins.int = ..., + output_vibra: _builtins.int = ..., + output_buzzer: _builtins.int = ..., + nag_timeout: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["alert_flags", b"alert_flags", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - ROTARY1_ENABLED_FIELD_NUMBER: builtins.int - INPUTBROKER_PIN_A_FIELD_NUMBER: builtins.int - INPUTBROKER_PIN_B_FIELD_NUMBER: builtins.int - INPUTBROKER_PIN_PRESS_FIELD_NUMBER: builtins.int - INPUTBROKER_EVENT_CW_FIELD_NUMBER: builtins.int - INPUTBROKER_EVENT_CCW_FIELD_NUMBER: builtins.int - INPUTBROKER_EVENT_PRESS_FIELD_NUMBER: builtins.int - UPDOWN1_ENABLED_FIELD_NUMBER: builtins.int - ENABLED_FIELD_NUMBER: builtins.int - ALLOW_INPUT_SOURCE_FIELD_NUMBER: builtins.int - SEND_BELL_FIELD_NUMBER: builtins.int - rotary1_enabled: builtins.bool - """ - Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating. - """ - inputbroker_pin_a: builtins.int - """ - GPIO pin for rotary encoder A port. - """ - inputbroker_pin_b: builtins.int - """ - GPIO pin for rotary encoder B port. - """ - inputbroker_pin_press: builtins.int - """ - GPIO pin for rotary encoder Press port. - """ - inputbroker_event_cw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType - """ - Generate input event on CW of this kind. - """ - inputbroker_event_ccw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType - """ - Generate input event on CCW of this kind. - """ - inputbroker_event_press: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType - """ - Generate input event on Press of this kind. - """ - updown1_enabled: builtins.bool - """ - Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker. - """ - enabled: builtins.bool - """ - Enable/disable CannedMessageModule. - """ - allow_input_source: builtins.str - """ - Input event origin accepted by the canned message module. - Can be e.g. "rotEnc1", "upDownEnc1", "scanAndSelect", "cardkb", "serialkb", or keyword "_any" - """ - send_bell: builtins.bool - """ - CannedMessageModule also sends a bell character with the messages. - ExternalNotificationModule can benefit from this feature. - """ - def __init__( - self, - *, - rotary1_enabled: builtins.bool = ..., - inputbroker_pin_a: builtins.int = ..., - inputbroker_pin_b: builtins.int = ..., - inputbroker_pin_press: builtins.int = ..., - inputbroker_event_cw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ..., - inputbroker_event_ccw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ..., - inputbroker_event_press: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ..., - updown1_enabled: builtins.bool = ..., - enabled: builtins.bool = ..., - allow_input_source: builtins.str = ..., - send_bell: builtins.bool = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["allow_input_source", b"allow_input_source", "enabled", b"enabled", "inputbroker_event_ccw", b"inputbroker_event_ccw", "inputbroker_event_cw", b"inputbroker_event_cw", "inputbroker_event_press", b"inputbroker_event_press", "inputbroker_pin_a", b"inputbroker_pin_a", "inputbroker_pin_b", b"inputbroker_pin_b", "inputbroker_pin_press", b"inputbroker_pin_press", "rotary1_enabled", b"rotary1_enabled", "send_bell", b"send_bell", "updown1_enabled", b"updown1_enabled"]) -> None: ... +Global___ExternalNotificationConfig: _TypeAlias = ExternalNotificationConfig # noqa: Y015 - @typing.final - class AmbientLightingConfig(google.protobuf.message.Message): - """ - Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels. - Initially created for the RAK14001 RGB LED module. - """ +@_typing.final +class StoreForwardConfig(_message.Message): + """ + Store and Forward Module Config + """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - LED_STATE_FIELD_NUMBER: builtins.int - CURRENT_FIELD_NUMBER: builtins.int - RED_FIELD_NUMBER: builtins.int - GREEN_FIELD_NUMBER: builtins.int - BLUE_FIELD_NUMBER: builtins.int - led_state: builtins.bool - """ - Sets LED to on or off. - """ - current: builtins.int + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[StoreForwardConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + STOREFORWARD_NONE: StoreForwardConfig._Flags.ValueType # 0 + """Nothing enabled""" + STOREFORWARD_ENABLED: StoreForwardConfig._Flags.ValueType # 1 + """The module is enabled""" + STOREFORWARD_HEARTBEAT: StoreForwardConfig._Flags.ValueType # 2 + """The server sends its ANNOUNCE pip periodically, so clients can find it""" + STOREFORWARD_IS_SERVER: StoreForwardConfig._Flags.ValueType # 4 """ - Sets the current for the LED output. Default is 10. + Act as a server that stores the frames it hears and replays them on request, + rather than as a client. """ - red: builtins.int + STOREFORWARD_KEEP_FILLER: StoreForwardConfig._Flags.ValueType # 8 """ - Sets the red LED level. Values are 0-255. + Also store frames without HOP_STORE, as evictable filler. Clear means only + flagged frames are written. """ - green: builtins.int + STOREFORWARD_NO_DIRECT: StoreForwardConfig._Flags.ValueType # 16 """ - Sets the green LED level. Values are 0-255. + Do not store or replay direct messages. Clear means a server also keeps the + UCAST ciphertext it hears, which it cannot read. """ - blue: builtins.int + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - Sets the blue LED level. Values are 0-255. + Store and forward toggles: a bitwise OR of Flags values. """ - def __init__( - self, - *, - led_state: builtins.bool = ..., - current: builtins.int = ..., - red: builtins.int = ..., - green: builtins.int = ..., - blue: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["blue", b"blue", "current", b"current", "green", b"green", "led_state", b"led_state", "red", b"red"]) -> None: ... - @typing.final - class StatusMessageConfig(google.protobuf.message.Message): + STOREFORWARD_NONE: StoreForwardConfig.Flags.ValueType # 0 + """Nothing enabled""" + STOREFORWARD_ENABLED: StoreForwardConfig.Flags.ValueType # 1 + """The module is enabled""" + STOREFORWARD_HEARTBEAT: StoreForwardConfig.Flags.ValueType # 2 + """The server sends its ANNOUNCE pip periodically, so clients can find it""" + STOREFORWARD_IS_SERVER: StoreForwardConfig.Flags.ValueType # 4 + """ + Act as a server that stores the frames it hears and replays them on request, + rather than as a client. + """ + STOREFORWARD_KEEP_FILLER: StoreForwardConfig.Flags.ValueType # 8 + """ + Also store frames without HOP_STORE, as evictable filler. Clear means only + flagged frames are written. + """ + STOREFORWARD_NO_DIRECT: StoreForwardConfig.Flags.ValueType # 16 + """ + Do not store or replay direct messages. Clear means a server also keeps the + UCAST ciphertext it hears, which it cannot read. + """ + + FLAGS_FIELD_NUMBER: _builtins.int + STORAGE_BYTES_FIELD_NUMBER: _builtins.int + MAX_PER_SYNC_FIELD_NUMBER: _builtins.int + ANNOUNCE_SECS_FIELD_NUMBER: _builtins.int + SERVED_HASHES_FIELD_NUMBER: _builtins.int + DISCOVERY_MAX_RECORDS_FIELD_NUMBER: _builtins.int + RECORD_TTL_SECS_FIELD_NUMBER: _builtins.int + DISCOVERY_ADMIT_PER_HOUR_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + storage_bytes: _builtins.int + """ + Bytes of backing store to use. 0 takes everything the platform offers. + """ + max_per_sync: _builtins.int + """ + Frames the server sends in one sync round before ending it. Default 32. + """ + announce_secs: _builtins.int + """ + Seconds between ANNOUNCE pips while STOREFORWARD_HEARTBEAT is set. Default 3600. + """ + discovery_max_records: _builtins.int + """ + Node discovery records to hold, when DeviceConfig sets DISCOVERY_SERVE. A record is about + 135 bytes encoded and 150 with the index, so 1000 records is 150 kB of the same backing + store the frame log uses. 0 takes what the platform offers. + """ + record_ttl_secs: _builtins.int + """ + Seconds a discovery record survives without a refresh, after which it is evicted. This is + also how an identity retires: there is no tombstone to replay, so a node that stops + announcing simply ages out. 0 takes the default of 30 days. + """ + discovery_admit_per_hour: _builtins.int + """ + New records the server files per hour from what it hears over RF. A newer seq or a refresh + of a record already held does not count. This bounds how fast one transmitter can push real + records out with invented ones, at the cost of a slower start for a new server: a record + turned away is published again at its owner's next announce. 0 takes the default of 60. + """ + @_builtins.property + def served_hashes(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - StatusMessage config - Allows setting a status message for a node to periodically rebroadcast + Channel hashes to retain. Empty keeps every hash the node hears. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( + self, + *, + flags: _builtins.int = ..., + storage_bytes: _builtins.int = ..., + max_per_sync: _builtins.int = ..., + announce_secs: _builtins.int = ..., + served_hashes: _abc.Iterable[_builtins.int] | None = ..., + discovery_max_records: _builtins.int = ..., + record_ttl_secs: _builtins.int = ..., + discovery_admit_per_hour: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["announce_secs", b"announce_secs", "discovery_admit_per_hour", b"discovery_admit_per_hour", "discovery_max_records", b"discovery_max_records", "flags", b"flags", "max_per_sync", b"max_per_sync", "record_ttl_secs", b"record_ttl_secs", "served_hashes", b"served_hashes", "storage_bytes", b"storage_bytes"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___StoreForwardConfig: _TypeAlias = StoreForwardConfig # noqa: Y015 - NODE_STATUS_FIELD_NUMBER: builtins.int - node_status: builtins.str - """ - The actual status string +@_typing.final +class TelemetryConfig(_message.Message): + """ + Configuration for both device and environment metrics + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[TelemetryConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + TELEMETRY_NONE: TelemetryConfig._Flags.ValueType # 0 + """Nothing enabled""" + TELEMETRY_ENVIRONMENT_MEASUREMENT: TelemetryConfig._Flags.ValueType # 1 + """Collect environment measurements""" + TELEMETRY_ENVIRONMENT_SCREEN: TelemetryConfig._Flags.ValueType # 2 + """Show environment measurements on the device screen""" + TELEMETRY_AIR_QUALITY: TelemetryConfig._Flags.ValueType # 8 + """Collect air quality metrics""" + TELEMETRY_AIR_QUALITY_SCREEN: TelemetryConfig._Flags.ValueType # 16 + """Show air quality metrics on the device screen""" + TELEMETRY_POWER_MEASUREMENT: TelemetryConfig._Flags.ValueType # 32 + """Collect power metrics""" + TELEMETRY_POWER_SCREEN: TelemetryConfig._Flags.ValueType # 64 + """Show power metrics on the device screen""" + TELEMETRY_HEALTH_MEASUREMENT: TelemetryConfig._Flags.ValueType # 128 + """Collect health metrics""" + TELEMETRY_HEALTH_SCREEN: TelemetryConfig._Flags.ValueType # 256 + """Show health metrics on the device screen""" + TELEMETRY_DEVICE: TelemetryConfig._Flags.ValueType # 512 + """ + Send device telemetry to the mesh. Telemetry still goes to the connected + phone or client over the API every minute regardless. + """ + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Which telemetry sources are collected, sent and shown on screen: + a bitwise OR of Flags values. + """ + + TELEMETRY_NONE: TelemetryConfig.Flags.ValueType # 0 + """Nothing enabled""" + TELEMETRY_ENVIRONMENT_MEASUREMENT: TelemetryConfig.Flags.ValueType # 1 + """Collect environment measurements""" + TELEMETRY_ENVIRONMENT_SCREEN: TelemetryConfig.Flags.ValueType # 2 + """Show environment measurements on the device screen""" + TELEMETRY_AIR_QUALITY: TelemetryConfig.Flags.ValueType # 8 + """Collect air quality metrics""" + TELEMETRY_AIR_QUALITY_SCREEN: TelemetryConfig.Flags.ValueType # 16 + """Show air quality metrics on the device screen""" + TELEMETRY_POWER_MEASUREMENT: TelemetryConfig.Flags.ValueType # 32 + """Collect power metrics""" + TELEMETRY_POWER_SCREEN: TelemetryConfig.Flags.ValueType # 64 + """Show power metrics on the device screen""" + TELEMETRY_HEALTH_MEASUREMENT: TelemetryConfig.Flags.ValueType # 128 + """Collect health metrics""" + TELEMETRY_HEALTH_SCREEN: TelemetryConfig.Flags.ValueType # 256 + """Show health metrics on the device screen""" + TELEMETRY_DEVICE: TelemetryConfig.Flags.ValueType # 512 + """ + Send device telemetry to the mesh. Telemetry still goes to the connected + phone or client over the API every minute regardless. + """ + + FLAGS_FIELD_NUMBER: _builtins.int + DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + SENSOR_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + device_update_interval: _builtins.int + """ + Interval in seconds of how often we should try to send our + device metrics to the mesh + """ + sensor_update_interval: _builtins.int + """ + Interval in seconds of how often we should try to send sensor readings to the + mesh. One interval covers every sensor category, since they now travel together + in a single SensorReadings list rather than one packet per category. + Which categories are collected at all is set by the flags above. + """ + def __init__( + self, + *, + flags: _builtins.int = ..., + device_update_interval: _builtins.int = ..., + sensor_update_interval: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_update_interval", b"device_update_interval", "flags", b"flags", "sensor_update_interval", b"sensor_update_interval"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___TelemetryConfig: _TypeAlias = TelemetryConfig # noqa: Y015 + +@_typing.final +class CannedMessageConfig(_message.Message): + """ + Canned Messages Module Config + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[CannedMessageConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CANNEDMSG_NONE: CannedMessageConfig._Flags.ValueType # 0 + """Nothing enabled""" + CANNEDMSG_ROTARY1: CannedMessageConfig._Flags.ValueType # 1 """ - def __init__( - self, - *, - node_status: builtins.str = ..., - ) -> 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 + Enable rotary encoder #1: a 'dumb' encoder sending pulses on both A and B + pins while rotating. """ - No options enabled. + CANNEDMSG_UPDOWN1: CannedMessageConfig._Flags.ValueType # 2 """ - FLAG_LISTEN_ENABLED: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 1 + Enable the Up/Down/Select input device. Can be a RAK rotary encoder or three + buttons, using the a/b/press definitions from inputbroker. """ - 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. + CANNEDMSG_SEND_BELL: CannedMessageConfig._Flags.ValueType # 4 """ - FLAG_BROADCAST_ENABLED: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 2 + Also send a bell character with the messages, which + ExternalNotificationModule can act on. """ - Enable periodically broadcasting MESH_BEACON_APP packets from this node. + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - FLAG_LEGACY_SPLIT: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 4 + Canned message input toggles: a bitwise OR of Flags values. """ - 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: ... + CANNEDMSG_NONE: CannedMessageConfig.Flags.ValueType # 0 + """Nothing enabled""" + CANNEDMSG_ROTARY1: CannedMessageConfig.Flags.ValueType # 1 + """ + Enable rotary encoder #1: a 'dumb' encoder sending pulses on both A and B + pins while rotating. + """ + CANNEDMSG_UPDOWN1: CannedMessageConfig.Flags.ValueType # 2 + """ + Enable the Up/Down/Select input device. Can be a RAK rotary encoder or three + buttons, using the a/b/press definitions from inputbroker. + """ + CANNEDMSG_SEND_BELL: CannedMessageConfig.Flags.ValueType # 4 + """ + Also send a bell character with the messages, which + ExternalNotificationModule can act on. + """ - @typing.final - class TAKConfig(google.protobuf.message.Message): - """ - TAK team/role configuration - """ + FLAGS_FIELD_NUMBER: _builtins.int + INPUTBROKER_PIN_A_FIELD_NUMBER: _builtins.int + INPUTBROKER_PIN_B_FIELD_NUMBER: _builtins.int + INPUTBROKER_PIN_PRESS_FIELD_NUMBER: _builtins.int + INPUTBROKER_EVENT_CW_FIELD_NUMBER: _builtins.int + INPUTBROKER_EVENT_CCW_FIELD_NUMBER: _builtins.int + INPUTBROKER_EVENT_PRESS_FIELD_NUMBER: _builtins.int + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + inputbroker_pin_a: _builtins.int + """ + GPIO pin for rotary encoder A port. + """ + inputbroker_pin_b: _builtins.int + """ + GPIO pin for rotary encoder B port. + """ + inputbroker_pin_press: _builtins.int + """ + GPIO pin for rotary encoder Press port. + """ + inputbroker_event_cw: _common_pb2.InputBrokerEvent.ValueType + """ + Generate input event on CW of this kind. + """ + inputbroker_event_ccw: _common_pb2.InputBrokerEvent.ValueType + """ + Generate input event on CCW of this kind. + """ + inputbroker_event_press: _common_pb2.InputBrokerEvent.ValueType + """ + Generate input event on Press of this kind. + """ + def __init__( + self, + *, + flags: _builtins.int = ..., + inputbroker_pin_a: _builtins.int = ..., + inputbroker_pin_b: _builtins.int = ..., + inputbroker_pin_press: _builtins.int = ..., + inputbroker_event_cw: _common_pb2.InputBrokerEvent.ValueType = ..., + inputbroker_event_ccw: _common_pb2.InputBrokerEvent.ValueType = ..., + inputbroker_event_press: _common_pb2.InputBrokerEvent.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "inputbroker_event_ccw", b"inputbroker_event_ccw", "inputbroker_event_cw", b"inputbroker_event_cw", "inputbroker_event_press", b"inputbroker_event_press", "inputbroker_pin_a", b"inputbroker_pin_a", "inputbroker_pin_b", b"inputbroker_pin_b", "inputbroker_pin_press", b"inputbroker_pin_press"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - DESCRIPTOR: google.protobuf.descriptor.Descriptor +Global___CannedMessageConfig: _TypeAlias = CannedMessageConfig # noqa: Y015 - TEAM_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - team: meshtastic.protobuf.atak_pb2.Team.ValueType - """ - Team color. - Default Unspecifed_Color -> firmware uses Cyan - """ - role: meshtastic.protobuf.atak_pb2.MemberRole.ValueType - """ - Member role. - Default Unspecifed -> firmware uses TeamMember - """ - def __init__( - self, - *, - team: meshtastic.protobuf.atak_pb2.Team.ValueType = ..., - role: meshtastic.protobuf.atak_pb2.MemberRole.ValueType = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["role", b"role", "team", b"team"]) -> None: ... +@_typing.final +class AmbientLightingConfig(_message.Message): + """ + Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels. + Initially created for the RAK14001 RGB LED module. + """ - MQTT_FIELD_NUMBER: builtins.int - SERIAL_FIELD_NUMBER: builtins.int - EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int - STORE_FORWARD_FIELD_NUMBER: builtins.int - RANGE_TEST_FIELD_NUMBER: builtins.int - TELEMETRY_FIELD_NUMBER: builtins.int - CANNED_MESSAGE_FIELD_NUMBER: builtins.int - AUDIO_FIELD_NUMBER: builtins.int - REMOTE_HARDWARE_FIELD_NUMBER: builtins.int - NEIGHBOR_INFO_FIELD_NUMBER: builtins.int - AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int - DETECTION_SENSOR_FIELD_NUMBER: builtins.int - PAXCOUNTER_FIELD_NUMBER: builtins.int - 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: - """ - TODO: REPLACE - """ + DESCRIPTOR: _descriptor.Descriptor - @property - def serial(self) -> global___ModuleConfig.SerialConfig: - """ - TODO: REPLACE - """ + LED_STATE_FIELD_NUMBER: _builtins.int + CURRENT_FIELD_NUMBER: _builtins.int + RED_FIELD_NUMBER: _builtins.int + GREEN_FIELD_NUMBER: _builtins.int + BLUE_FIELD_NUMBER: _builtins.int + led_state: _builtins.bool + """ + Sets LED to on or off. + """ + current: _builtins.int + """ + Sets the current for the LED output. Default is 10. + """ + red: _builtins.int + """ + Sets the red LED level. Values are 0-255. + """ + green: _builtins.int + """ + Sets the green LED level. Values are 0-255. + """ + blue: _builtins.int + """ + Sets the blue LED level. Values are 0-255. + """ + def __init__( + self, + *, + led_state: _builtins.bool = ..., + current: _builtins.int = ..., + red: _builtins.int = ..., + green: _builtins.int = ..., + blue: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["blue", b"blue", "current", b"current", "green", b"green", "led_state", b"led_state", "red", b"red"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @property - def external_notification(self) -> global___ModuleConfig.ExternalNotificationConfig: - """ - TODO: REPLACE - """ +Global___AmbientLightingConfig: _TypeAlias = AmbientLightingConfig # noqa: Y015 - @property - def store_forward(self) -> global___ModuleConfig.StoreForwardConfig: - """ - TODO: REPLACE - """ +@_typing.final +class StatusMessageConfig(_message.Message): + """ + StatusMessage config - Allows setting a status message for a node to periodically rebroadcast + """ - @property - def range_test(self) -> global___ModuleConfig.RangeTestConfig: - """ - TODO: REPLACE - """ + DESCRIPTOR: _descriptor.Descriptor - @property - def telemetry(self) -> global___ModuleConfig.TelemetryConfig: - """ - TODO: REPLACE - """ + NODE_STATUS_FIELD_NUMBER: _builtins.int + node_status: _builtins.str + """ + The actual status string + """ + def __init__( + self, + *, + node_status: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["node_status", b"node_status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___StatusMessageConfig: _TypeAlias = StatusMessageConfig # noqa: Y015 + +@_typing.final +class MeshBeaconConfig(_message.Message): + """ + MeshBeacon module config + """ + + DESCRIPTOR: _descriptor.Descriptor - @property - def canned_message(self) -> global___ModuleConfig.CannedMessageConfig: + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MeshBeaconConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + FLAG_NONE: MeshBeaconConfig._Flags.ValueType # 0 """ - TODO: REPLACE + No options enabled. """ - - @property - def audio(self) -> global___ModuleConfig.AudioConfig: + FLAG_LISTEN_ENABLED: MeshBeaconConfig._Flags.ValueType # 1 """ - TODO: REPLACE + 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. """ - - @property - def remote_hardware(self) -> global___ModuleConfig.RemoteHardwareConfig: + FLAG_BROADCAST_ENABLED: MeshBeaconConfig._Flags.ValueType # 2 """ - TODO: REPLACE + Enable periodically broadcasting MESH_BEACON_APP packets from this node. """ - - @property - def neighbor_info(self) -> global___ModuleConfig.NeighborInfoConfig: + FLAG_TEXT_SPLIT: MeshBeaconConfig._Flags.ValueType # 4 """ - TODO: REPLACE + 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 a receiver + that only decodes TEXT_MESSAGE_APP still gets the human-readable text. """ - @property - def ambient_lighting(self) -> global___ModuleConfig.AmbientLightingConfig: + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - TODO: REPLACE + 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. """ - @property - def detection_sensor(self) -> global___ModuleConfig.DetectionSensorConfig: + FLAG_NONE: MeshBeaconConfig.Flags.ValueType # 0 + """ + No options enabled. + """ + FLAG_LISTEN_ENABLED: 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: MeshBeaconConfig.Flags.ValueType # 2 + """ + Enable periodically broadcasting MESH_BEACON_APP packets from this node. + """ + FLAG_TEXT_SPLIT: 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 a receiver + that only decodes TEXT_MESSAGE_APP still gets the human-readable text. + """ + + @_typing.final + class BroadcastTarget(_message.Message): """ - TODO: REPLACE + One entry in the broadcast destination list. + Each entry names one set of radio settings to send a beacon copy on. """ - @property - def paxcounter(self) -> global___ModuleConfig.PaxcounterConfig: + DESCRIPTOR: _descriptor.Descriptor + + PRESET_FIELD_NUMBER: _builtins.int + REGION_FIELD_NUMBER: _builtins.int + CHANNEL_INDEX_FIELD_NUMBER: _builtins.int + preset: _common_pb2.ModemPreset.ValueType """ - TODO: REPLACE + Modem preset to use for this target. + Falls back to the running config preset if unset. """ - - @property - def statusmessage(self) -> global___ModuleConfig.StatusMessageConfig: + region: _common_pb2.RegionCode.ValueType """ - TODO: REPLACE + Region to use for this target. REGION_UNSET means use the running config region. """ - - @property - def traffic_management(self) -> global___ModuleConfig.TrafficManagementConfig: + channel_index: _builtins.int """ - Traffic management module config for mesh network optimization + 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. """ - - @property - def tak(self) -> global___ModuleConfig.TAKConfig: + def __init__( + self, + *, + preset: _common_pb2.ModemPreset.ValueType | None = ..., + region: _common_pb2.RegionCode.ValueType = ..., + channel_index: _builtins.int | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_channel_index", b"_channel_index", "_preset", b"_preset", "channel_index", b"channel_index", "preset", b"preset"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_channel_index", b"_channel_index", "_preset", b"_preset", "channel_index", b"channel_index", "preset", b"preset", "region", b"region"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__channel_index: _TypeAlias = _typing.Literal["channel_index"] # noqa: Y015 + _WhichOneofArgType__channel_index: _TypeAlias = _typing.Literal["_channel_index", b"_channel_index"] # noqa: Y015 + _WhichOneofReturnType__preset: _TypeAlias = _typing.Literal["preset"] # noqa: Y015 + _WhichOneofArgType__preset: _TypeAlias = _typing.Literal["_preset", b"_preset"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_index) -> _WhichOneofReturnType__channel_index | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__preset) -> _WhichOneofReturnType__preset | None: ... + + FLAGS_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 and text-split toggles). + """ + broadcast_message: _builtins.str + """ + Message to include in each beacon broadcast. Max 100 bytes enforced by firmware. + """ + broadcast_offer_region: _common_pb2.RegionCode.ValueType + """ + Optional region to advertise in the MeshBeacon offer_region field. + """ + broadcast_offer_preset: _common_pb2.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. + """ + @_builtins.property + def broadcast_offer_channel(self) -> _channel_pb2.ChannelSettings: """ - TAK team/role configuration for TAK_TRACKER + Optional channel (name + PSK) to advertise in the MeshBeacon offer_channel field. """ - @property - def mesh_beacon(self) -> global___ModuleConfig.MeshBeaconConfig: + @_builtins.property + def broadcast_targets(self) -> _containers.RepeatedCompositeFieldContainer[Global___MeshBeaconConfig.BroadcastTarget]: """ - MeshBeacon module config + 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, *, - mqtt: global___ModuleConfig.MQTTConfig | None = ..., - serial: global___ModuleConfig.SerialConfig | None = ..., - external_notification: global___ModuleConfig.ExternalNotificationConfig | None = ..., - store_forward: global___ModuleConfig.StoreForwardConfig | None = ..., - range_test: global___ModuleConfig.RangeTestConfig | None = ..., - telemetry: global___ModuleConfig.TelemetryConfig | None = ..., - canned_message: global___ModuleConfig.CannedMessageConfig | None = ..., - audio: global___ModuleConfig.AudioConfig | None = ..., - remote_hardware: global___ModuleConfig.RemoteHardwareConfig | None = ..., - neighbor_info: global___ModuleConfig.NeighborInfoConfig | None = ..., - ambient_lighting: global___ModuleConfig.AmbientLightingConfig | None = ..., - detection_sensor: global___ModuleConfig.DetectionSensorConfig | None = ..., - paxcounter: global___ModuleConfig.PaxcounterConfig | None = ..., - statusmessage: global___ModuleConfig.StatusMessageConfig | None = ..., - traffic_management: global___ModuleConfig.TrafficManagementConfig | None = ..., - tak: global___ModuleConfig.TAKConfig | None = ..., - mesh_beacon: global___ModuleConfig.MeshBeaconConfig | None = ..., + flags: _builtins.int = ..., + broadcast_message: _builtins.str = ..., + broadcast_offer_channel: _channel_pb2.ChannelSettings | None = ..., + broadcast_offer_region: _common_pb2.RegionCode.ValueType = ..., + broadcast_offer_preset: _common_pb2.ModemPreset.ValueType | None = ..., + broadcast_interval_secs: _builtins.int = ..., + broadcast_targets: _abc.Iterable[Global___MeshBeaconConfig.BroadcastTarget] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_offer_preset", b"_broadcast_offer_preset", "broadcast_offer_channel", b"broadcast_offer_channel", "broadcast_offer_preset", b"broadcast_offer_preset"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_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_preset", b"broadcast_offer_preset", "broadcast_offer_region", b"broadcast_offer_region", "broadcast_targets", b"broadcast_targets", "flags", b"flags"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__broadcast_offer_preset: _TypeAlias = _typing.Literal["broadcast_offer_preset"] # noqa: Y015 + _WhichOneofArgType__broadcast_offer_preset: _TypeAlias = _typing.Literal["_broadcast_offer_preset", b"_broadcast_offer_preset"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__broadcast_offer_preset) -> _WhichOneofReturnType__broadcast_offer_preset | None: ... + +Global___MeshBeaconConfig: _TypeAlias = MeshBeaconConfig # noqa: Y015 + +@_typing.final +class TAKConfig(_message.Message): + """ + TAK team/role configuration + """ + + DESCRIPTOR: _descriptor.Descriptor + + TEAM_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + team: _atak_pb2.Team.ValueType + """ + Team color. + Default Unspecifed_Color -> firmware uses Cyan + """ + role: _atak_pb2.MemberRole.ValueType + """ + Member role. + Default Unspecifed -> firmware uses TeamMember + """ + def __init__( + self, + *, + team: _atak_pb2.Team.ValueType = ..., + role: _atak_pb2.MemberRole.ValueType = ..., ) -> 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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["role", b"role", "team", b"team"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ModuleConfig = ModuleConfig +Global___TAKConfig: _TypeAlias = TAKConfig # noqa: Y015 -@typing.final -class RemoteHardwarePin(google.protobuf.message.Message): +@_typing.final +class RemoteHardwarePin(_message.Message): """ A GPIO pin definition for remote hardware module """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - GPIO_PIN_FIELD_NUMBER: builtins.int - NAME_FIELD_NUMBER: builtins.int - TYPE_FIELD_NUMBER: builtins.int - gpio_pin: builtins.int + GPIO_PIN_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + TYPE_FIELD_NUMBER: _builtins.int + gpio_pin: _builtins.int """ - GPIO Pin number (must match Arduino) + GPIO pin number, 0 to 63, matching Arduino's numbering. The upper bound is + HardwareMessage.gpio_mask: a pin with no bit in a 64-bit mask cannot be addressed. """ - name: builtins.str + name: _builtins.str """ Name for the GPIO pin (i.e. Front gate, mailbox, etc) """ - type: global___RemoteHardwarePinType.ValueType + type: Global___RemoteHardwarePinType.ValueType """ Type of GPIO access available to consumers on the mesh """ def __init__( self, *, - gpio_pin: builtins.int = ..., - name: builtins.str = ..., - type: global___RemoteHardwarePinType.ValueType = ..., + gpio_pin: _builtins.int = ..., + name: _builtins.str = ..., + type: Global___RemoteHardwarePinType.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["gpio_pin", b"gpio_pin", "name", b"name", "type", b"type"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RemoteHardwarePin: _TypeAlias = RemoteHardwarePin # noqa: Y015 + +@_typing.final +class NodeRemoteHardwarePin(_message.Message): + """ + RemoteHardwarePins associated with a node + """ + + DESCRIPTOR: _descriptor.Descriptor + + NODE_NUM_FIELD_NUMBER: _builtins.int + PIN_FIELD_NUMBER: _builtins.int + node_num: _builtins.int + """ + The node_num exposing the available gpio pin + """ + @_builtins.property + def pin(self) -> Global___RemoteHardwarePin: + """ + The available gpio pin for usage with RemoteHardware module + """ + + def __init__( + self, + *, + node_num: _builtins.int = ..., + pin: Global___RemoteHardwarePin | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["gpio_pin", b"gpio_pin", "name", b"name", "type", b"type"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["pin", b"pin"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["node_num", b"node_num", "pin", b"pin"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___RemoteHardwarePin = RemoteHardwarePin +Global___NodeRemoteHardwarePin: _TypeAlias = NodeRemoteHardwarePin # noqa: Y015 + +@_typing.final +class ModuleConfigPayload(_message.Message): + """ + Wrapper message for admin transport of module configuration + """ + + DESCRIPTOR: _descriptor.Descriptor + + MQTT_FIELD_NUMBER: _builtins.int + SERIAL_FIELD_NUMBER: _builtins.int + EXTERNAL_NOTIFICATION_FIELD_NUMBER: _builtins.int + STORE_FORWARD_FIELD_NUMBER: _builtins.int + TELEMETRY_FIELD_NUMBER: _builtins.int + CANNED_MESSAGE_FIELD_NUMBER: _builtins.int + AUDIO_FIELD_NUMBER: _builtins.int + REMOTE_HARDWARE_FIELD_NUMBER: _builtins.int + NEIGHBOR_INFO_FIELD_NUMBER: _builtins.int + AMBIENT_LIGHTING_FIELD_NUMBER: _builtins.int + DETECTION_SENSOR_FIELD_NUMBER: _builtins.int + PAXCOUNTER_FIELD_NUMBER: _builtins.int + STATUSMESSAGE_FIELD_NUMBER: _builtins.int + TRAFFIC_MANAGEMENT_FIELD_NUMBER: _builtins.int + TAK_FIELD_NUMBER: _builtins.int + MESH_BEACON_FIELD_NUMBER: _builtins.int + @_builtins.property + def mqtt(self) -> Global___MQTTConfig: ... + @_builtins.property + def serial(self) -> Global___SerialConfig: ... + @_builtins.property + def external_notification(self) -> Global___ExternalNotificationConfig: ... + @_builtins.property + def store_forward(self) -> Global___StoreForwardConfig: ... + @_builtins.property + def telemetry(self) -> Global___TelemetryConfig: ... + @_builtins.property + def canned_message(self) -> Global___CannedMessageConfig: ... + @_builtins.property + def audio(self) -> Global___AudioConfig: ... + @_builtins.property + def remote_hardware(self) -> Global___RemoteHardwareConfig: ... + @_builtins.property + def neighbor_info(self) -> Global___NeighborInfoConfig: ... + @_builtins.property + def ambient_lighting(self) -> Global___AmbientLightingConfig: ... + @_builtins.property + def detection_sensor(self) -> Global___DetectionSensorConfig: ... + @_builtins.property + def paxcounter(self) -> Global___PaxcounterConfig: ... + @_builtins.property + def statusmessage(self) -> Global___StatusMessageConfig: ... + @_builtins.property + def traffic_management(self) -> Global___TrafficManagementConfig: ... + @_builtins.property + def tak(self) -> Global___TAKConfig: ... + @_builtins.property + def mesh_beacon(self) -> Global___MeshBeaconConfig: ... + def __init__( + self, + *, + mqtt: Global___MQTTConfig | None = ..., + serial: Global___SerialConfig | None = ..., + external_notification: Global___ExternalNotificationConfig | None = ..., + store_forward: Global___StoreForwardConfig | None = ..., + telemetry: Global___TelemetryConfig | None = ..., + canned_message: Global___CannedMessageConfig | None = ..., + audio: Global___AudioConfig | None = ..., + remote_hardware: Global___RemoteHardwareConfig | None = ..., + neighbor_info: Global___NeighborInfoConfig | None = ..., + ambient_lighting: Global___AmbientLightingConfig | None = ..., + detection_sensor: Global___DetectionSensorConfig | None = ..., + paxcounter: Global___PaxcounterConfig | None = ..., + statusmessage: Global___StatusMessageConfig | None = ..., + traffic_management: Global___TrafficManagementConfig | None = ..., + tak: Global___TAKConfig | None = ..., + mesh_beacon: Global___MeshBeaconConfig | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _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", "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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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", "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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["mqtt", "serial", "external_notification", "store_forward", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter", "statusmessage", "traffic_management", "tak", "mesh_beacon"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___ModuleConfigPayload: _TypeAlias = ModuleConfigPayload # noqa: Y015 diff --git a/meshtastic/protobuf/mqtt_pb2.py b/meshtastic/protobuf/mqtt_pb2.py index e606a4210..4908f956c 100644 --- a/meshtastic/protobuf/mqtt_pb2.py +++ b/meshtastic/protobuf/mqtt_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/mqtt.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,35 +12,35 @@ _sym_db = _symbol_database.Default() -from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 -from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 +from meshtastic.protobuf import common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import packet_pb2 as meshtastic_dot_protobuf_dot_packet__pb2 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mqtt.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/packet.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\"\xc3\x03\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\x19.meshtastic.protobuf.Role\x12\x10\n\x08hw_model\x18\x04 \x01(\r\x12\x1f\n\x10\x66irmware_version\x18\x05 \x01(\tB\x05\x92?\x02\x08\x12\x12/\n\x06region\x18\x06 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\x12\x36\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mqtt_pb2', _globals) 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\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 - _MAPREPORT.fields_by_name['firmware_version']._serialized_options = b'\222?\002\010\022' - _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=282 - _globals['_MAPREPORT']._serialized_start=285 - _globals['_MAPREPORT']._serialized_end=828 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_SERVICEENVELOPE'].fields_by_name['packet']._options = None + _globals['_SERVICEENVELOPE'].fields_by_name['packet']._serialized_options = b'\222?\002\030\004' + _globals['_SERVICEENVELOPE'].fields_by_name['channel_id']._options = None + _globals['_SERVICEENVELOPE'].fields_by_name['channel_id']._serialized_options = b'\222?\002\030\004' + _globals['_SERVICEENVELOPE'].fields_by_name['gateway_id']._options = None + _globals['_SERVICEENVELOPE'].fields_by_name['gateway_id']._serialized_options = b'\222?\002\030\004' + _globals['_MAPREPORT'].fields_by_name['long_name']._options = None + _globals['_MAPREPORT'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _globals['_MAPREPORT'].fields_by_name['short_name']._options = None + _globals['_MAPREPORT'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_MAPREPORT'].fields_by_name['firmware_version']._options = None + _globals['_MAPREPORT'].fields_by_name['firmware_version']._serialized_options = b'\222?\002\010\022' + _globals['_MAPREPORT'].fields_by_name['num_online_local_nodes']._options = None + _globals['_MAPREPORT'].fields_by_name['num_online_local_nodes']._serialized_options = b'\222?\0028\020' + _globals['_SERVICEENVELOPE']._serialized_start=157 + _globals['_SERVICEENVELOPE']._serialized_end=284 + _globals['_MAPREPORT']._serialized_start=287 + _globals['_MAPREPORT']._serialized_end=738 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mqtt_pb2.pyi b/meshtastic/protobuf/mqtt_pb2.pyi index 597fa0793..e24503bc4 100644 --- a/meshtastic/protobuf/mqtt_pb2.pyi +++ b/meshtastic/protobuf/mqtt_pb2.pyi @@ -3,38 +3,44 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import meshtastic.protobuf.config_pb2 -import meshtastic.protobuf.mesh_pb2 -import typing +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from . import common_pb2 as _common_pb2 +from . import packet_pb2 as _packet_pb2 +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -@typing.final -class ServiceEnvelope(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class ServiceEnvelope(_message.Message): """ This message wraps a MeshPacket with extra metadata about the sender and how it arrived. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - PACKET_FIELD_NUMBER: builtins.int - CHANNEL_ID_FIELD_NUMBER: builtins.int - GATEWAY_ID_FIELD_NUMBER: builtins.int - channel_id: builtins.str + PACKET_FIELD_NUMBER: _builtins.int + CHANNEL_ID_FIELD_NUMBER: _builtins.int + GATEWAY_ID_FIELD_NUMBER: _builtins.int + channel_id: _builtins.str """ The global channel ID it was sent on """ - gateway_id: builtins.str + gateway_id: _builtins.str """ The sending gateway node ID. Can we use this to authenticate/prevent fake nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as the globally trusted nodenum """ - @property - def packet(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket: + @_builtins.property + def packet(self) -> _packet_pb2.MeshPacket: """ The (probably encrypted) packet """ @@ -42,92 +48,95 @@ class ServiceEnvelope(google.protobuf.message.Message): def __init__( self, *, - packet: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ..., - channel_id: builtins.str = ..., - gateway_id: builtins.str = ..., + packet: _packet_pb2.MeshPacket | None = ..., + channel_id: _builtins.str = ..., + gateway_id: _builtins.str = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["packet", b"packet"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["channel_id", b"channel_id", "gateway_id", b"gateway_id", "packet", b"packet"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["packet", b"packet"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["channel_id", b"channel_id", "gateway_id", b"gateway_id", "packet", b"packet"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___ServiceEnvelope = ServiceEnvelope +Global___ServiceEnvelope: _TypeAlias = ServiceEnvelope # noqa: Y015 -@typing.final -class MapReport(google.protobuf.message.Message): +@_typing.final +class MapReport(_message.Message): """ Information about a node intended to be reported unencrypted to a map using MQTT. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - LONG_NAME_FIELD_NUMBER: builtins.int - SHORT_NAME_FIELD_NUMBER: builtins.int - ROLE_FIELD_NUMBER: builtins.int - HW_MODEL_FIELD_NUMBER: builtins.int - FIRMWARE_VERSION_FIELD_NUMBER: builtins.int - REGION_FIELD_NUMBER: builtins.int - MODEM_PRESET_FIELD_NUMBER: builtins.int - HAS_DEFAULT_CHANNEL_FIELD_NUMBER: builtins.int - LATITUDE_I_FIELD_NUMBER: builtins.int - LONGITUDE_I_FIELD_NUMBER: builtins.int - ALTITUDE_FIELD_NUMBER: builtins.int - POSITION_PRECISION_FIELD_NUMBER: builtins.int - NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: builtins.int - HAS_OPTED_REPORT_LOCATION_FIELD_NUMBER: builtins.int - long_name: builtins.str + LONG_NAME_FIELD_NUMBER: _builtins.int + SHORT_NAME_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + HW_MODEL_FIELD_NUMBER: _builtins.int + FIRMWARE_VERSION_FIELD_NUMBER: _builtins.int + REGION_FIELD_NUMBER: _builtins.int + MODEM_PRESET_FIELD_NUMBER: _builtins.int + HAS_DEFAULT_CHANNEL_FIELD_NUMBER: _builtins.int + LATITUDE_I_FIELD_NUMBER: _builtins.int + LONGITUDE_I_FIELD_NUMBER: _builtins.int + ALTITUDE_FIELD_NUMBER: _builtins.int + POSITION_PRECISION_FIELD_NUMBER: _builtins.int + NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: _builtins.int + HAS_OPTED_REPORT_LOCATION_FIELD_NUMBER: _builtins.int + long_name: _builtins.str """ A full name for this user, i.e. "Kevin Hester" """ - short_name: builtins.str + short_name: _builtins.str """ A VERY short name, ideally two characters. Suitable for a tiny OLED screen """ - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType + role: _common_pb2.Role.ValueType """ Role of the node that applies specific settings for a particular use-case """ - hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType + hw_model: _builtins.int """ - Hardware model of the node, i.e. T-Beam, Heltec V3, etc... + Hardware model, packed as (vendor_id << 8 | device_id) """ - firmware_version: builtins.str + firmware_version: _builtins.str """ Device firmware version string """ - region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType + region: _common_pb2.RegionCode.ValueType """ The region code for the radio (US, CN, EU433, etc...) """ - modem_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + modem_preset: _common_pb2.ModemPreset.ValueType """ Modem preset used by the radio (LongFast, MediumSlow, etc...) """ - has_default_channel: builtins.bool + has_default_channel: _builtins.bool """ Whether the node has a channel with default PSK and name (LongFast, MediumSlow, etc...) and it uses the default frequency slot given the region and modem preset. """ - latitude_i: builtins.int + latitude_i: _builtins.int """ Latitude: multiply by 1e-7 to get degrees in floating point """ - longitude_i: builtins.int + longitude_i: _builtins.int """ Longitude: multiply by 1e-7 to get degrees in floating point """ - altitude: builtins.int + altitude: _builtins.int """ Altitude in meters above MSL """ - position_precision: builtins.int + position_precision: _builtins.int """ Indicates the bits of precision for latitude and longitude set by the sending node """ - num_online_local_nodes: builtins.int + num_online_local_nodes: _builtins.int """ Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) """ - has_opted_report_location: builtins.bool + has_opted_report_location: _builtins.bool """ User has opted in to share their location (map report) with the mqtt server Controlled by map_report.should_report_location @@ -135,21 +144,25 @@ class MapReport(google.protobuf.message.Message): def __init__( self, *, - long_name: builtins.str = ..., - short_name: builtins.str = ..., - role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., - hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType = ..., - firmware_version: builtins.str = ..., - region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., - modem_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType = ..., - has_default_channel: builtins.bool = ..., - latitude_i: builtins.int = ..., - longitude_i: builtins.int = ..., - altitude: builtins.int = ..., - position_precision: builtins.int = ..., - num_online_local_nodes: builtins.int = ..., - has_opted_report_location: builtins.bool = ..., + long_name: _builtins.str = ..., + short_name: _builtins.str = ..., + role: _common_pb2.Role.ValueType = ..., + hw_model: _builtins.int = ..., + firmware_version: _builtins.str = ..., + region: _common_pb2.RegionCode.ValueType = ..., + modem_preset: _common_pb2.ModemPreset.ValueType = ..., + has_default_channel: _builtins.bool = ..., + latitude_i: _builtins.int = ..., + longitude_i: _builtins.int = ..., + altitude: _builtins.int = ..., + position_precision: _builtins.int = ..., + num_online_local_nodes: _builtins.int = ..., + has_opted_report_location: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "has_opted_report_location", b"has_opted_report_location", "hw_model", b"hw_model", "latitude_i", b"latitude_i", "long_name", b"long_name", "longitude_i", b"longitude_i", "modem_preset", b"modem_preset", "num_online_local_nodes", b"num_online_local_nodes", "position_precision", b"position_precision", "region", b"region", "role", b"role", "short_name", b"short_name"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "has_opted_report_location", b"has_opted_report_location", "hw_model", b"hw_model", "latitude_i", b"latitude_i", "long_name", b"long_name", "longitude_i", b"longitude_i", "modem_preset", b"modem_preset", "num_online_local_nodes", b"num_online_local_nodes", "position_precision", b"position_precision", "region", b"region", "role", b"role", "short_name", b"short_name"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___MapReport = MapReport +Global___MapReport: _TypeAlias = MapReport # noqa: Y015 diff --git a/meshtastic/protobuf/nanopb_pb2.py b/meshtastic/protobuf/nanopb_pb2.py index 797b8a078..3dfb26fc9 100644 --- a/meshtastic/protobuf/nanopb_pb2.py +++ b/meshtastic/protobuf/nanopb_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/nanopb.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -20,8 +21,8 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.nanopb_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated' _globals['_FIELDTYPE']._serialized_start=1005 _globals['_FIELDTYPE']._serialized_end=1110 _globals['_INTSIZE']._serialized_start=1112 diff --git a/meshtastic/protobuf/nanopb_pb2.pyi b/meshtastic/protobuf/nanopb_pb2.pyi index c5d7d87a0..fb6435fcb 100644 --- a/meshtastic/protobuf/nanopb_pb2.pyi +++ b/meshtastic/protobuf/nanopb_pb2.pyi @@ -9,30 +9,30 @@ These are used by nanopb to generate statically allocable structures for memory-limited environments. """ -import builtins -import collections.abc -import google.protobuf.descriptor -import google.protobuf.descriptor_pb2 -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.internal.extension_dict -import google.protobuf.message +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pb2 as _descriptor_pb2 +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf.internal import extension_dict as _extension_dict +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _FieldType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _FieldTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FieldType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _FieldTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_FieldType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor FT_DEFAULT: _FieldType.ValueType # 0 """Automatically decide field type, generate static field if possible.""" FT_CALLBACK: _FieldType.ValueType # 1 @@ -60,14 +60,14 @@ FT_IGNORE: FieldType.ValueType # 3 """Ignore the field completely.""" FT_INLINE: FieldType.ValueType # 5 """Legacy option, use the separate 'fixed_length' option instead""" -global___FieldType = FieldType +Global___FieldType: _TypeAlias = FieldType # noqa: Y015 class _IntSize: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _IntSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_IntSize.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _IntSizeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_IntSize.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor IS_DEFAULT: _IntSize.ValueType # 0 """Default, 32/64bit based on type in .proto""" IS_8: _IntSize.ValueType # 8 @@ -83,14 +83,14 @@ IS_8: IntSize.ValueType # 8 IS_16: IntSize.ValueType # 16 IS_32: IntSize.ValueType # 32 IS_64: IntSize.ValueType # 64 -global___IntSize = IntSize +Global___IntSize: _TypeAlias = IntSize # noqa: Y015 class _TypenameMangling: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _TypenameManglingEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TypenameMangling.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _TypenameManglingEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_TypenameMangling.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor M_NONE: _TypenameMangling.ValueType # 0 """Default, no typename mangling""" M_STRIP_PACKAGE: _TypenameMangling.ValueType # 1 @@ -110,14 +110,14 @@ M_FLATTEN: TypenameMangling.ValueType # 2 """Only use last path component""" M_PACKAGE_INITIALS: TypenameMangling.ValueType # 3 """Replace the package name by the initials""" -global___TypenameMangling = TypenameMangling +Global___TypenameMangling: _TypeAlias = TypenameMangling # noqa: Y015 class _DescriptorSize: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _DescriptorSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_DescriptorSize.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _DescriptorSizeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_DescriptorSize.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor DS_AUTO: _DescriptorSize.ValueType # 0 """Select minimal size based on field type""" DS_1: _DescriptorSize.ValueType # 1 @@ -141,137 +141,137 @@ DS_4: DescriptorSize.ValueType # 4 """4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays""" DS_8: DescriptorSize.ValueType # 8 """8 words; up to 2^32-1 entry arrays""" -global___DescriptorSize = DescriptorSize +Global___DescriptorSize: _TypeAlias = DescriptorSize # noqa: Y015 -@typing.final -class NanoPBOptions(google.protobuf.message.Message): +@_typing.final +class NanoPBOptions(_message.Message): """This is the inner options message, which basically defines options for a field. When it is used in message or file scope, it applies to all fields. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - MAX_SIZE_FIELD_NUMBER: builtins.int - MAX_LENGTH_FIELD_NUMBER: builtins.int - MAX_COUNT_FIELD_NUMBER: builtins.int - INT_SIZE_FIELD_NUMBER: builtins.int - TYPE_FIELD_NUMBER: builtins.int - LONG_NAMES_FIELD_NUMBER: builtins.int - PACKED_STRUCT_FIELD_NUMBER: builtins.int - PACKED_ENUM_FIELD_NUMBER: builtins.int - SKIP_MESSAGE_FIELD_NUMBER: builtins.int - NO_UNIONS_FIELD_NUMBER: builtins.int - MSGID_FIELD_NUMBER: builtins.int - ANONYMOUS_ONEOF_FIELD_NUMBER: builtins.int - PROTO3_FIELD_NUMBER: builtins.int - PROTO3_SINGULAR_MSGS_FIELD_NUMBER: builtins.int - ENUM_TO_STRING_FIELD_NUMBER: builtins.int - FIXED_LENGTH_FIELD_NUMBER: builtins.int - FIXED_COUNT_FIELD_NUMBER: builtins.int - SUBMSG_CALLBACK_FIELD_NUMBER: builtins.int - MANGLE_NAMES_FIELD_NUMBER: builtins.int - CALLBACK_DATATYPE_FIELD_NUMBER: builtins.int - CALLBACK_FUNCTION_FIELD_NUMBER: builtins.int - DESCRIPTORSIZE_FIELD_NUMBER: builtins.int - DEFAULT_HAS_FIELD_NUMBER: builtins.int - INCLUDE_FIELD_NUMBER: builtins.int - EXCLUDE_FIELD_NUMBER: builtins.int - PACKAGE_FIELD_NUMBER: builtins.int - TYPE_OVERRIDE_FIELD_NUMBER: builtins.int - SORT_BY_TAG_FIELD_NUMBER: builtins.int - FALLBACK_TYPE_FIELD_NUMBER: builtins.int - max_size: builtins.int + MAX_SIZE_FIELD_NUMBER: _builtins.int + MAX_LENGTH_FIELD_NUMBER: _builtins.int + MAX_COUNT_FIELD_NUMBER: _builtins.int + INT_SIZE_FIELD_NUMBER: _builtins.int + TYPE_FIELD_NUMBER: _builtins.int + LONG_NAMES_FIELD_NUMBER: _builtins.int + PACKED_STRUCT_FIELD_NUMBER: _builtins.int + PACKED_ENUM_FIELD_NUMBER: _builtins.int + SKIP_MESSAGE_FIELD_NUMBER: _builtins.int + NO_UNIONS_FIELD_NUMBER: _builtins.int + MSGID_FIELD_NUMBER: _builtins.int + ANONYMOUS_ONEOF_FIELD_NUMBER: _builtins.int + PROTO3_FIELD_NUMBER: _builtins.int + PROTO3_SINGULAR_MSGS_FIELD_NUMBER: _builtins.int + ENUM_TO_STRING_FIELD_NUMBER: _builtins.int + FIXED_LENGTH_FIELD_NUMBER: _builtins.int + FIXED_COUNT_FIELD_NUMBER: _builtins.int + SUBMSG_CALLBACK_FIELD_NUMBER: _builtins.int + MANGLE_NAMES_FIELD_NUMBER: _builtins.int + CALLBACK_DATATYPE_FIELD_NUMBER: _builtins.int + CALLBACK_FUNCTION_FIELD_NUMBER: _builtins.int + DESCRIPTORSIZE_FIELD_NUMBER: _builtins.int + DEFAULT_HAS_FIELD_NUMBER: _builtins.int + INCLUDE_FIELD_NUMBER: _builtins.int + EXCLUDE_FIELD_NUMBER: _builtins.int + PACKAGE_FIELD_NUMBER: _builtins.int + TYPE_OVERRIDE_FIELD_NUMBER: _builtins.int + SORT_BY_TAG_FIELD_NUMBER: _builtins.int + FALLBACK_TYPE_FIELD_NUMBER: _builtins.int + max_size: _builtins.int """Allocated size for 'bytes' and 'string' fields. For string fields, this should include the space for null terminator. """ - max_length: builtins.int + max_length: _builtins.int """Maximum length for 'string' fields. Setting this is equivalent to setting max_size to a value of length+1. """ - max_count: builtins.int + max_count: _builtins.int """Allocated number of entries in arrays ('repeated' fields)""" - int_size: global___IntSize.ValueType + int_size: Global___IntSize.ValueType """Size of integer fields. Can save some memory if you don't need full 32 bits for the value. """ - type: global___FieldType.ValueType + type: Global___FieldType.ValueType """Force type of field (callback or static allocation)""" - long_names: builtins.bool + long_names: _builtins.bool """Use long names for enums, i.e. EnumName_EnumValue.""" - packed_struct: builtins.bool + packed_struct: _builtins.bool """Add 'packed' attribute to generated structs. Note: this cannot be used on CPUs that break on unaligned accesses to variables. """ - packed_enum: builtins.bool + packed_enum: _builtins.bool """Add 'packed' attribute to generated enums.""" - skip_message: builtins.bool + skip_message: _builtins.bool """Skip this message""" - no_unions: builtins.bool + no_unions: _builtins.bool """Generate oneof fields as normal optional fields instead of union.""" - msgid: builtins.int + msgid: _builtins.int """integer type tag for a message""" - anonymous_oneof: builtins.bool + anonymous_oneof: _builtins.bool """decode oneof as anonymous union""" - proto3: builtins.bool + proto3: _builtins.bool """Proto3 singular field does not generate a "has_" flag""" - proto3_singular_msgs: builtins.bool + proto3_singular_msgs: _builtins.bool """Force proto3 messages to have no "has_" flag. This was default behavior until nanopb-0.4.0. """ - enum_to_string: builtins.bool + enum_to_string: _builtins.bool """Generate an enum->string mapping function (can take up lots of space).""" - fixed_length: builtins.bool + fixed_length: _builtins.bool """Generate bytes arrays with fixed length""" - fixed_count: builtins.bool + fixed_count: _builtins.bool """Generate repeated field with fixed count""" - submsg_callback: builtins.bool + submsg_callback: _builtins.bool """Generate message-level callback that is called before decoding submessages. This can be used to set callback fields for submsgs inside oneofs. """ - mangle_names: global___TypenameMangling.ValueType + mangle_names: Global___TypenameMangling.ValueType """Shorten or remove package names from type names. This option applies only on the file level. """ - callback_datatype: builtins.str + callback_datatype: _builtins.str """Data type for storage associated with callback fields.""" - callback_function: builtins.str + callback_function: _builtins.str """Callback function used for encoding and decoding. Prior to nanopb-0.4.0, the callback was specified in per-field pb_callback_t structure. This is still supported, but does not work inside e.g. oneof or pointer fields. Instead, a new method allows specifying a per-message callback that will be called for all callback fields in a message type. """ - descriptorsize: global___DescriptorSize.ValueType + descriptorsize: Global___DescriptorSize.ValueType """Select the size of field descriptors. This option has to be defined for the whole message, not per-field. Usually automatic selection is ok, but if it results in compilation errors you can increase the field size here. """ - default_has: builtins.bool + default_has: _builtins.bool """Set default value for has_ fields.""" - package: builtins.str + package: _builtins.str """Package name that applies only for nanopb.""" - type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType + type_override: _descriptor_pb2.FieldDescriptorProto.Type.ValueType """Override type of the field in generated C code. Only to be used with related field types""" - sort_by_tag: builtins.bool + sort_by_tag: _builtins.bool """Due to historical reasons, nanopb orders fields in structs by their tag number instead of the order in .proto. Set this to false to keep the .proto order. The default value will probably change to false in nanopb-0.5.0. """ - fallback_type: global___FieldType.ValueType + fallback_type: Global___FieldType.ValueType """Set the FT_DEFAULT field conversion strategy. A field that can become a static member of a c struct (e.g. int, bool, etc) will be a a static field. Fields with dynamic length are converted to either a pointer or a callback. """ - @property - def include(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + @_builtins.property + def include(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: """Extra files to include in generated `.pb.h`""" - @property - def exclude(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + @_builtins.property + def exclude(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: """Automatic includes to exclude from generated `.pb.h` Same as nanopb_generator.py command line flag -x. """ @@ -279,46 +279,49 @@ class NanoPBOptions(google.protobuf.message.Message): def __init__( self, *, - max_size: builtins.int | None = ..., - max_length: builtins.int | None = ..., - max_count: builtins.int | None = ..., - int_size: global___IntSize.ValueType | None = ..., - type: global___FieldType.ValueType | None = ..., - long_names: builtins.bool | None = ..., - packed_struct: builtins.bool | None = ..., - packed_enum: builtins.bool | None = ..., - skip_message: builtins.bool | None = ..., - no_unions: builtins.bool | None = ..., - msgid: builtins.int | None = ..., - anonymous_oneof: builtins.bool | None = ..., - proto3: builtins.bool | None = ..., - proto3_singular_msgs: builtins.bool | None = ..., - enum_to_string: builtins.bool | None = ..., - fixed_length: builtins.bool | None = ..., - fixed_count: builtins.bool | None = ..., - submsg_callback: builtins.bool | None = ..., - mangle_names: global___TypenameMangling.ValueType | None = ..., - callback_datatype: builtins.str | None = ..., - callback_function: builtins.str | None = ..., - descriptorsize: global___DescriptorSize.ValueType | None = ..., - default_has: builtins.bool | None = ..., - include: collections.abc.Iterable[builtins.str] | None = ..., - exclude: collections.abc.Iterable[builtins.str] | None = ..., - package: builtins.str | None = ..., - type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType | None = ..., - sort_by_tag: builtins.bool | None = ..., - fallback_type: global___FieldType.ValueType | None = ..., + max_size: _builtins.int | None = ..., + max_length: _builtins.int | None = ..., + max_count: _builtins.int | None = ..., + int_size: Global___IntSize.ValueType | None = ..., + type: Global___FieldType.ValueType | None = ..., + long_names: _builtins.bool | None = ..., + packed_struct: _builtins.bool | None = ..., + packed_enum: _builtins.bool | None = ..., + skip_message: _builtins.bool | None = ..., + no_unions: _builtins.bool | None = ..., + msgid: _builtins.int | None = ..., + anonymous_oneof: _builtins.bool | None = ..., + proto3: _builtins.bool | None = ..., + proto3_singular_msgs: _builtins.bool | None = ..., + enum_to_string: _builtins.bool | None = ..., + fixed_length: _builtins.bool | None = ..., + fixed_count: _builtins.bool | None = ..., + submsg_callback: _builtins.bool | None = ..., + mangle_names: Global___TypenameMangling.ValueType | None = ..., + callback_datatype: _builtins.str | None = ..., + callback_function: _builtins.str | None = ..., + descriptorsize: Global___DescriptorSize.ValueType | None = ..., + default_has: _builtins.bool | None = ..., + include: _abc.Iterable[_builtins.str] | None = ..., + exclude: _abc.Iterable[_builtins.str] | None = ..., + package: _builtins.str | None = ..., + type_override: _descriptor_pb2.FieldDescriptorProto.Type.ValueType | None = ..., + sort_by_tag: _builtins.bool | None = ..., + fallback_type: Global___FieldType.ValueType | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "exclude", b"exclude", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "include", b"include", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "exclude", b"exclude", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "include", b"include", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___NanoPBOptions = NanoPBOptions +Global___NanoPBOptions: _TypeAlias = NanoPBOptions # noqa: Y015 -NANOPB_FILEOPT_FIELD_NUMBER: builtins.int -NANOPB_MSGOPT_FIELD_NUMBER: builtins.int -NANOPB_ENUMOPT_FIELD_NUMBER: builtins.int -NANOPB_FIELD_NUMBER: builtins.int -nanopb_fileopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FileOptions, global___NanoPBOptions] -nanopb_msgopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.MessageOptions, global___NanoPBOptions] -nanopb_enumopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.EnumOptions, global___NanoPBOptions] -nanopb: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FieldOptions, global___NanoPBOptions] +NANOPB_FILEOPT_FIELD_NUMBER: _builtins.int +NANOPB_MSGOPT_FIELD_NUMBER: _builtins.int +NANOPB_ENUMOPT_FIELD_NUMBER: _builtins.int +NANOPB_FIELD_NUMBER: _builtins.int +nanopb_fileopt: _extension_dict._ExtensionFieldDescriptor[_descriptor_pb2.FileOptions, Global___NanoPBOptions] +nanopb_msgopt: _extension_dict._ExtensionFieldDescriptor[_descriptor_pb2.MessageOptions, Global___NanoPBOptions] +nanopb_enumopt: _extension_dict._ExtensionFieldDescriptor[_descriptor_pb2.EnumOptions, Global___NanoPBOptions] +nanopb: _extension_dict._ExtensionFieldDescriptor[_descriptor_pb2.FieldOptions, Global___NanoPBOptions] diff --git a/meshtastic/protobuf/packet_pb2.py b/meshtastic/protobuf/packet_pb2.py new file mode 100644 index 000000000..6caf5d6e8 --- /dev/null +++ b/meshtastic/protobuf/packet_pb2.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/packet.proto +# Protobuf Python Version: 4.25.1 +"""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 wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/packet.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\x8e\x0b\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\n\n\x02id\x18\x03 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12,\n\x07\x64\x65\x63oded\x18\x05 \x01(\x0b\x32\x19.meshtastic.protobuf.DataH\x00\x12\x1b\n\tencrypted\x18\x06 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02H\x00\x12\x14\n\x05\x66lags\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\thop_limit\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\thop_start\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08next_hop\x18\n \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nrelay_node\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x07rx_time\x18\x0c \x01(\x07H\x01\x88\x01\x01\x12\x0e\n\x06rx_snr\x18\r \x01(\x11\x12\x14\n\x07rx_rssi\x18\x0e \x01(\x11H\x02\x88\x01\x01\x12\x19\n\npublic_key\x18\x0f \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x41\n\x08priority\x18\x10 \x01(\x0e\x32(.meshtastic.protobuf.MeshPacket.PriorityB\x05\x92?\x02\x38\x08\x12\x10\n\x08tx_after\x18\x11 \x01(\r\x12O\n\x13transport_mechanism\x18\x12 \x01(\x0e\x32\x32.meshtastic.protobuf.MeshPacket.TransportMechanism\x12\x1d\n\x0eheader_options\x18\x13 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1b\n\x0c\x63hannel_hash\x18\x14 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x04path\x18\x15 \x01(\x0c\x42\x05\x92?\x02\x08\x0e\x12H\n\x10\x61\x63k_proof_status\x18\x16 \x01(\x0e\x32..meshtastic.protobuf.MeshPacket.AckProofStatus\"~\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\"\x87\x02\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\x12\x1b\n\x17TRANSPORT_STORE_FORWARD\x10\t\"\xc1\x01\n\x05\x46lags\x12\x0f\n\x0bPACKET_NONE\x10\x00\x12\x16\n\x12PACKET_RECORD_PATH\x10\x01\x12\x13\n\x0fPACKET_VIA_MQTT\x10\x04\x12\x13\n\x0fPACKET_WANT_ACK\x10\x08\x12\x18\n\x14PACKET_PKI_ENCRYPTED\x10\x10\x12\x18\n\x14PACKET_XEDDSA_SIGNED\x10 \x12\x1c\n\x18PACKET_RATCHET_ENCRYPTED\x10@\x12\x13\n\x0ePACKET_ANYCAST\x10\x80\x01\"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\x42\x11\n\x0fpayload_variantB\n\n\x08_rx_timeB\n\n\x08_rx_rssiBb\n\x14org.meshtastic.protoB\x0cPacketProtosZ\"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.packet_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\014PacketProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_MESHPACKET'].fields_by_name['channel']._options = None + _globals['_MESHPACKET'].fields_by_name['channel']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['encrypted']._options = None + _globals['_MESHPACKET'].fields_by_name['encrypted']._serialized_options = b'\222?\003\010\200\002' + _globals['_MESHPACKET'].fields_by_name['flags']._options = None + _globals['_MESHPACKET'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['hop_limit']._options = None + _globals['_MESHPACKET'].fields_by_name['hop_limit']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['hop_start']._options = None + _globals['_MESHPACKET'].fields_by_name['hop_start']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['next_hop']._options = None + _globals['_MESHPACKET'].fields_by_name['next_hop']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['relay_node']._options = None + _globals['_MESHPACKET'].fields_by_name['relay_node']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['public_key']._options = None + _globals['_MESHPACKET'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _globals['_MESHPACKET'].fields_by_name['priority']._options = None + _globals['_MESHPACKET'].fields_by_name['priority']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['header_options']._options = None + _globals['_MESHPACKET'].fields_by_name['header_options']._serialized_options = b'\222?\002\010 ' + _globals['_MESHPACKET'].fields_by_name['channel_hash']._options = None + _globals['_MESHPACKET'].fields_by_name['channel_hash']._serialized_options = b'\222?\0028\010' + _globals['_MESHPACKET'].fields_by_name['path']._options = None + _globals['_MESHPACKET'].fields_by_name['path']._serialized_options = b'\222?\002\010\016' + _globals['_MESHPACKET']._serialized_start=124 + _globals['_MESHPACKET']._serialized_end=1546 + _globals['_MESHPACKET_PRIORITY']._serialized_start=809 + _globals['_MESHPACKET_PRIORITY']._serialized_end=935 + _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_start=938 + _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_end=1201 + _globals['_MESHPACKET_FLAGS']._serialized_start=1204 + _globals['_MESHPACKET_FLAGS']._serialized_end=1397 + _globals['_MESHPACKET_ACKPROOFSTATUS']._serialized_start=1399 + _globals['_MESHPACKET_ACKPROOFSTATUS']._serialized_end=1503 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/packet_pb2.pyi b/meshtastic/protobuf/packet_pb2.pyi new file mode 100644 index 000000000..29cb05ef5 --- /dev/null +++ b/meshtastic/protobuf/packet_pb2.pyi @@ -0,0 +1,616 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import wire_pb2 as _wire_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 10): + from typing import TypeAlias as _TypeAlias +else: + from typing_extensions import TypeAlias as _TypeAlias + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class MeshPacket(_message.Message): + """ + A packet as a node holds it: the decoded form of a v3 BCAST or UCAST frame + (SCHEMA.md §8), and what the phone API and MQTT exchange. + + MeshPacket is never encoded onto the radio link. Its header fields unroll the v3 + header, `encrypted` is the frame's ciphertext and `decoded` its plaintext, and the + remaining fields are local to the node holding the packet. + + v3 header MeshPacket + ctrl.hop_limit hop_limit + flags.hop_start hop_start + flags.ack flags PACKET_WANT_ACK + flags.mqtt flags PACKET_VIA_MQTT + flags.opt header_options is non-empty + flags.path flags PACKET_RECORD_PATH + from, id from, id + to to, all ones on BCAST, which carries no `to` + chan channel_hash, BCAST only + relay relay_node + next_hop next_hop, UCAST only + options block header_options + path tail path + + The header's version bit and profile follow from the frame being v3 and from `to`. + MINI and EXT frames have no MeshPacket form. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Priority: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _PriorityEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MeshPacket._Priority.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + UNSET: MeshPacket._Priority.ValueType # 0 + """ + Treated as Priority.DEFAULT + """ + MIN: MeshPacket._Priority.ValueType # 1 + """ + Minimum priority + """ + BACKGROUND: MeshPacket._Priority.ValueType # 10 + """ + Background position updates are sent with very low priority - + if the link is super congested they might not go out at all + """ + DEFAULT: MeshPacket._Priority.ValueType # 64 + """ + This priority is used for most messages that don't have a priority set + """ + RELIABLE: MeshPacket._Priority.ValueType # 70 + """ + If priority is unset but the message is marked as want_ack, + assume it is important and use a slightly higher priority + """ + RESPONSE: MeshPacket._Priority.ValueType # 80 + """ + If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. + Furthermore, responses stop relaying packets directed to a node early. + """ + HIGH: MeshPacket._Priority.ValueType # 100 + """ + Higher priority for specific message types (portnums) to distinguish between other reliable packets. + """ + ALERT: MeshPacket._Priority.ValueType # 110 + """ + Higher priority alert message used for critical alerts which take priority over other reliable packets. + """ + ACK: MeshPacket._Priority.ValueType # 120 + """ + Ack/naks are sent with very high priority to ensure that retransmission + stops as soon as possible + """ + MAX: MeshPacket._Priority.ValueType # 127 + """ + Maximum priority + """ + + class Priority(_Priority, metaclass=_PriorityEnumTypeWrapper): + """ + The priority of this message for sending. + Higher priorities are sent first (when managing the transmit queue). + This field is never sent over the air, it is only used internally inside of a local device node. + API clients (either on the local node or connected directly to the node) + can set this parameter if necessary. + (values must be <= 127 to keep protobuf field to one byte in size. + Detailed background on this field: + I noticed a funny side effect of lora being so slow: Usually when making + a protocol there isn't much need to use message priority to change the order + of transmission (because interfaces are fairly fast). + But for lora where packets can take a few seconds each, it is very important + to make sure that critical packets are sent ASAP. + In the case of meshtastic that means we want to send protocol acks as soon as possible + (to prevent unneeded retransmissions), we want routing messages to be sent next, + then messages marked as reliable and finally 'background' packets like periodic position updates. + So I bit the bullet and implemented a new (internal - not sent over the air) + field in MeshPacket called 'priority'. + And the transmission queue in the router object is now a priority queue. + + Priority that follows from the packet is the node's to derive, not a client's to + restate. Whatever priority a packet arrives with, the node sets ACK for a routing + packet, ALERT for an ALERT_APP packet, RESPONSE for a packet with request_id, and + RELIABLE for want_ack or the WANT_RESPONSE bit. For a packet that arrives UNSET and matches + none of those it sets HIGH for text and admin, and DEFAULT otherwise. A client sets + priority only to place a packet its contents do not describe: MIN, BACKGROUND, + DEFAULT, HIGH or MAX. + """ + + UNSET: MeshPacket.Priority.ValueType # 0 + """ + Treated as Priority.DEFAULT + """ + MIN: MeshPacket.Priority.ValueType # 1 + """ + Minimum priority + """ + BACKGROUND: MeshPacket.Priority.ValueType # 10 + """ + Background position updates are sent with very low priority - + if the link is super congested they might not go out at all + """ + DEFAULT: MeshPacket.Priority.ValueType # 64 + """ + This priority is used for most messages that don't have a priority set + """ + RELIABLE: MeshPacket.Priority.ValueType # 70 + """ + If priority is unset but the message is marked as want_ack, + assume it is important and use a slightly higher priority + """ + RESPONSE: MeshPacket.Priority.ValueType # 80 + """ + If priority is unset but the packet is a response to a request, we want it to get there relatively quickly. + Furthermore, responses stop relaying packets directed to a node early. + """ + HIGH: MeshPacket.Priority.ValueType # 100 + """ + Higher priority for specific message types (portnums) to distinguish between other reliable packets. + """ + ALERT: MeshPacket.Priority.ValueType # 110 + """ + Higher priority alert message used for critical alerts which take priority over other reliable packets. + """ + ACK: MeshPacket.Priority.ValueType # 120 + """ + Ack/naks are sent with very high priority to ensure that retransmission + stops as soon as possible + """ + MAX: MeshPacket.Priority.ValueType # 127 + """ + Maximum priority + """ + + class _TransportMechanism: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _TransportMechanismEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MeshPacket._TransportMechanism.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + TRANSPORT_INTERNAL: MeshPacket._TransportMechanism.ValueType # 0 + """ + The default case is that the node generated a packet itself + """ + TRANSPORT_LORA: MeshPacket._TransportMechanism.ValueType # 1 + """ + Arrived via the primary LoRa radio + """ + TRANSPORT_LORA_ALT1: MeshPacket._TransportMechanism.ValueType # 2 + """ + Arrived via a secondary LoRa radio + """ + TRANSPORT_LORA_ALT2: MeshPacket._TransportMechanism.ValueType # 3 + """ + Arrived via a tertiary LoRa radio + """ + TRANSPORT_LORA_ALT3: MeshPacket._TransportMechanism.ValueType # 4 + """ + Arrived via a quaternary LoRa radio + """ + TRANSPORT_MQTT: MeshPacket._TransportMechanism.ValueType # 5 + """ + Arrived via an MQTT connection + """ + TRANSPORT_MULTICAST_UDP: MeshPacket._TransportMechanism.ValueType # 6 + """ + Arrived via Multicast UDP + """ + TRANSPORT_API: MeshPacket._TransportMechanism.ValueType # 7 + """ + Arrived via API connection + """ + TRANSPORT_UNICAST_UDP: MeshPacket._TransportMechanism.ValueType # 8 + """ + Arrived via Unicast UDP + """ + TRANSPORT_STORE_FORWARD: MeshPacket._TransportMechanism.ValueType # 9 + """ + Replayed by a store-and-forward server (storeforward.proto). The frame is the + original, verified with the receiver's own keys; rx_time is when the server heard + it, not when this node did. Never relayed. + """ + + class TransportMechanism(_TransportMechanism, metaclass=_TransportMechanismEnumTypeWrapper): + """ + Enum to identify which transport mechanism this packet arrived over + """ + + TRANSPORT_INTERNAL: MeshPacket.TransportMechanism.ValueType # 0 + """ + The default case is that the node generated a packet itself + """ + TRANSPORT_LORA: MeshPacket.TransportMechanism.ValueType # 1 + """ + Arrived via the primary LoRa radio + """ + TRANSPORT_LORA_ALT1: MeshPacket.TransportMechanism.ValueType # 2 + """ + Arrived via a secondary LoRa radio + """ + TRANSPORT_LORA_ALT2: MeshPacket.TransportMechanism.ValueType # 3 + """ + Arrived via a tertiary LoRa radio + """ + TRANSPORT_LORA_ALT3: MeshPacket.TransportMechanism.ValueType # 4 + """ + Arrived via a quaternary LoRa radio + """ + TRANSPORT_MQTT: MeshPacket.TransportMechanism.ValueType # 5 + """ + Arrived via an MQTT connection + """ + TRANSPORT_MULTICAST_UDP: MeshPacket.TransportMechanism.ValueType # 6 + """ + Arrived via Multicast UDP + """ + TRANSPORT_API: MeshPacket.TransportMechanism.ValueType # 7 + """ + Arrived via API connection + """ + TRANSPORT_UNICAST_UDP: MeshPacket.TransportMechanism.ValueType # 8 + """ + Arrived via Unicast UDP + """ + TRANSPORT_STORE_FORWARD: MeshPacket.TransportMechanism.ValueType # 9 + """ + Replayed by a store-and-forward server (storeforward.proto). The frame is the + original, verified with the receiver's own keys; rx_time is when the server heard + it, not when this node did. Never relayed. + """ + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MeshPacket._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + PACKET_NONE: MeshPacket._Flags.ValueType # 0 + """Nothing set""" + PACKET_RECORD_PATH: MeshPacket._Flags.ValueType # 1 + """Relays record the path this packet takes (header flags.path)""" + PACKET_VIA_MQTT: MeshPacket._Flags.ValueType # 4 + """This packet passed via MQTT somewhere along its path (header flags.mqtt)""" + PACKET_WANT_ACK: MeshPacket._Flags.ValueType # 8 + """The sender wants this packet acknowledged (header flags.ack)""" + PACKET_PKI_ENCRYPTED: MeshPacket._Flags.ValueType # 16 + """The packet was en/decrypted using PKI; local, not in the header""" + PACKET_XEDDSA_SIGNED: MeshPacket._Flags.ValueType # 32 + """The packet carries a valid XEdDSA signature; local, not in the header""" + PACKET_RATCHET_ENCRYPTED: MeshPacket._Flags.ValueType # 64 + """ + The packet was encrypted or decrypted with a ratchet-derived key. Local only: it + is not in the header, and nothing on the air states which derivation was used. + """ + PACKET_ANYCAST: MeshPacket._Flags.ValueType # 128 + """ + `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. + """ + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Packet-level boolean flags: a bitwise OR of Flags values. + + The low nibble matches the v3 header's flags byte bit for bit, so firmware copies + it without remapping. 0x02 is that byte's opt bit, which a MeshPacket expresses + as a non-empty header_options instead. + """ + + PACKET_NONE: MeshPacket.Flags.ValueType # 0 + """Nothing set""" + PACKET_RECORD_PATH: MeshPacket.Flags.ValueType # 1 + """Relays record the path this packet takes (header flags.path)""" + PACKET_VIA_MQTT: MeshPacket.Flags.ValueType # 4 + """This packet passed via MQTT somewhere along its path (header flags.mqtt)""" + PACKET_WANT_ACK: MeshPacket.Flags.ValueType # 8 + """The sender wants this packet acknowledged (header flags.ack)""" + PACKET_PKI_ENCRYPTED: MeshPacket.Flags.ValueType # 16 + """The packet was en/decrypted using PKI; local, not in the header""" + PACKET_XEDDSA_SIGNED: MeshPacket.Flags.ValueType # 32 + """The packet carries a valid XEdDSA signature; local, not in the header""" + PACKET_RATCHET_ENCRYPTED: MeshPacket.Flags.ValueType # 64 + """ + The packet was encrypted or decrypted with a ratchet-derived key. Local only: it + is not in the header, and nothing on the air states which derivation was used. + """ + PACKET_ANYCAST: MeshPacket.Flags.ValueType # 128 + """ + `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. + """ + + class _AckProofStatus: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _AckProofStatusEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[MeshPacket._AckProofStatus.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + ACK_PROOF_ABSENT: MeshPacket._AckProofStatus.ValueType # 0 + """ + No verdict, and the default, 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, and the default, 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. + """ + + FROM_FIELD_NUMBER: _builtins.int + TO_FIELD_NUMBER: _builtins.int + ID_FIELD_NUMBER: _builtins.int + CHANNEL_FIELD_NUMBER: _builtins.int + DECODED_FIELD_NUMBER: _builtins.int + ENCRYPTED_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + HOP_LIMIT_FIELD_NUMBER: _builtins.int + HOP_START_FIELD_NUMBER: _builtins.int + NEXT_HOP_FIELD_NUMBER: _builtins.int + RELAY_NODE_FIELD_NUMBER: _builtins.int + RX_TIME_FIELD_NUMBER: _builtins.int + RX_SNR_FIELD_NUMBER: _builtins.int + RX_RSSI_FIELD_NUMBER: _builtins.int + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + PRIORITY_FIELD_NUMBER: _builtins.int + TX_AFTER_FIELD_NUMBER: _builtins.int + TRANSPORT_MECHANISM_FIELD_NUMBER: _builtins.int + HEADER_OPTIONS_FIELD_NUMBER: _builtins.int + CHANNEL_HASH_FIELD_NUMBER: _builtins.int + PATH_FIELD_NUMBER: _builtins.int + ACK_PROOF_STATUS_FIELD_NUMBER: _builtins.int + to: _builtins.int + """ + The destination node: header `to` on a UCAST frame. All ones (4,294,967,295) on a + BCAST frame, whose header carries no `to`; such a packet is addressed to a channel. + """ + id: _builtins.int + """ + A unique ID for this packet: header `id`, covered by the AAD and part of the nonce. + Useful for duplicate suppression, and for matching a response to its request. + """ + channel: _builtins.int + """ + Index of the channel this packet was sent or received on, 0 being the primary. + Local: a node holds only the channels it knows, so the index means nothing to + another node. Set when the packet is decoded or originated locally; the header + carries channel_hash instead. + """ + encrypted: _builtins.bytes + """ + The frame's ciphertext and authentication tag, as received + """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + hop_limit: _builtins.int + """ + Remaining hop budget: header ctrl.hop_limit, 0-15 in four bits. A relay forwards + while it is above zero and decrements it. It is outside the AAD, so a receiver + drops a frame whose hop_limit exceeds hop_start. + """ + hop_start: _builtins.int + """ + The hop budget the originator launched with: header flags.hop_start, 0-15 in + four bits, covered by the AAD. hop_start - hop_limit is the number of hops taken, + and because only one of the two is authenticated it is a hint, never an + authorisation input (SCHEMA.md §8, Hop accounting). + """ + next_hop: _builtins.int + """ + Relay suffix of the NodeNum this packet is meant for next (SCHEMA.md §8: the last + byte, or 0x01 when that byte is 0x00): header next_hop, UCAST only. Set by the + firmware; clients do not set it. 0 means no next hop. + """ + relay_node: _builtins.int + """ + Relay suffix of the NodeNum that last transmitted this packet (SCHEMA.md §8: the + last byte, or 0x01 when that byte is 0x00): header relay. Set by the firmware; + clients do not set it. + """ + rx_time: _builtins.int + """ + The time this message was received by this node (secs since 1970). + Note: this field is _never_ sent on the radio link itself (to save space). + 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. + """ + rx_snr: _builtins.int + """ + *Never* sent over the radio links. + Set during reception to indicate the SNR of this packet. + Value is in dB, scaled by 2: half-dB steps, so the whole practical SNR range + of -32 to +31.5 dB is one zigzag byte. + """ + rx_rssi: _builtins.int + """ + RSSI of received packet. Only sent to phone for display purposes. + Value is in dBm (negative for all but the strongest received signals). + 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. + """ + public_key: _builtins.bytes + """ + Records the public key the packet was encrypted with, if applicable. + """ + priority: Global___MeshPacket.Priority.ValueType + """Fields 16+ use 2-byte protobuf tags; less-critical fields go here + + + The priority of this message for sending. + See MeshPacket.Priority description for more details. + """ + tx_after: _builtins.int + """ + *Never* sent over the radio links. + Timestamp after which this packet may be sent. + Set by the firmware internally, clients are not supposed to set this. + """ + transport_mechanism: Global___MeshPacket.TransportMechanism.ValueType + """ + Indicates which transport mechanism this packet arrived over + """ + header_options: _builtins.bytes + """ + The v3 header's options block, exactly as it appeared on air. Non-empty exactly + when the header's flags.opt is set. + + Carried through opaquely so the phone API and MQTT deliver a packet's options + intact, including fields this build does not know. Encodes a HeaderOptions + (wire.proto). Never re-encode it: decoding and re-encoding drops unknown fields + and defeats the point of the block. + """ + channel_hash: _builtins.int + """ + Header chan: the one-byte hash of the channel name and key, as carried on a BCAST + frame. It picks the key a receiver tries, and it is all a receiver that cannot + decode the packet, such as an MQTT consumer without the key, has to go on. Not + meaningful on UCAST, which carries no channel. + """ + path: _builtins.bytes + """ + The v3 header's path tail: one relay suffix per hop between `from` and relay_node, + oldest first, each the last byte of a NodeNum or 0x01 when that byte is 0x00 + (SCHEMA.md §8). Its length is max(0, hop_start - hop_limit - 1) when + PACKET_RECORD_PATH is set, and it is empty when that flag is clear. A suffix is a + steering hint resolved against the previous hop's neighbours, never an identity. + """ + 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 do not 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 PACKET_XEDDSA_SIGNED, which reports an identity signature any holder of the + sender's public key can check. This is a pairwise MAC only the original sender can check, + and it attests to delivery rather than to authorship. + """ + @_builtins.property + def decoded(self) -> _wire_pb2.Data: + """ + The plaintext payload, once decrypted or when originated locally + """ + + def __init__( + self, + *, + to: _builtins.int = ..., + id: _builtins.int = ..., + channel: _builtins.int = ..., + decoded: _wire_pb2.Data | None = ..., + encrypted: _builtins.bytes = ..., + flags: _builtins.int = ..., + hop_limit: _builtins.int = ..., + hop_start: _builtins.int = ..., + next_hop: _builtins.int = ..., + relay_node: _builtins.int = ..., + rx_time: _builtins.int | None = ..., + rx_snr: _builtins.int = ..., + rx_rssi: _builtins.int | None = ..., + public_key: _builtins.bytes = ..., + priority: Global___MeshPacket.Priority.ValueType = ..., + tx_after: _builtins.int = ..., + transport_mechanism: Global___MeshPacket.TransportMechanism.ValueType = ..., + header_options: _builtins.bytes = ..., + channel_hash: _builtins.int = ..., + path: _builtins.bytes = ..., + ack_proof_status: Global___MeshPacket.AckProofStatus.ValueType = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_rx_rssi", b"_rx_rssi", "_rx_time", b"_rx_time", "ack_proof_status", b"ack_proof_status", "channel", b"channel", "channel_hash", b"channel_hash", "decoded", b"decoded", "encrypted", b"encrypted", "flags", b"flags", "from", b"from", "header_options", b"header_options", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "next_hop", b"next_hop", "path", b"path", "payload_variant", b"payload_variant", "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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__rx_rssi: _TypeAlias = _typing.Literal["rx_rssi"] # noqa: Y015 + _WhichOneofArgType__rx_rssi: _TypeAlias = _typing.Literal["_rx_rssi", b"_rx_rssi"] # noqa: Y015 + _WhichOneofReturnType__rx_time: _TypeAlias = _typing.Literal["rx_time"] # noqa: Y015 + _WhichOneofArgType__rx_time: _TypeAlias = _typing.Literal["_rx_time", b"_rx_time"] # noqa: Y015 + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["decoded", "encrypted"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__rx_rssi) -> _WhichOneofReturnType__rx_rssi | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__rx_time) -> _WhichOneofReturnType__rx_time | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___MeshPacket: _TypeAlias = MeshPacket # noqa: Y015 diff --git a/meshtastic/protobuf/paxcount_pb2.py b/meshtastic/protobuf/paxcount_pb2.py index f2be49e7a..211804681 100644 --- a/meshtastic/protobuf/paxcount_pb2.py +++ b/meshtastic/protobuf/paxcount_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/paxcount.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -19,8 +20,8 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.paxcount_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_PAXCOUNT']._serialized_start=59 _globals['_PAXCOUNT']._serialized_end=112 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/paxcount_pb2.pyi b/meshtastic/protobuf/paxcount_pb2.pyi index cc7ed0d4d..c836b5fb4 100644 --- a/meshtastic/protobuf/paxcount_pb2.pyi +++ b/meshtastic/protobuf/paxcount_pb2.pyi @@ -3,43 +3,53 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import typing +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -@typing.final -class Paxcount(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class Paxcount(_message.Message): """ - TODO: REPLACE + Paxcounter message reporting the count of detected WiFi and BLE devices nearby """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - WIFI_FIELD_NUMBER: builtins.int - BLE_FIELD_NUMBER: builtins.int - UPTIME_FIELD_NUMBER: builtins.int - wifi: builtins.int + WIFI_FIELD_NUMBER: _builtins.int + BLE_FIELD_NUMBER: _builtins.int + UPTIME_FIELD_NUMBER: _builtins.int + wifi: _builtins.int """ seen Wifi devices """ - ble: builtins.int + ble: _builtins.int """ Seen BLE devices """ - uptime: builtins.int + uptime: _builtins.int """ Uptime in seconds """ def __init__( self, *, - wifi: builtins.int = ..., - ble: builtins.int = ..., - uptime: builtins.int = ..., + wifi: _builtins.int = ..., + ble: _builtins.int = ..., + uptime: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["ble", b"ble", "uptime", b"uptime", "wifi", b"wifi"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ble", b"ble", "uptime", b"uptime", "wifi", b"wifi"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Paxcount = Paxcount +Global___Paxcount: _TypeAlias = Paxcount # noqa: Y015 diff --git a/meshtastic/protobuf/portnums_pb2.py b/meshtastic/protobuf/portnums_pb2.py index 137314375..be991b898 100644 --- a/meshtastic/protobuf/portnums_pb2.py +++ b/meshtastic/protobuf/portnums_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/portnums.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -13,14 +14,14 @@ -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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xcf\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\x10\n\x0cWAYPOINT_APP\x10\x07\x12\r\n\tAUDIO_APP\x10\x08\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\t\x12\r\n\tALERT_APP\x10\n\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0b\x12\x14\n\x10REMOTE_SHELL_APP\x10\x0c\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x13\n\x0fNODE_STATUS_APP\x10#\x12\x13\n\x0fMESH_BEACON_APP\x10$\x12\x0e\n\nPAGING_APP\x10%\x12\x16\n\x12NODE_DISCOVERY_APP\x10&\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x11\n\rTELEMETRY_APP\x10\x42\x12\x0b\n\x07ZPS_APP\x10\x43\x12\x11\n\rSIMULATOR_APP\x10\x44\x12\x14\n\x10NEIGHBORINFO_APP\x10\x45\x12\x12\n\x0eMAP_REPORT_APP\x10\x46\x12\x13\n\x0fPOWERSTRESS_APP\x10G\x12\x12\n\x0eLORAWAN_BRIDGE\x10H\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10I\x12\x0f\n\x0b\x43\x41YENNE_APP\x10J\x12\x0f\n\x0b\x41TAK_PLUGIN\x10K\x12\x10\n\x0cLORA_OTA_APP\x10L\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.portnums_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - 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['DESCRIPTOR']._options = None + _globals['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=880 + _globals['_PORTNUM']._serialized_end=779 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/portnums_pb2.pyi b/meshtastic/protobuf/portnums_pb2.pyi index bc6bafbaa..28d37afe6 100644 --- a/meshtastic/protobuf/portnums_pb2.pyi +++ b/meshtastic/protobuf/portnums_pb2.pyi @@ -3,28 +3,28 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing if sys.version_info >= (3, 10): - import typing as typing_extensions + from typing import TypeAlias as _TypeAlias else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _PortNum: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_PortNum.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _PortNumEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_PortNum.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNKNOWN_APP: _PortNum.ValueType # 0 """ - Deprecated: do not use in new code (formerly called OPAQUE) + Deprecated: do not use in new code. A message sent from a device outside of the mesh, in a form the mesh does not understand NOTE: This must be 0, because it is documented in IMeshService.aidl to be so ENCODING: binary undefined @@ -32,9 +32,10 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy TEXT_MESSAGE_APP: _PortNum.ValueType # 1 """ A simple UTF-8 text message, which even the little micros in the mesh - can understand and show on their screen eventually in some circumstances - even signal might send messages in this form (see below) - ENCODING: UTF-8 Plaintext (?) + can understand and show on their screen. Every payload on this port is + Unishox2-compressed, without exception, so there is no second port and no + flag to say which form a payload is in: a receiver always decompresses. + ENCODING: Unishox2-compressed UTF-8 text """ REMOTE_HARDWARE_APP: _PortNum.ValueType # 2 """ @@ -66,21 +67,13 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy Payload is a AdminMessage message. ENCODING: Protobuf """ - TEXT_MESSAGE_COMPRESSED_APP: _PortNum.ValueType # 7 - """ - Compressed TEXT_MESSAGE payloads. - ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression - NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed - payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress - any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP. - """ - WAYPOINT_APP: _PortNum.ValueType # 8 + WAYPOINT_APP: _PortNum.ValueType # 7 """ Waypoint payloads. Payload is a Waypoint message. ENCODING: Protobuf """ - AUDIO_APP: _PortNum.ValueType # 9 + AUDIO_APP: _PortNum.ValueType # 8 """ Audio Payloads. Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now @@ -88,20 +81,20 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate. This marker comes from the 'moduleConfig.audio.bitrate' enum minus one. """ - DETECTION_SENSOR_APP: _PortNum.ValueType # 10 + DETECTION_SENSOR_APP: _PortNum.ValueType # 9 """ Same as Text Message but originating from Detection Sensor Module. - NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 + NOTE: This portnum traffic is not sent to the public MQTT broker. """ - ALERT_APP: _PortNum.ValueType # 11 + ALERT_APP: _PortNum.ValueType # 10 """ Same as Text Message but used for critical alerts. """ - KEY_VERIFICATION_APP: _PortNum.ValueType # 12 + KEY_VERIFICATION_APP: _PortNum.ValueType # 11 """ Module/port for handling key verification requests. """ - REMOTE_SHELL_APP: _PortNum.ValueType # 13 + REMOTE_SHELL_APP: _PortNum.ValueType # 12 """ Module/port for handling primitive remote shell access. """ @@ -121,28 +114,21 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy Paxcounter lib included in the firmware ENCODING: protobuf """ - STORE_FORWARD_PLUSPLUS_APP: _PortNum.ValueType # 35 - """ - Store and Forward++ module included in the firmware - ENCODING: protobuf - This module is specifically for Native Linux nodes, and provides a Git-style - chain of messages. - """ - NODE_STATUS_APP: _PortNum.ValueType # 36 + NODE_STATUS_APP: _PortNum.ValueType # 35 """ Node Status module 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 + MESH_BEACON_APP: _PortNum.ValueType # 36 """ 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 + PAGING_APP: _PortNum.ValueType # 37 """ Acknowledged paging: alerts a person is expected to physically acknowledge, and the acknowledgements themselves. @@ -150,95 +136,86 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy 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. """ + NODE_DISCOVERY_APP: _PortNum.ValueType # 38 + """ + Node discovery: a signed identity record, and the queries a server answers with it. + Payload is a DiscoveryMessage from discovery.proto. + ENCODING: Protobuf + """ SERIAL_APP: _PortNum.ValueType # 64 """ Provides a hardware serial interface to send and receive from the Meshtastic network. Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. - Maximum packet size of 240 bytes. + A packet carries at most the room one frame leaves (SCHEMA.md §8, Payload room). Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. ENCODING: binary undefined """ STORE_FORWARD_APP: _PortNum.ValueType # 65 """ - STORE_FORWARD_APP (Work in Progress) - Maintained by Jm Casler (MC Hamster) : jm@casler.org + Store and forward: a server replays the ciphertext frames it kept while a client was + away, and the client verifies each one itself. Payload is a StoreAndForward message + from storeforward.proto. ENCODING: Protobuf """ - RANGE_TEST_APP: _PortNum.ValueType # 66 - """ - Optional port for messages for the range test module. - ENCODING: ASCII Plaintext - NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 - """ - TELEMETRY_APP: _PortNum.ValueType # 67 + TELEMETRY_APP: _PortNum.ValueType # 66 """ Provides a format to send and receive telemetry data from the Meshtastic network. Maintained by Charles Crossan (crossan007) : crossan007@gmail.com ENCODING: Protobuf """ - ZPS_APP: _PortNum.ValueType # 68 + ZPS_APP: _PortNum.ValueType # 67 """ Experimental tools for estimating node position without a GPS Maintained by Github user a-f-G-U-C (a Meshtastic contributor) Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS ENCODING: arrays of int64 fields """ - SIMULATOR_APP: _PortNum.ValueType # 69 + SIMULATOR_APP: _PortNum.ValueType # 68 """ Used to let multiple instances of Linux native applications communicate - as if they did using their LoRa chip. + as if they did using their LoRa chip. Payload is an InjectedFrame. Maintained by GitHub user GUVWAF. Project files at https://github.com/GUVWAF/Meshtasticator - ENCODING: Protobuf (?) - """ - TRACEROUTE_APP: _PortNum.ValueType # 70 - """ - Provides a traceroute functionality to show the route a packet towards - a certain destination would take on the mesh. Contains a RouteDiscovery message as payload. ENCODING: Protobuf """ - NEIGHBORINFO_APP: _PortNum.ValueType # 71 + NEIGHBORINFO_APP: _PortNum.ValueType # 69 """ Aggregates edge info for the network by sending out a list of each node's neighbors ENCODING: Protobuf """ - ATAK_PLUGIN: _PortNum.ValueType # 72 - """ - ATAK Plugin - Portnum for payloads from the official Meshtastic ATAK plugin - """ - MAP_REPORT_APP: _PortNum.ValueType # 73 + MAP_REPORT_APP: _PortNum.ValueType # 70 """ Provides unencrypted information about a node for consumption by a map via MQTT """ - POWERSTRESS_APP: _PortNum.ValueType # 74 + POWERSTRESS_APP: _PortNum.ValueType # 71 """ PowerStress based monitoring support (for automated power consumption testing) """ - LORAWAN_BRIDGE: _PortNum.ValueType # 75 + LORAWAN_BRIDGE: _PortNum.ValueType # 72 """ LoraWAN Payload Transport ENCODING: LoRaWANBridge protobuf, see lorawan_bridge.proto """ - RETICULUM_TUNNEL_APP: _PortNum.ValueType # 76 + RETICULUM_TUNNEL_APP: _PortNum.ValueType # 73 """ Reticulum Network Stack Tunnel App ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface """ - CAYENNE_APP: _PortNum.ValueType # 77 + CAYENNE_APP: _PortNum.ValueType # 74 """ App for transporting Cayenne Low Power Payload, popular for LoRaWAN sensor nodes. Offers ability to send arbitrary telemetry over meshtastic that is not covered by telemetry.proto ENCODING: CayenneLLP """ - ATAK_PLUGIN_V2: _PortNum.ValueType # 78 + ATAK_PLUGIN: _PortNum.ValueType # 75 """ - ATAK Plugin V2 - Portnum for payloads from the official Meshtastic ATAK plugin using - TAKPacketV2 with zstd dictionary compression. + ATAK Plugin + Cursor on Target events from the Meshtastic ATAK plugin, the apps and TAK tracker + nodes: a flags byte, then a TAKPacket (atak.proto). + ENCODING: Protobuf, optionally zstd dictionary-compressed """ - LORA_OTA_APP: _PortNum.ValueType # 79 + LORA_OTA_APP: _PortNum.ValueType # 76 """signed firmware updates over lora. ENCODING: binary (ota-common transport frames) @@ -276,14 +253,11 @@ class PortNum(_PortNum, metaclass=_PortNumEnumTypeWrapper): 64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application 256-511 Use one of these portnums for your private applications that you don't want to register publically All other values are reserved. - Note: This was formerly a Type enum named 'typ' with the same id # - We have change to this 'portnum' based scheme for specifying app handlers for particular payloads. - This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically. """ UNKNOWN_APP: PortNum.ValueType # 0 """ -Deprecated: do not use in new code (formerly called OPAQUE) +Deprecated: do not use in new code. A message sent from a device outside of the mesh, in a form the mesh does not understand NOTE: This must be 0, because it is documented in IMeshService.aidl to be so ENCODING: binary undefined @@ -291,9 +265,10 @@ ENCODING: binary undefined TEXT_MESSAGE_APP: PortNum.ValueType # 1 """ A simple UTF-8 text message, which even the little micros in the mesh -can understand and show on their screen eventually in some circumstances -even signal might send messages in this form (see below) -ENCODING: UTF-8 Plaintext (?) +can understand and show on their screen. Every payload on this port is +Unishox2-compressed, without exception, so there is no second port and no +flag to say which form a payload is in: a receiver always decompresses. +ENCODING: Unishox2-compressed UTF-8 text """ REMOTE_HARDWARE_APP: PortNum.ValueType # 2 """ @@ -325,21 +300,13 @@ Admin control packets. Payload is a AdminMessage message. ENCODING: Protobuf """ -TEXT_MESSAGE_COMPRESSED_APP: PortNum.ValueType # 7 -""" -Compressed TEXT_MESSAGE payloads. -ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression -NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed -payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress -any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP. -""" -WAYPOINT_APP: PortNum.ValueType # 8 +WAYPOINT_APP: PortNum.ValueType # 7 """ Waypoint payloads. Payload is a Waypoint message. ENCODING: Protobuf """ -AUDIO_APP: PortNum.ValueType # 9 +AUDIO_APP: PortNum.ValueType # 8 """ Audio Payloads. Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now @@ -347,20 +314,20 @@ ENCODING: codec2 audio frames NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate. This marker comes from the 'moduleConfig.audio.bitrate' enum minus one. """ -DETECTION_SENSOR_APP: PortNum.ValueType # 10 +DETECTION_SENSOR_APP: PortNum.ValueType # 9 """ Same as Text Message but originating from Detection Sensor Module. -NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 +NOTE: This portnum traffic is not sent to the public MQTT broker. """ -ALERT_APP: PortNum.ValueType # 11 +ALERT_APP: PortNum.ValueType # 10 """ Same as Text Message but used for critical alerts. """ -KEY_VERIFICATION_APP: PortNum.ValueType # 12 +KEY_VERIFICATION_APP: PortNum.ValueType # 11 """ Module/port for handling key verification requests. """ -REMOTE_SHELL_APP: PortNum.ValueType # 13 +REMOTE_SHELL_APP: PortNum.ValueType # 12 """ Module/port for handling primitive remote shell access. """ @@ -380,28 +347,21 @@ PAXCOUNTER_APP: PortNum.ValueType # 34 Paxcounter lib included in the firmware ENCODING: protobuf """ -STORE_FORWARD_PLUSPLUS_APP: PortNum.ValueType # 35 -""" -Store and Forward++ module included in the firmware -ENCODING: protobuf -This module is specifically for Native Linux nodes, and provides a Git-style -chain of messages. -""" -NODE_STATUS_APP: PortNum.ValueType # 36 +NODE_STATUS_APP: PortNum.ValueType # 35 """ Node Status module 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 +MESH_BEACON_APP: PortNum.ValueType # 36 """ 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 +PAGING_APP: PortNum.ValueType # 37 """ Acknowledged paging: alerts a person is expected to physically acknowledge, and the acknowledgements themselves. @@ -409,95 +369,86 @@ 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. """ +NODE_DISCOVERY_APP: PortNum.ValueType # 38 +""" +Node discovery: a signed identity record, and the queries a server answers with it. +Payload is a DiscoveryMessage from discovery.proto. +ENCODING: Protobuf +""" SERIAL_APP: PortNum.ValueType # 64 """ Provides a hardware serial interface to send and receive from the Meshtastic network. Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. -Maximum packet size of 240 bytes. +A packet carries at most the room one frame leaves (SCHEMA.md §8, Payload room). Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. ENCODING: binary undefined """ STORE_FORWARD_APP: PortNum.ValueType # 65 """ -STORE_FORWARD_APP (Work in Progress) -Maintained by Jm Casler (MC Hamster) : jm@casler.org +Store and forward: a server replays the ciphertext frames it kept while a client was +away, and the client verifies each one itself. Payload is a StoreAndForward message +from storeforward.proto. ENCODING: Protobuf """ -RANGE_TEST_APP: PortNum.ValueType # 66 -""" -Optional port for messages for the range test module. -ENCODING: ASCII Plaintext -NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 -""" -TELEMETRY_APP: PortNum.ValueType # 67 +TELEMETRY_APP: PortNum.ValueType # 66 """ Provides a format to send and receive telemetry data from the Meshtastic network. Maintained by Charles Crossan (crossan007) : crossan007@gmail.com ENCODING: Protobuf """ -ZPS_APP: PortNum.ValueType # 68 +ZPS_APP: PortNum.ValueType # 67 """ Experimental tools for estimating node position without a GPS Maintained by Github user a-f-G-U-C (a Meshtastic contributor) Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS ENCODING: arrays of int64 fields """ -SIMULATOR_APP: PortNum.ValueType # 69 +SIMULATOR_APP: PortNum.ValueType # 68 """ Used to let multiple instances of Linux native applications communicate -as if they did using their LoRa chip. +as if they did using their LoRa chip. Payload is an InjectedFrame. Maintained by GitHub user GUVWAF. Project files at https://github.com/GUVWAF/Meshtasticator -ENCODING: Protobuf (?) -""" -TRACEROUTE_APP: PortNum.ValueType # 70 -""" -Provides a traceroute functionality to show the route a packet towards -a certain destination would take on the mesh. Contains a RouteDiscovery message as payload. ENCODING: Protobuf """ -NEIGHBORINFO_APP: PortNum.ValueType # 71 +NEIGHBORINFO_APP: PortNum.ValueType # 69 """ Aggregates edge info for the network by sending out a list of each node's neighbors ENCODING: Protobuf """ -ATAK_PLUGIN: PortNum.ValueType # 72 -""" -ATAK Plugin -Portnum for payloads from the official Meshtastic ATAK plugin -""" -MAP_REPORT_APP: PortNum.ValueType # 73 +MAP_REPORT_APP: PortNum.ValueType # 70 """ Provides unencrypted information about a node for consumption by a map via MQTT """ -POWERSTRESS_APP: PortNum.ValueType # 74 +POWERSTRESS_APP: PortNum.ValueType # 71 """ PowerStress based monitoring support (for automated power consumption testing) """ -LORAWAN_BRIDGE: PortNum.ValueType # 75 +LORAWAN_BRIDGE: PortNum.ValueType # 72 """ LoraWAN Payload Transport ENCODING: LoRaWANBridge protobuf, see lorawan_bridge.proto """ -RETICULUM_TUNNEL_APP: PortNum.ValueType # 76 +RETICULUM_TUNNEL_APP: PortNum.ValueType # 73 """ Reticulum Network Stack Tunnel App ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface """ -CAYENNE_APP: PortNum.ValueType # 77 +CAYENNE_APP: PortNum.ValueType # 74 """ App for transporting Cayenne Low Power Payload, popular for LoRaWAN sensor nodes. Offers ability to send arbitrary telemetry over meshtastic that is not covered by telemetry.proto ENCODING: CayenneLLP """ -ATAK_PLUGIN_V2: PortNum.ValueType # 78 +ATAK_PLUGIN: PortNum.ValueType # 75 """ -ATAK Plugin V2 -Portnum for payloads from the official Meshtastic ATAK plugin using -TAKPacketV2 with zstd dictionary compression. +ATAK Plugin +Cursor on Target events from the Meshtastic ATAK plugin, the apps and TAK tracker +nodes: a flags byte, then a TAKPacket (atak.proto). +ENCODING: Protobuf, optionally zstd dictionary-compressed """ -LORA_OTA_APP: PortNum.ValueType # 79 +LORA_OTA_APP: PortNum.ValueType # 76 """signed firmware updates over lora. ENCODING: binary (ota-common transport frames) @@ -523,4 +474,4 @@ MAX: PortNum.ValueType # 511 """ Currently we limit port nums to no higher than this value """ -global___PortNum = PortNum +Global___PortNum: _TypeAlias = PortNum # noqa: Y015 diff --git a/meshtastic/protobuf/powermon_pb2.py b/meshtastic/protobuf/powermon_pb2.py index 1895a953f..8db6f9710 100644 --- a/meshtastic/protobuf/powermon_pb2.py +++ b/meshtastic/protobuf/powermon_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/powermon.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -13,14 +14,14 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/powermon.proto\x12\x13meshtastic.protobuf\"\xe0\x01\n\x08PowerMon\"\xd3\x01\n\x05State\x12\x08\n\x04None\x10\x00\x12\x11\n\rCPU_DeepSleep\x10\x01\x12\x12\n\x0e\x43PU_LightSleep\x10\x02\x12\x0c\n\x08Vext1_On\x10\x04\x12\r\n\tLora_RXOn\x10\x08\x12\r\n\tLora_TXOn\x10\x10\x12\x11\n\rLora_RXActive\x10 \x12\t\n\x05\x42T_On\x10@\x12\x0b\n\x06LED_On\x10\x80\x01\x12\x0e\n\tScreen_On\x10\x80\x02\x12\x13\n\x0eScreen_Drawing\x10\x80\x04\x12\x0c\n\x07Wifi_On\x10\x80\x08\x12\x0f\n\nGPS_Active\x10\x80\x10\"\x88\x03\n\x12PowerStressMessage\x12;\n\x03\x63md\x18\x01 \x01(\x0e\x32..meshtastic.protobuf.PowerStressMessage.Opcode\x12\x13\n\x0bnum_seconds\x18\x02 \x01(\x02\"\x9f\x02\n\x06Opcode\x12\t\n\x05UNSET\x10\x00\x12\x0e\n\nPRINT_INFO\x10\x01\x12\x0f\n\x0b\x46ORCE_QUIET\x10\x02\x12\r\n\tEND_QUIET\x10\x03\x12\r\n\tSCREEN_ON\x10\x10\x12\x0e\n\nSCREEN_OFF\x10\x11\x12\x0c\n\x08\x43PU_IDLE\x10 \x12\x11\n\rCPU_DEEPSLEEP\x10!\x12\x0e\n\nCPU_FULLON\x10\"\x12\n\n\x06LED_ON\x10\x30\x12\x0b\n\x07LED_OFF\x10\x31\x12\x0c\n\x08LORA_OFF\x10@\x12\x0b\n\x07LORA_TX\x10\x41\x12\x0b\n\x07LORA_RX\x10\x42\x12\n\n\x06\x42T_OFF\x10P\x12\t\n\x05\x42T_ON\x10Q\x12\x0c\n\x08WIFI_OFF\x10`\x12\x0b\n\x07WIFI_ON\x10\x61\x12\x0b\n\x07GPS_OFF\x10p\x12\n\n\x06GPS_ON\x10qBd\n\x14org.meshtastic.protoB\x0ePowerMonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/powermon.proto\x12\x13meshtastic.protobuf\"\xe0\x01\n\x08PowerMon\"\xd3\x01\n\x05State\x12\x08\n\x04None\x10\x00\x12\x11\n\rCPU_DeepSleep\x10\x01\x12\x12\n\x0e\x43PU_LightSleep\x10\x02\x12\x0c\n\x08Vext1_On\x10\x04\x12\r\n\tLora_RXOn\x10\x08\x12\r\n\tLora_TXOn\x10\x10\x12\x11\n\rLora_RXActive\x10 \x12\t\n\x05\x42T_On\x10@\x12\x0b\n\x06LED_On\x10\x80\x01\x12\x0e\n\tScreen_On\x10\x80\x02\x12\x13\n\x0eScreen_Drawing\x10\x80\x04\x12\x0c\n\x07Wifi_On\x10\x80\x08\x12\x0f\n\nGPS_Active\x10\x80\x10\"\x88\x03\n\x12PowerStressMessage\x12;\n\x03\x63md\x18\x01 \x01(\x0e\x32..meshtastic.protobuf.PowerStressMessage.Opcode\x12\x13\n\x0bnum_seconds\x18\x02 \x01(\r\"\x9f\x02\n\x06Opcode\x12\t\n\x05UNSET\x10\x00\x12\x0e\n\nPRINT_INFO\x10\x01\x12\x0f\n\x0b\x46ORCE_QUIET\x10\x02\x12\r\n\tEND_QUIET\x10\x03\x12\r\n\tSCREEN_ON\x10\x10\x12\x0e\n\nSCREEN_OFF\x10\x11\x12\x0c\n\x08\x43PU_IDLE\x10 \x12\x11\n\rCPU_DEEPSLEEP\x10!\x12\x0e\n\nCPU_FULLON\x10\"\x12\n\n\x06LED_ON\x10\x30\x12\x0b\n\x07LED_OFF\x10\x31\x12\x0c\n\x08LORA_OFF\x10@\x12\x0b\n\x07LORA_TX\x10\x41\x12\x0b\n\x07LORA_RX\x10\x42\x12\n\n\x06\x42T_OFF\x10P\x12\t\n\x05\x42T_ON\x10Q\x12\x0c\n\x08WIFI_OFF\x10`\x12\x0b\n\x07WIFI_ON\x10\x61\x12\x0b\n\x07GPS_OFF\x10p\x12\n\n\x06GPS_ON\x10qBd\n\x14org.meshtastic.protoB\x0ePowerMonProtosZ\"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.powermon_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016PowerMonProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\016PowerMonProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_POWERMON']._serialized_start=60 _globals['_POWERMON']._serialized_end=284 _globals['_POWERMON_STATE']._serialized_start=73 diff --git a/meshtastic/protobuf/powermon_pb2.pyi b/meshtastic/protobuf/powermon_pb2.pyi index 6c51a2819..91f5bb1bd 100644 --- a/meshtastic/protobuf/powermon_pb2.pyi +++ b/meshtastic/protobuf/powermon_pb2.pyi @@ -3,36 +3,38 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class PowerMon(google.protobuf.message.Message): +@_typing.final +class PowerMon(_message.Message): """Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _State: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _StateEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[PowerMon._State.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _StateEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[PowerMon._State.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor CPU_DeepSleep: PowerMon._State.ValueType # 1 + """CPU is in deep sleep mode (lowest power)""" CPU_LightSleep: PowerMon._State.ValueType # 2 + """CPU is in light sleep mode (reduced power, fast wake)""" Vext1_On: PowerMon._State.ValueType # 4 """ The external Vext1 power is on. Many boards have auxillary power rails that the CPU turns on only @@ -45,13 +47,21 @@ class PowerMon(google.protobuf.message.Message): (We use a bitmask for states so that if a log message gets lost it won't be fatal) """ Lora_RXOn: PowerMon._State.ValueType # 8 + """LoRa radio receiver is powered on""" Lora_TXOn: PowerMon._State.ValueType # 16 + """LoRa radio transmitter is powered on""" Lora_RXActive: PowerMon._State.ValueType # 32 + """LoRa radio is actively receiving a packet""" BT_On: PowerMon._State.ValueType # 64 + """Bluetooth radio is powered on""" LED_On: PowerMon._State.ValueType # 128 + """LED is powered on""" Screen_On: PowerMon._State.ValueType # 256 + """Display screen is powered on""" Screen_Drawing: PowerMon._State.ValueType # 512 + """Display screen is actively being drawn to""" Wifi_On: PowerMon._State.ValueType # 1024 + """WiFi radio is powered on""" GPS_Active: PowerMon._State.ValueType # 2048 """ GPS is actively trying to find our location @@ -64,7 +74,9 @@ class PowerMon(google.protobuf.message.Message): """ CPU_DeepSleep: PowerMon.State.ValueType # 1 + """CPU is in deep sleep mode (lowest power)""" CPU_LightSleep: PowerMon.State.ValueType # 2 + """CPU is in light sleep mode (reduced power, fast wake)""" Vext1_On: PowerMon.State.ValueType # 4 """ The external Vext1 power is on. Many boards have auxillary power rails that the CPU turns on only @@ -77,13 +89,21 @@ class PowerMon(google.protobuf.message.Message): (We use a bitmask for states so that if a log message gets lost it won't be fatal) """ Lora_RXOn: PowerMon.State.ValueType # 8 + """LoRa radio receiver is powered on""" Lora_TXOn: PowerMon.State.ValueType # 16 + """LoRa radio transmitter is powered on""" Lora_RXActive: PowerMon.State.ValueType # 32 + """LoRa radio is actively receiving a packet""" BT_On: PowerMon.State.ValueType # 64 + """Bluetooth radio is powered on""" LED_On: PowerMon.State.ValueType # 128 + """LED is powered on""" Screen_On: PowerMon.State.ValueType # 256 + """Display screen is powered on""" Screen_Drawing: PowerMon.State.ValueType # 512 + """Display screen is actively being drawn to""" Wifi_On: PowerMon.State.ValueType # 1024 + """WiFi radio is powered on""" GPS_Active: PowerMon.State.ValueType # 2048 """ GPS is actively trying to find our location @@ -93,23 +113,28 @@ class PowerMon(google.protobuf.message.Message): def __init__( self, ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _Never # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___PowerMon = PowerMon +Global___PowerMon: _TypeAlias = PowerMon # noqa: Y015 -@typing.final -class PowerStressMessage(google.protobuf.message.Message): +@_typing.final +class PowerStressMessage(_message.Message): """ PowerStress testing support via the C++ PowerStress module """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Opcode: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _OpcodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[PowerStressMessage._Opcode.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _OpcodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[PowerStressMessage._Opcode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNSET: PowerStressMessage._Opcode.ValueType # 0 """ Unset/unused @@ -121,33 +146,33 @@ class PowerStressMessage(google.protobuf.message.Message): END_QUIET: PowerStressMessage._Opcode.ValueType # 3 """Stop powerstress processing - probably by just rebooting the board""" SCREEN_ON: PowerStressMessage._Opcode.ValueType # 16 - """Turn the screen on""" + """Turn the screen on for num_seconds""" SCREEN_OFF: PowerStressMessage._Opcode.ValueType # 17 - """Turn the screen off""" + """Turn the screen off for num_seconds""" CPU_IDLE: PowerStressMessage._Opcode.ValueType # 32 - """Let the CPU run but we assume mostly idling for num_seconds""" + """Let the CPU run but mostly idle for num_seconds""" CPU_DEEPSLEEP: PowerStressMessage._Opcode.ValueType # 33 - """Force deep sleep for FIXME seconds""" + """Force deep sleep for num_seconds""" CPU_FULLON: PowerStressMessage._Opcode.ValueType # 34 - """Spin the CPU as fast as possible for num_seconds""" + """Spin the CPU at full speed for num_seconds""" LED_ON: PowerStressMessage._Opcode.ValueType # 48 - """Turn the LED on for num_seconds (and leave it on - for baseline power measurement purposes)""" + """Turn the LED on for num_seconds (leave on for baseline power measurement)""" LED_OFF: PowerStressMessage._Opcode.ValueType # 49 """Force the LED off for num_seconds""" LORA_OFF: PowerStressMessage._Opcode.ValueType # 64 - """Completely turn off the LORA radio for num_seconds""" + """Completely turn off the LoRa radio for num_seconds""" LORA_TX: PowerStressMessage._Opcode.ValueType # 65 - """Send Lora packets for num_seconds""" + """Send LoRa packets for num_seconds""" LORA_RX: PowerStressMessage._Opcode.ValueType # 66 - """Receive Lora packets for num_seconds (node will be mostly just listening, unless an external agent is helping stress this by sending packets on the current channel)""" + """Receive LoRa packets for num_seconds""" BT_OFF: PowerStressMessage._Opcode.ValueType # 80 - """Turn off the BT radio for num_seconds""" + """Turn off the Bluetooth radio for num_seconds""" BT_ON: PowerStressMessage._Opcode.ValueType # 81 - """Turn on the BT radio for num_seconds""" + """Turn on the Bluetooth radio for num_seconds""" WIFI_OFF: PowerStressMessage._Opcode.ValueType # 96 - """Turn off the WIFI radio for num_seconds""" + """Turn off the WiFi radio for num_seconds""" WIFI_ON: PowerStressMessage._Opcode.ValueType # 97 - """Turn on the WIFI radio for num_seconds""" + """Turn on the WiFi radio for num_seconds""" GPS_OFF: PowerStressMessage._Opcode.ValueType # 112 """Turn off the GPS radio for num_seconds""" GPS_ON: PowerStressMessage._Opcode.ValueType # 113 @@ -156,7 +181,7 @@ class PowerStressMessage(google.protobuf.message.Message): class Opcode(_Opcode, metaclass=_OpcodeEnumTypeWrapper): """ What operation would we like the UUT to perform. - note: senders should probably set want_response in their request packets, so that they can know when the state + note: senders should probably set the WANT_RESPONSE bit of Data.bitfield in their request packets, so that they can know when the state machine has started processing their request """ @@ -171,51 +196,58 @@ class PowerStressMessage(google.protobuf.message.Message): END_QUIET: PowerStressMessage.Opcode.ValueType # 3 """Stop powerstress processing - probably by just rebooting the board""" SCREEN_ON: PowerStressMessage.Opcode.ValueType # 16 - """Turn the screen on""" + """Turn the screen on for num_seconds""" SCREEN_OFF: PowerStressMessage.Opcode.ValueType # 17 - """Turn the screen off""" + """Turn the screen off for num_seconds""" CPU_IDLE: PowerStressMessage.Opcode.ValueType # 32 - """Let the CPU run but we assume mostly idling for num_seconds""" + """Let the CPU run but mostly idle for num_seconds""" CPU_DEEPSLEEP: PowerStressMessage.Opcode.ValueType # 33 - """Force deep sleep for FIXME seconds""" + """Force deep sleep for num_seconds""" CPU_FULLON: PowerStressMessage.Opcode.ValueType # 34 - """Spin the CPU as fast as possible for num_seconds""" + """Spin the CPU at full speed for num_seconds""" LED_ON: PowerStressMessage.Opcode.ValueType # 48 - """Turn the LED on for num_seconds (and leave it on - for baseline power measurement purposes)""" + """Turn the LED on for num_seconds (leave on for baseline power measurement)""" LED_OFF: PowerStressMessage.Opcode.ValueType # 49 """Force the LED off for num_seconds""" LORA_OFF: PowerStressMessage.Opcode.ValueType # 64 - """Completely turn off the LORA radio for num_seconds""" + """Completely turn off the LoRa radio for num_seconds""" LORA_TX: PowerStressMessage.Opcode.ValueType # 65 - """Send Lora packets for num_seconds""" + """Send LoRa packets for num_seconds""" LORA_RX: PowerStressMessage.Opcode.ValueType # 66 - """Receive Lora packets for num_seconds (node will be mostly just listening, unless an external agent is helping stress this by sending packets on the current channel)""" + """Receive LoRa packets for num_seconds""" BT_OFF: PowerStressMessage.Opcode.ValueType # 80 - """Turn off the BT radio for num_seconds""" + """Turn off the Bluetooth radio for num_seconds""" BT_ON: PowerStressMessage.Opcode.ValueType # 81 - """Turn on the BT radio for num_seconds""" + """Turn on the Bluetooth radio for num_seconds""" WIFI_OFF: PowerStressMessage.Opcode.ValueType # 96 - """Turn off the WIFI radio for num_seconds""" + """Turn off the WiFi radio for num_seconds""" WIFI_ON: PowerStressMessage.Opcode.ValueType # 97 - """Turn on the WIFI radio for num_seconds""" + """Turn on the WiFi radio for num_seconds""" GPS_OFF: PowerStressMessage.Opcode.ValueType # 112 """Turn off the GPS radio for num_seconds""" GPS_ON: PowerStressMessage.Opcode.ValueType # 113 """Turn on the GPS radio for num_seconds""" - CMD_FIELD_NUMBER: builtins.int - NUM_SECONDS_FIELD_NUMBER: builtins.int - cmd: global___PowerStressMessage.Opcode.ValueType + CMD_FIELD_NUMBER: _builtins.int + NUM_SECONDS_FIELD_NUMBER: _builtins.int + cmd: Global___PowerStressMessage.Opcode.ValueType """ - What type of HardwareMessage is this? + The power stress operation to perform + """ + num_seconds: _builtins.int + """ + Duration in seconds """ - num_seconds: builtins.float def __init__( self, *, - cmd: global___PowerStressMessage.Opcode.ValueType = ..., - num_seconds: builtins.float = ..., + cmd: Global___PowerStressMessage.Opcode.ValueType = ..., + num_seconds: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["cmd", b"cmd", "num_seconds", b"num_seconds"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["cmd", b"cmd", "num_seconds", b"num_seconds"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___PowerStressMessage = PowerStressMessage +Global___PowerStressMessage: _TypeAlias = PowerStressMessage # noqa: Y015 diff --git a/meshtastic/protobuf/region_registry_pb2.py b/meshtastic/protobuf/region_registry_pb2.py new file mode 100644 index 000000000..9d357599b --- /dev/null +++ b/meshtastic/protobuf/region_registry_pb2.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/region_registry.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)meshtastic/protobuf/region_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\x9a\x02\n\nRegionInfo\x12\x34\n\x0bregion_code\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\x12\x0f\n\x07profile\x18\x02 \x01(\t\x12\x1b\n\x13\x66req_start_mhz_x100\x18\x03 \x01(\r\x12\x19\n\x11\x66req_end_mhz_x100\x18\x04 \x01(\r\x12\x12\n\nduty_cycle\x18\x05 \x01(\r\x12\x19\n\x11router_duty_cycle\x18\x06 \x01(\r\x12\x17\n\x0fpower_limit_dbm\x18\x07 \x01(\r\x12\x1b\n\x13\x66requency_switching\x18\x08 \x01(\x08\x12\x11\n\twide_lora\x18\t \x01(\x08\x12\x15\n\roverride_slot\x18\n \x01(\x11\"\x98\x02\n\rRegionProfile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bpreset_list\x18\x02 \x01(\t\x12\x38\n\x0e\x64\x65\x66\x61ult_preset\x18\x03 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x13\n\x0bspacing_khz\x18\x04 \x01(\r\x12\x13\n\x0bpadding_khz\x18\x05 \x01(\r\x12\x17\n\x0f\x61udio_permitted\x18\x06 \x01(\x08\x12\x15\n\rlicensed_only\x18\x07 \x01(\x08\x12\x19\n\x11position_throttle\x18\x08 \x01(\r\x12\x1a\n\x12telemetry_throttle\x18\t \x01(\r\x12\x19\n\x11\x64\x65\x66\x61ult_hop_start\x18\n \x01(\r\"R\n\x0fModemPresetList\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x07presets\x18\x02 \x03(\x0e\x32 .meshtastic.protobuf.ModemPreset\"C\n\x0fRegionSwapGroup\x12\x30\n\x07regions\x18\x01 \x03(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\"\x81\x02\n\x0eRegionRegistry\x12\x30\n\x07regions\x18\x01 \x03(\x0b\x32\x1f.meshtastic.protobuf.RegionInfo\x12\x34\n\x08profiles\x18\x02 \x03(\x0b\x32\".meshtastic.protobuf.RegionProfile\x12:\n\x0cpreset_lists\x18\x03 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetList\x12\x39\n\x0bswap_groups\x18\x04 \x03(\x0b\x32$.meshtastic.protobuf.RegionSwapGroup\x12\x10\n\x08revision\x18\x05 \x01(\rBj\n\x14org.meshtastic.protoB\x14RegionRegistryProtosZ\"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.region_registry_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\024RegionRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_REGIONINFO']._serialized_start=101 + _globals['_REGIONINFO']._serialized_end=383 + _globals['_REGIONPROFILE']._serialized_start=386 + _globals['_REGIONPROFILE']._serialized_end=666 + _globals['_MODEMPRESETLIST']._serialized_start=668 + _globals['_MODEMPRESETLIST']._serialized_end=750 + _globals['_REGIONSWAPGROUP']._serialized_start=752 + _globals['_REGIONSWAPGROUP']._serialized_end=819 + _globals['_REGIONREGISTRY']._serialized_start=822 + _globals['_REGIONREGISTRY']._serialized_end=1079 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/region_registry_pb2.pyi b/meshtastic/protobuf/region_registry_pb2.pyi new file mode 100644 index 000000000..66d1ec9fd --- /dev/null +++ b/meshtastic/protobuf/region_registry_pb2.pyi @@ -0,0 +1,315 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from . import common_pb2 as _common_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class RegionInfo(_message.Message): + """ + Region Registry + + NOT used on-wire; consumed by clients/apps and optionally embedded in firmware. + Centralizes the regulatory regions, the profiles they share and the modem presets + each profile permits. + + Each fact is stated in exactly one table, and tables refer to each other by name: + + RegionInfo band, duty cycle, power limit, slot -> one RegionProfile + RegionProfile slot layout, audio, licensing, + throttles, default preset -> one ModemPresetList + ModemPresetList the presets a profile permits -> ModemPreset values + RegionSwapGroup regions a preset moves a node between -> RegionCode values + + Many regions share one profile, and profiles can share one preset list: NARROW + and HAM_100KHZ permit the same presets and differ in licensing, padding and + audio. Whatever follows from the tables is not stored, such as a preset being + reachable only by licensed operators, or the presets a swap group offers. + + The radio parameters of each preset are in modem_preset_registry.proto. + + Data lives in registry/regions.yaml. tools/gen_registry.py validates it and + generates registry/generated/regions.json, which `buf convert` serializes. + Firmware can generate its region table from this data or embed it directly. + + + Regulatory region definition + """ + + DESCRIPTOR: _descriptor.Descriptor + + REGION_CODE_FIELD_NUMBER: _builtins.int + PROFILE_FIELD_NUMBER: _builtins.int + FREQ_START_MHZ_X100_FIELD_NUMBER: _builtins.int + FREQ_END_MHZ_X100_FIELD_NUMBER: _builtins.int + DUTY_CYCLE_FIELD_NUMBER: _builtins.int + ROUTER_DUTY_CYCLE_FIELD_NUMBER: _builtins.int + POWER_LIMIT_DBM_FIELD_NUMBER: _builtins.int + FREQUENCY_SWITCHING_FIELD_NUMBER: _builtins.int + WIDE_LORA_FIELD_NUMBER: _builtins.int + OVERRIDE_SLOT_FIELD_NUMBER: _builtins.int + region_code: _common_pb2.RegionCode.ValueType + """Which region this defines""" + profile: _builtins.str + """Name of the RegionProfile this region uses""" + freq_start_mhz_x100: _builtins.int + """ + Frequency range start in MHz x100 (e.g. 90200 = 902.00 MHz). A finer band edge + is rounded down, 433.075 MHz to 43307; firmware holds the exact value. + """ + freq_end_mhz_x100: _builtins.int + """Frequency range end in MHz x100 (e.g. 92800 = 928.00 MHz), rounded down""" + duty_cycle: _builtins.int + """ + Duty cycle percentage (1-100, where 100 = no duty cycle restriction). A + fractional limit is rounded down, 2.5% to 2; firmware holds the exact value. + """ + router_duty_cycle: _builtins.int + """ + Duty cycle percentage for a node in the ROUTER role, where regulation grants it + more airtime than other nodes. 0 = duty_cycle applies to every role. + """ + power_limit_dbm: _builtins.int + """Maximum TX power in dBm. A licensed operator (User.is_licensed) may exceed it.""" + frequency_switching: _builtins.bool + """Whether frequency hopping/switching is allowed""" + wide_lora: _builtins.bool + """ + Whether this region uses wide LoRa. The boundary is 1 GHz: narrow LoRa is sub-GHz, + wide LoRa above it, and newer chips reach 6 GHz. A wide region needs a + wide-capable radio, and its presets use their wide_bandwidth_khz. Kept as its own + field rather than read from the frequency range, because frequency mixing, or + tuning a wideband transmitter, can open ranges where the band does not decide it. + """ + override_slot: _builtins.int + """ + What this region does while the user has not chosen a slot, which is to say what + LoRaConfig.channel_num = 0 hashes: + 0 the primary channel's name + -1 the preset's name + N > 0 no hash, this region is fixed to slot N, counted from 1 + """ + def __init__( + self, + *, + region_code: _common_pb2.RegionCode.ValueType = ..., + profile: _builtins.str = ..., + freq_start_mhz_x100: _builtins.int = ..., + freq_end_mhz_x100: _builtins.int = ..., + duty_cycle: _builtins.int = ..., + router_duty_cycle: _builtins.int = ..., + power_limit_dbm: _builtins.int = ..., + frequency_switching: _builtins.bool = ..., + wide_lora: _builtins.bool = ..., + override_slot: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["duty_cycle", b"duty_cycle", "freq_end_mhz_x100", b"freq_end_mhz_x100", "freq_start_mhz_x100", b"freq_start_mhz_x100", "frequency_switching", b"frequency_switching", "override_slot", b"override_slot", "power_limit_dbm", b"power_limit_dbm", "profile", b"profile", "region_code", b"region_code", "router_duty_cycle", b"router_duty_cycle", "wide_lora", b"wide_lora"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RegionInfo: _TypeAlias = RegionInfo # noqa: Y015 + +@_typing.final +class RegionProfile(_message.Message): + """ + Parameters shared by every region that uses the profile + """ + + DESCRIPTOR: _descriptor.Descriptor + + NAME_FIELD_NUMBER: _builtins.int + PRESET_LIST_FIELD_NUMBER: _builtins.int + DEFAULT_PRESET_FIELD_NUMBER: _builtins.int + SPACING_KHZ_FIELD_NUMBER: _builtins.int + PADDING_KHZ_FIELD_NUMBER: _builtins.int + AUDIO_PERMITTED_FIELD_NUMBER: _builtins.int + LICENSED_ONLY_FIELD_NUMBER: _builtins.int + POSITION_THROTTLE_FIELD_NUMBER: _builtins.int + TELEMETRY_THROTTLE_FIELD_NUMBER: _builtins.int + DEFAULT_HOP_START_FIELD_NUMBER: _builtins.int + name: _builtins.str + """Name regions refer to this profile by, e.g. "STD", "HAM_20KHZ" """ + preset_list: _builtins.str + """Name of the ModemPresetList this profile permits""" + default_preset: _common_pb2.ModemPreset.ValueType + """ + Preset a region selects when none is set or the current one is not permitted. + One of the presets in preset_list. + """ + spacing_khz: _builtins.int + """Gap between adjacent frequency slots in kHz, rounded down""" + padding_khz: _builtins.int + """ + Guard band on each side of a frequency slot in kHz, rounded down. It widens the + slot beyond the preset bandwidth, placing 62.5 kHz presets on a 100 kHz raster. + """ + audio_permitted: _builtins.bool + """Whether audio mode is permitted""" + licensed_only: _builtins.bool + """ + Only a licensed operator (User.is_licensed) may select a region using this + profile; firmware rejects the region otherwise. + """ + position_throttle: _builtins.int + """Multiplier on the position broadcast interval; 0 and 1 leave it unchanged""" + telemetry_throttle: _builtins.int + """Multiplier on the telemetry broadcast interval; 0 and 1 leave it unchanged""" + default_hop_start: _builtins.int + """ + Hop budget a node launches with on this profile's regions, 1 to 15. This is the + "region default" that ChannelSettings.scope caps SCOPE_REGIONAL at; SCOPE_LOCAL caps + at 2 regardless and SCOPE_GLOBAL at the full 15. Congestion control may raise a + REGIONAL launch to this value and no further. + """ + def __init__( + self, + *, + name: _builtins.str = ..., + preset_list: _builtins.str = ..., + default_preset: _common_pb2.ModemPreset.ValueType = ..., + spacing_khz: _builtins.int = ..., + padding_khz: _builtins.int = ..., + audio_permitted: _builtins.bool = ..., + licensed_only: _builtins.bool = ..., + position_throttle: _builtins.int = ..., + telemetry_throttle: _builtins.int = ..., + default_hop_start: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["audio_permitted", b"audio_permitted", "default_hop_start", b"default_hop_start", "default_preset", b"default_preset", "licensed_only", b"licensed_only", "name", b"name", "padding_khz", b"padding_khz", "position_throttle", b"position_throttle", "preset_list", b"preset_list", "spacing_khz", b"spacing_khz", "telemetry_throttle", b"telemetry_throttle"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RegionProfile: _TypeAlias = RegionProfile # noqa: Y015 + +@_typing.final +class ModemPresetList(_message.Message): + """ + A set of modem presets, shared by every profile that permits exactly this set + """ + + DESCRIPTOR: _descriptor.Descriptor + + NAME_FIELD_NUMBER: _builtins.int + PRESETS_FIELD_NUMBER: _builtins.int + name: _builtins.str + """Name profiles refer to this list by, e.g. "STD", "NARROW" """ + @_builtins.property + def presets(self) -> _containers.RepeatedScalarFieldContainer[_common_pb2.ModemPreset.ValueType]: + """The presets, in ModemPreset order""" + + def __init__( + self, + *, + name: _builtins.str = ..., + presets: _abc.Iterable[_common_pb2.ModemPreset.ValueType] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "presets", b"presets"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___ModemPresetList: _TypeAlias = ModemPresetList # noqa: Y015 + +@_typing.final +class RegionSwapGroup(_message.Message): + """ + EU short-range device regions a node moves between by preset. Members permit + mutually exclusive preset lists: selecting a preset that only a sibling permits + switches the node to that sibling region, so a client offers the union of the + members' presets in each of them. + + Members need not share a frequency range. EU_868 and EU_N_868 overlap, while + EU_866 is a bespoke RFID band that overlaps neither. EU_874 and EU_917 follow + the same pattern if they are allocated. + """ + + DESCRIPTOR: _descriptor.Descriptor + + REGIONS_FIELD_NUMBER: _builtins.int + @_builtins.property + def regions(self) -> _containers.RepeatedScalarFieldContainer[_common_pb2.RegionCode.ValueType]: + """The member regions""" + + def __init__( + self, + *, + regions: _abc.Iterable[_common_pb2.RegionCode.ValueType] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["regions", b"regions"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RegionSwapGroup: _TypeAlias = RegionSwapGroup # noqa: Y015 + +@_typing.final +class RegionRegistry(_message.Message): + """ + The complete region registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + REGIONS_FIELD_NUMBER: _builtins.int + PROFILES_FIELD_NUMBER: _builtins.int + PRESET_LISTS_FIELD_NUMBER: _builtins.int + SWAP_GROUPS_FIELD_NUMBER: _builtins.int + REVISION_FIELD_NUMBER: _builtins.int + revision: _builtins.int + """ + Raised by every change to the data. CI rejects a change that leaves it where it + was, so a client can tell whether its bundled copy is current. + """ + @_builtins.property + def regions(self) -> _containers.RepeatedCompositeFieldContainer[Global___RegionInfo]: + """Every region with a definition""" + + @_builtins.property + def profiles(self) -> _containers.RepeatedCompositeFieldContainer[Global___RegionProfile]: + """Every profile a region uses""" + + @_builtins.property + def preset_lists(self) -> _containers.RepeatedCompositeFieldContainer[Global___ModemPresetList]: + """Every preset list a profile uses""" + + @_builtins.property + def swap_groups(self) -> _containers.RepeatedCompositeFieldContainer[Global___RegionSwapGroup]: + """Every group of regions that swap into each other""" + + def __init__( + self, + *, + regions: _abc.Iterable[Global___RegionInfo] | None = ..., + profiles: _abc.Iterable[Global___RegionProfile] | None = ..., + preset_lists: _abc.Iterable[Global___ModemPresetList] | None = ..., + swap_groups: _abc.Iterable[Global___RegionSwapGroup] | None = ..., + revision: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["preset_lists", b"preset_lists", "profiles", b"profiles", "regions", b"regions", "revision", b"revision", "swap_groups", b"swap_groups"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RegionRegistry: _TypeAlias = RegionRegistry # noqa: Y015 diff --git a/meshtastic/protobuf/remote_hardware_pb2.py b/meshtastic/protobuf/remote_hardware_pb2.py index dab1f09c0..29be815e6 100644 --- a/meshtastic/protobuf/remote_hardware_pb2.py +++ b/meshtastic/protobuf/remote_hardware_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/remote_hardware.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -19,8 +20,8 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.remote_hardware_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_HARDWAREMESSAGE']._serialized_start=67 _globals['_HARDWAREMESSAGE']._serialized_end=290 _globals['_HARDWAREMESSAGE_TYPE']._serialized_start=182 diff --git a/meshtastic/protobuf/remote_hardware_pb2.pyi b/meshtastic/protobuf/remote_hardware_pb2.pyi index c2f7afa04..42e09baea 100644 --- a/meshtastic/protobuf/remote_hardware_pb2.pyi +++ b/meshtastic/protobuf/remote_hardware_pb2.pyi @@ -3,42 +3,43 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class HardwareMessage(google.protobuf.message.Message): +@_typing.final +class HardwareMessage(_message.Message): """ An example app to show off the module system. This message is used for REMOTE_HARDWARE_APP PortNums. Also provides easy remote access to any GPIO. In the future other remote hardware operations can be added based on user interest (i.e. serial output, spi/i2c input/output). - FIXME - currently this feature is turned on by default which is dangerous - because no security yet (beyond the channel mechanism). - It should be off by default and then protected based on some TBD mechanism - (a special channel once multichannel support is included?) + + The module is off by default, and a node that enables it must reject any HardwareMessage + that did not arrive as a PKI direct message from a key listed in + RemoteHardwareConfig.authorized_key. A channel key authorises everyone on the channel, which + for remote GPIO is no authorisation at all. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Type: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _TypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[HardwareMessage._Type.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _TypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[HardwareMessage._Type.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNSET: HardwareMessage._Type.ValueType # 0 """ Unset/unused @@ -68,7 +69,7 @@ class HardwareMessage(google.protobuf.message.Message): class Type(_Type, metaclass=_TypeEnumTypeWrapper): """ - TODO: REPLACE + The type of remote hardware GPIO operation being requested or reported """ UNSET: HardwareMessage.Type.ValueType # 0 @@ -98,18 +99,20 @@ class HardwareMessage(google.protobuf.message.Message): A reply to READ_GPIOS. gpio_mask and gpio_value will be populated """ - TYPE_FIELD_NUMBER: builtins.int - GPIO_MASK_FIELD_NUMBER: builtins.int - GPIO_VALUE_FIELD_NUMBER: builtins.int - type: global___HardwareMessage.Type.ValueType + TYPE_FIELD_NUMBER: _builtins.int + GPIO_MASK_FIELD_NUMBER: _builtins.int + GPIO_VALUE_FIELD_NUMBER: _builtins.int + type: Global___HardwareMessage.Type.ValueType """ What type of HardwareMessage is this? """ - gpio_mask: builtins.int + gpio_mask: _builtins.int """ - What gpios are we changing. Not used for all MessageTypes, see MessageType for details + What gpios are we changing. Not used for all MessageTypes, see MessageType for details. + Bit N is pin N, so an addressable pin number is 0 to 63 - the bound that + RemoteHardwarePin.gpio_pin carries. """ - gpio_value: builtins.int + gpio_value: _builtins.int """ For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios. Not used for all MessageTypes, see MessageType for details @@ -117,10 +120,14 @@ class HardwareMessage(google.protobuf.message.Message): def __init__( self, *, - type: global___HardwareMessage.Type.ValueType = ..., - gpio_mask: builtins.int = ..., - gpio_value: builtins.int = ..., + type: Global___HardwareMessage.Type.ValueType = ..., + gpio_mask: _builtins.int = ..., + gpio_value: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["gpio_mask", b"gpio_mask", "gpio_value", b"gpio_value", "type", b"type"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["gpio_mask", b"gpio_mask", "gpio_value", b"gpio_value", "type", b"type"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___HardwareMessage = HardwareMessage +Global___HardwareMessage: _TypeAlias = HardwareMessage # noqa: Y015 diff --git a/meshtastic/protobuf/rtttl_pb2.py b/meshtastic/protobuf/rtttl_pb2.py index 95039ed8b..f5aa49c54 100644 --- a/meshtastic/protobuf/rtttl_pb2.py +++ b/meshtastic/protobuf/rtttl_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/rtttl.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -20,10 +21,10 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.rtttl_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _RTTTLCONFIG.fields_by_name['ringtone']._options = None - _RTTTLCONFIG.fields_by_name['ringtone']._serialized_options = b'\222?\003\010\347\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_RTTTLCONFIG'].fields_by_name['ringtone']._options = None + _globals['_RTTTLCONFIG'].fields_by_name['ringtone']._serialized_options = b'\222?\003\010\347\001' _globals['_RTTTLCONFIG']._serialized_start=90 _globals['_RTTTLCONFIG']._serialized_end=129 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/rtttl_pb2.pyi b/meshtastic/protobuf/rtttl_pb2.pyi index fe91f94de..995d7dccc 100644 --- a/meshtastic/protobuf/rtttl_pb2.pyi +++ b/meshtastic/protobuf/rtttl_pb2.pyi @@ -3,31 +3,41 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.message -import typing +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +import builtins as _builtins +import sys +import typing as _typing -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -@typing.final -class RTTTLConfig(google.protobuf.message.Message): +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class RTTTLConfig(_message.Message): """ - Canned message module configuration. + Ringtone module configuration. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - RINGTONE_FIELD_NUMBER: builtins.int - ringtone: builtins.str + RINGTONE_FIELD_NUMBER: _builtins.int + ringtone: _builtins.str """ Ringtone for PWM Buzzer in RTTTL Format. """ def __init__( self, *, - ringtone: builtins.str = ..., + ringtone: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["ringtone", b"ringtone"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ringtone", b"ringtone"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___RTTTLConfig = RTTTLConfig +Global___RTTTLConfig: _TypeAlias = RTTTLConfig # noqa: Y015 diff --git a/meshtastic/protobuf/serial_hal_pb2.py b/meshtastic/protobuf/serial_hal_pb2.py index 2fe775c67..fb51b6676 100644 --- a/meshtastic/protobuf/serial_hal_pb2.py +++ b/meshtastic/protobuf/serial_hal_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/serial_hal.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,26 +15,34 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/serial_hal.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xb3\x02\n\x10SerialHalCommand\x12\x16\n\x0etransaction_id\x18\x01 \x01(\r\x12\x38\n\x04type\x18\x02 \x01(\x0e\x32*.meshtastic.protobuf.SerialHalCommand.Type\x12\x0b\n\x03pin\x18\x03 \x01(\r\x12\r\n\x05value\x18\x04 \x01(\r\x12\x0c\n\x04mode\x18\x05 \x01(\r\x12\x14\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x04\"\x8c\x01\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08PIN_MODE\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x12\x10\n\x0c\x44IGITAL_READ\x10\x03\x12\x14\n\x10\x41TTACH_INTERRUPT\x10\x04\x12\x14\n\x10\x44\x45TACH_INTERRUPT\x10\x05\x12\x10\n\x0cSPI_TRANSFER\x10\x06\x12\x08\n\x04NOOP\x10\x07\"\xe4\x01\n\x11SerialHalResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\r\x12=\n\x06result\x18\x02 \x01(\x0e\x32-.meshtastic.protobuf.SerialHalResponse.Result\x12\r\n\x05value\x18\x03 \x01(\r\x12\x14\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x04\x12\x14\n\x05\x65rror\x18\x05 \x01(\tB\x05\x92?\x02\x08P\"=\n\x06Result\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10\x02\x12\x0f\n\x0bUNSUPPORTED\x10\x03\x42_\n\x14org.meshtastic.protoB\tSerialHalZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/serial_hal.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xc8\x02\n\x10SerialHalCommand\x12\x16\n\x0etransaction_id\x18\x01 \x01(\r\x12?\n\x04type\x18\x02 \x01(\x0e\x32*.meshtastic.protobuf.SerialHalCommand.TypeB\x05\x92?\x02\x38\x08\x12\x12\n\x03pin\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\r\n\x05value\x18\x04 \x01(\r\x12\x13\n\x04mode\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x04\"\x8c\x01\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08PIN_MODE\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x12\x10\n\x0c\x44IGITAL_READ\x10\x03\x12\x14\n\x10\x41TTACH_INTERRUPT\x10\x04\x12\x14\n\x10\x44\x45TACH_INTERRUPT\x10\x05\x12\x10\n\x0cSPI_TRANSFER\x10\x06\x12\x08\n\x04NOOP\x10\x07\"\xeb\x01\n\x11SerialHalResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\r\x12\x44\n\x06result\x18\x02 \x01(\x0e\x32-.meshtastic.protobuf.SerialHalResponse.ResultB\x05\x92?\x02\x38\x08\x12\r\n\x05value\x18\x03 \x01(\r\x12\x14\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x04\x12\x14\n\x05\x65rror\x18\x05 \x01(\tB\x05\x92?\x02\x08P\"=\n\x06Result\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10\x02\x12\x0f\n\x0bUNSUPPORTED\x10\x03\x42_\n\x14org.meshtastic.protoB\tSerialHalZ\"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.serial_hal_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\tSerialHalZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _SERIALHALCOMMAND.fields_by_name['data']._options = None - _SERIALHALCOMMAND.fields_by_name['data']._serialized_options = b'\222?\003\010\200\004' - _SERIALHALRESPONSE.fields_by_name['data']._options = None - _SERIALHALRESPONSE.fields_by_name['data']._serialized_options = b'\222?\003\010\200\004' - _SERIALHALRESPONSE.fields_by_name['error']._options = None - _SERIALHALRESPONSE.fields_by_name['error']._serialized_options = b'\222?\002\010P' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\tSerialHalZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_SERIALHALCOMMAND'].fields_by_name['type']._options = None + _globals['_SERIALHALCOMMAND'].fields_by_name['type']._serialized_options = b'\222?\0028\010' + _globals['_SERIALHALCOMMAND'].fields_by_name['pin']._options = None + _globals['_SERIALHALCOMMAND'].fields_by_name['pin']._serialized_options = b'\222?\0028\010' + _globals['_SERIALHALCOMMAND'].fields_by_name['mode']._options = None + _globals['_SERIALHALCOMMAND'].fields_by_name['mode']._serialized_options = b'\222?\0028\010' + _globals['_SERIALHALCOMMAND'].fields_by_name['data']._options = None + _globals['_SERIALHALCOMMAND'].fields_by_name['data']._serialized_options = b'\222?\003\010\200\004' + _globals['_SERIALHALRESPONSE'].fields_by_name['result']._options = None + _globals['_SERIALHALRESPONSE'].fields_by_name['result']._serialized_options = b'\222?\0028\010' + _globals['_SERIALHALRESPONSE'].fields_by_name['data']._options = None + _globals['_SERIALHALRESPONSE'].fields_by_name['data']._serialized_options = b'\222?\003\010\200\004' + _globals['_SERIALHALRESPONSE'].fields_by_name['error']._options = None + _globals['_SERIALHALRESPONSE'].fields_by_name['error']._serialized_options = b'\222?\002\010P' _globals['_SERIALHALCOMMAND']._serialized_start=96 - _globals['_SERIALHALCOMMAND']._serialized_end=403 - _globals['_SERIALHALCOMMAND_TYPE']._serialized_start=263 - _globals['_SERIALHALCOMMAND_TYPE']._serialized_end=403 - _globals['_SERIALHALRESPONSE']._serialized_start=406 - _globals['_SERIALHALRESPONSE']._serialized_end=634 - _globals['_SERIALHALRESPONSE_RESULT']._serialized_start=573 - _globals['_SERIALHALRESPONSE_RESULT']._serialized_end=634 + _globals['_SERIALHALCOMMAND']._serialized_end=424 + _globals['_SERIALHALCOMMAND_TYPE']._serialized_start=284 + _globals['_SERIALHALCOMMAND_TYPE']._serialized_end=424 + _globals['_SERIALHALRESPONSE']._serialized_start=427 + _globals['_SERIALHALRESPONSE']._serialized_end=662 + _globals['_SERIALHALRESPONSE_RESULT']._serialized_start=601 + _globals['_SERIALHALRESPONSE_RESULT']._serialized_end=662 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/serial_hal_pb2.pyi b/meshtastic/protobuf/serial_hal_pb2.pyi index 33d75cba9..0f6089348 100644 --- a/meshtastic/protobuf/serial_hal_pb2.pyi +++ b/meshtastic/protobuf/serial_hal_pb2.pyi @@ -3,22 +3,22 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class SerialHalCommand(google.protobuf.message.Message): +@_typing.final +class SerialHalCommand(_message.Message): """SerialHalCommand messages are sent from host to device over the SerialHal framing stream. Responses normally come back as SerialHalResponse with the same transaction_id. @@ -29,14 +29,14 @@ class SerialHalCommand(google.protobuf.message.Message): than replies to an outstanding request. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor class _Type: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _TypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SerialHalCommand._Type.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _TypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SerialHalCommand._Type.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor UNSET: SerialHalCommand._Type.ValueType # 0 PIN_MODE: SerialHalCommand._Type.ValueType # 1 DIGITAL_WRITE: SerialHalCommand._Type.ValueType # 2 @@ -56,45 +56,49 @@ class SerialHalCommand(google.protobuf.message.Message): SPI_TRANSFER: SerialHalCommand.Type.ValueType # 6 NOOP: SerialHalCommand.Type.ValueType # 7 - TRANSACTION_ID_FIELD_NUMBER: builtins.int - TYPE_FIELD_NUMBER: builtins.int - PIN_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - MODE_FIELD_NUMBER: builtins.int - DATA_FIELD_NUMBER: builtins.int - transaction_id: builtins.int + TRANSACTION_ID_FIELD_NUMBER: _builtins.int + TYPE_FIELD_NUMBER: _builtins.int + PIN_FIELD_NUMBER: _builtins.int + VALUE_FIELD_NUMBER: _builtins.int + MODE_FIELD_NUMBER: _builtins.int + DATA_FIELD_NUMBER: _builtins.int + transaction_id: _builtins.int """Host-assigned request id. Replies echo this id back in SerialHalResponse.transaction_id. """ - type: global___SerialHalCommand.Type.ValueType - pin: builtins.int - value: builtins.int - mode: builtins.int - data: builtins.bytes + type: Global___SerialHalCommand.Type.ValueType + pin: _builtins.int + value: _builtins.int + mode: _builtins.int + data: _builtins.bytes def __init__( self, *, - transaction_id: builtins.int = ..., - type: global___SerialHalCommand.Type.ValueType = ..., - pin: builtins.int = ..., - value: builtins.int = ..., - mode: builtins.int = ..., - data: builtins.bytes = ..., + transaction_id: _builtins.int = ..., + type: Global___SerialHalCommand.Type.ValueType = ..., + pin: _builtins.int = ..., + value: _builtins.int = ..., + mode: _builtins.int = ..., + data: _builtins.bytes = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["data", b"data", "mode", b"mode", "pin", b"pin", "transaction_id", b"transaction_id", "type", b"type", "value", b"value"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["data", b"data", "mode", b"mode", "pin", b"pin", "transaction_id", b"transaction_id", "type", b"type", "value", b"value"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___SerialHalCommand = SerialHalCommand +Global___SerialHalCommand: _TypeAlias = SerialHalCommand # noqa: Y015 -@typing.final -class SerialHalResponse(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class SerialHalResponse(_message.Message): + DESCRIPTOR: _descriptor.Descriptor class _Result: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _ResultEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SerialHalResponse._Result.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _ResultEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SerialHalResponse._Result.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor OK: SerialHalResponse._Result.ValueType # 0 ERROR: SerialHalResponse._Result.ValueType # 1 BAD_REQUEST: SerialHalResponse._Result.ValueType # 2 @@ -106,12 +110,12 @@ class SerialHalResponse(google.protobuf.message.Message): BAD_REQUEST: SerialHalResponse.Result.ValueType # 2 UNSUPPORTED: SerialHalResponse.Result.ValueType # 3 - TRANSACTION_ID_FIELD_NUMBER: builtins.int - RESULT_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - DATA_FIELD_NUMBER: builtins.int - ERROR_FIELD_NUMBER: builtins.int - transaction_id: builtins.int + TRANSACTION_ID_FIELD_NUMBER: _builtins.int + RESULT_FIELD_NUMBER: _builtins.int + VALUE_FIELD_NUMBER: _builtins.int + DATA_FIELD_NUMBER: _builtins.int + ERROR_FIELD_NUMBER: _builtins.int + transaction_id: _builtins.int """Matches the originating SerialHalCommand.transaction_id for normal request/response traffic. @@ -119,22 +123,26 @@ class SerialHalResponse(google.protobuf.message.Message): the device. In that case, the host should interpret value as the GPIO pin that triggered. """ - result: global___SerialHalResponse.Result.ValueType - value: builtins.int + result: Global___SerialHalResponse.Result.ValueType + value: _builtins.int """Used by DIGITAL_READ replies and interrupt notifications. For interrupt notifications (transaction_id == 0), this carries the pin number. """ - data: builtins.bytes - error: builtins.str + data: _builtins.bytes + error: _builtins.str def __init__( self, *, - transaction_id: builtins.int = ..., - result: global___SerialHalResponse.Result.ValueType = ..., - value: builtins.int = ..., - data: builtins.bytes = ..., - error: builtins.str = ..., + transaction_id: _builtins.int = ..., + result: Global___SerialHalResponse.Result.ValueType = ..., + value: _builtins.int = ..., + data: _builtins.bytes = ..., + error: _builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["data", b"data", "error", b"error", "result", b"result", "transaction_id", b"transaction_id", "value", b"value"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["data", b"data", "error", b"error", "result", b"result", "transaction_id", b"transaction_id", "value", b"value"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___SerialHalResponse = SerialHalResponse +Global___SerialHalResponse: _TypeAlias = SerialHalResponse # noqa: Y015 diff --git a/meshtastic/protobuf/storeforward_pb2.py b/meshtastic/protobuf/storeforward_pb2.py index 83fb87bc3..528bf666d 100644 --- a/meshtastic/protobuf/storeforward_pb2.py +++ b/meshtastic/protobuf/storeforward_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/storeforward.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,24 +15,50 @@ 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&meshtastic/protobuf/storeforward.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xee\x01\n\x0bStoredFrame\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02id\x18\x02 \x01(\x07\x12 \n\x0c\x63hannel_hash\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x0f\n\x02to\x18\x04 \x01(\x07H\x01\x88\x01\x01\x12\x18\n\thop_start\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0eheader_options\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\nciphertext\x18\x08 \x01(\x0c\x42\x06\x92?\x03\x08\xf0\x01\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x42\x0f\n\r_channel_hashB\x05\n\x03_to\"\xf0\x07\n\x0fStoreAndForward\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.StoreAndForward.Type\x12\x41\n\x08\x61nnounce\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.AnnounceH\x00\x12\x39\n\x04sync\x18\x03 \x01(\x0b\x32).meshtastic.protobuf.StoreAndForward.SyncH\x00\x12\x31\n\x05\x66rame\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.StoredFrameH\x00\x12\x42\n\tsync_done\x18\x05 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.SyncDoneH\x00\x12\x18\n\tremaining\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x1a`\n\x06\x43ursor\x12 \n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x12\n\nsince_time\x18\x02 \x01(\x07\x12\x0f\n\x07last_id\x18\x03 \x01(\x07\x42\x0f\n\r_channel_hash\x1a\xd2\x01\n\x08\x41nnounce\x12\x0e\n\x06server\x18\x06 \x01(\x07\x12\x1e\n\rserved_hashes\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x16\n\x0eoldest_rx_time\x18\x02 \x01(\x07\x12\x14\n\x0cmax_per_sync\x18\x03 \x01(\r\x12\x10\n\x08\x63\x61pacity\x18\x04 \x01(\r\x12\x0c\n\x04held\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"9\n\x05\x46lags\x12\x11\n\rANNOUNCE_NONE\x10\x00\x12\x1d\n\x19\x41NNOUNCE_SERVES_DISCOVERY\x10\x01\x1au\n\x04Sync\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nmax_frames\x18\x02 \x01(\r\x12\x14\n\x0c\x66lagged_only\x18\x03 \x01(\x08\x1a\x7f\n\x08SyncDone\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\x1b\n\ngap_hashes\x18\x03 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"[\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41NNOUNCE\x10\x01\x12\x08\n\x04SYNC\x10\x02\x12\t\n\x05\x46RAME\x10\x03\x12\r\n\tSYNC_DONE\x10\x04\x12\t\n\x05\x41\x42ORT\x10\x05\x12\x0b\n\x07REFUSED\x10\x06\x42\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.storeforward_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _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=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 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_STOREDFRAME'].fields_by_name['channel_hash']._options = None + _globals['_STOREDFRAME'].fields_by_name['channel_hash']._serialized_options = b'\222?\0028\010' + _globals['_STOREDFRAME'].fields_by_name['hop_start']._options = None + _globals['_STOREDFRAME'].fields_by_name['hop_start']._serialized_options = b'\222?\0028\010' + _globals['_STOREDFRAME'].fields_by_name['flags']._options = None + _globals['_STOREDFRAME'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_STOREDFRAME'].fields_by_name['header_options']._options = None + _globals['_STOREDFRAME'].fields_by_name['header_options']._serialized_options = b'\222?\002\010 ' + _globals['_STOREDFRAME'].fields_by_name['ciphertext']._options = None + _globals['_STOREDFRAME'].fields_by_name['ciphertext']._serialized_options = b'\222?\003\010\360\001' + _globals['_STOREANDFORWARD_CURSOR'].fields_by_name['channel_hash']._options = None + _globals['_STOREANDFORWARD_CURSOR'].fields_by_name['channel_hash']._serialized_options = b'\222?\0028\010' + _globals['_STOREANDFORWARD_ANNOUNCE'].fields_by_name['served_hashes']._options = None + _globals['_STOREANDFORWARD_ANNOUNCE'].fields_by_name['served_hashes']._serialized_options = b'\222?\004\020\0208\010' + _globals['_STOREANDFORWARD_SYNC'].fields_by_name['cursors']._options = None + _globals['_STOREANDFORWARD_SYNC'].fields_by_name['cursors']._serialized_options = b'\222?\002\020\021' + _globals['_STOREANDFORWARD_SYNCDONE'].fields_by_name['cursors']._options = None + _globals['_STOREANDFORWARD_SYNCDONE'].fields_by_name['cursors']._serialized_options = b'\222?\002\020\021' + _globals['_STOREANDFORWARD_SYNCDONE'].fields_by_name['gap_hashes']._options = None + _globals['_STOREANDFORWARD_SYNCDONE'].fields_by_name['gap_hashes']._serialized_options = b'\222?\004\020\0208\010' + _globals['_STOREANDFORWARD'].fields_by_name['remaining']._options = None + _globals['_STOREANDFORWARD'].fields_by_name['remaining']._serialized_options = b'\222?\0028\020' + _globals['_STOREDFRAME']._serialized_start=98 + _globals['_STOREDFRAME']._serialized_end=336 + _globals['_STOREANDFORWARD']._serialized_start=339 + _globals['_STOREANDFORWARD']._serialized_end=1347 + _globals['_STOREANDFORWARD_CURSOR']._serialized_start=686 + _globals['_STOREANDFORWARD_CURSOR']._serialized_end=782 + _globals['_STOREANDFORWARD_ANNOUNCE']._serialized_start=785 + _globals['_STOREANDFORWARD_ANNOUNCE']._serialized_end=995 + _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_start=938 + _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_end=995 + _globals['_STOREANDFORWARD_SYNC']._serialized_start=997 + _globals['_STOREANDFORWARD_SYNC']._serialized_end=1114 + _globals['_STOREANDFORWARD_SYNCDONE']._serialized_start=1116 + _globals['_STOREANDFORWARD_SYNCDONE']._serialized_end=1243 + _globals['_STOREANDFORWARD_TYPE']._serialized_start=1245 + _globals['_STOREANDFORWARD_TYPE']._serialized_end=1336 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/storeforward_pb2.pyi b/meshtastic/protobuf/storeforward_pb2.pyi index 89cf46ff8..8092dda02 100644 --- a/meshtastic/protobuf/storeforward_pb2.pyi +++ b/meshtastic/protobuf/storeforward_pb2.pyi @@ -3,349 +3,451 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class StoreAndForward(google.protobuf.message.Message): +@_typing.final +class StoredFrame(_message.Message): """ - TODO: REPLACE + A frame as a store-and-forward server kept it: the v3 header fields the AEAD's + additional authenticated data covers, plus the ciphertext and tag. The server decrypts + nothing and holds no channel key. A client rebuilds the AAD from these fields, verifies + the tag with its own keys, and treats what comes out exactly as a live receive - which + is also why a replayed frame keeps its XEdDSA signature and its original sender. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - class _RequestResponse: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + FROM_FIELD_NUMBER: _builtins.int + ID_FIELD_NUMBER: _builtins.int + CHANNEL_HASH_FIELD_NUMBER: _builtins.int + TO_FIELD_NUMBER: _builtins.int + HOP_START_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + HEADER_OPTIONS_FIELD_NUMBER: _builtins.int + CIPHERTEXT_FIELD_NUMBER: _builtins.int + RX_TIME_FIELD_NUMBER: _builtins.int + id: _builtins.int + """ + Header id, as launched. The cursor is (rx_time, id). + """ + channel_hash: _builtins.int + """ + Header chan on a stored BCAST frame; absent on a stored UCAST frame. + """ + to: _builtins.int + """ + Header to on a stored UCAST frame; absent on a stored BCAST frame. + """ + hop_start: _builtins.int + """ + Header flags.hop_start as launched, which the AAD covers. + """ + flags: _builtins.int + """ + Originator flags as launched: a bitwise OR of MeshPacket.Flags values, limited to + the bits the header carries and the AAD covers - PACKET_RECORD_PATH and + PACKET_WANT_ACK. PACKET_VIA_MQTT is outside the AAD and is not stored. + """ + header_options: _builtins.bytes + """ + The frame's options block, verbatim. Never decoded and re-encoded: nanopb drops + unknown fields, and a re-encode would break the tag (SCHEMA.md §8). A server drops + rather than stores a frame whose block exceeds the 64-byte cap here, which is + deliberately below the 255 a frame allows. + """ + ciphertext: _builtins.bytes + """ + Frame ciphertext and authentication tag, exactly as received. + """ + rx_time: _builtins.int + """ + Server receive time, epoch seconds. With id, this is the cursor. + """ + def __init__( + self, + *, + id: _builtins.int = ..., + channel_hash: _builtins.int | None = ..., + to: _builtins.int | None = ..., + hop_start: _builtins.int = ..., + flags: _builtins.int = ..., + header_options: _builtins.bytes = ..., + ciphertext: _builtins.bytes = ..., + rx_time: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash", "_to", b"_to", "channel_hash", b"channel_hash", "to", b"to"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash", "_to", b"_to", "channel_hash", b"channel_hash", "ciphertext", b"ciphertext", "flags", b"flags", "from", b"from", "header_options", b"header_options", "hop_start", b"hop_start", "id", b"id", "rx_time", b"rx_time", "to", b"to"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__channel_hash: _TypeAlias = _typing.Literal["channel_hash"] # noqa: Y015 + _WhichOneofArgType__channel_hash: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash"] # noqa: Y015 + _WhichOneofReturnType__to: _TypeAlias = _typing.Literal["to"] # noqa: Y015 + _WhichOneofArgType__to: _TypeAlias = _typing.Literal["_to", b"_to"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_hash) -> _WhichOneofReturnType__channel_hash | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__to) -> _WhichOneofReturnType__to | None: ... + +Global___StoredFrame: _TypeAlias = StoredFrame # noqa: Y015 + +@_typing.final +class StoreAndForward(_message.Message): + """ + Store and forward control and replay, all of it on STORE_FORWARD_APP. + + ANNOUNCE is a broadcast; everything else is a PKI direct message between one client + and one server. A server replays one frame per packet with want_ack and advances the + client's cursor only when that ack arrives, so a lost replay is resent rather than + silently skipped. + """ + + DESCRIPTOR: _descriptor.Descriptor - class _RequestResponseEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[StoreAndForward._RequestResponse.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSET: StoreAndForward._RequestResponse.ValueType # 0 + class _Type: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _TypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[StoreAndForward._Type.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + UNSET: StoreAndForward._Type.ValueType # 0 """ Unset/unused """ - ROUTER_ERROR: StoreAndForward._RequestResponse.ValueType # 1 - """ - Router is an in error state. - """ - ROUTER_HEARTBEAT: StoreAndForward._RequestResponse.ValueType # 2 - """ - Router heartbeat - """ - ROUTER_PING: StoreAndForward._RequestResponse.ValueType # 3 - """ - Router has requested the client respond. This can work as a - "are you there" message. - """ - ROUTER_PONG: StoreAndForward._RequestResponse.ValueType # 4 - """ - The response to a "Ping" - """ - ROUTER_BUSY: StoreAndForward._RequestResponse.ValueType # 5 - """ - Router is currently busy. Please try again later. - """ - ROUTER_HISTORY: StoreAndForward._RequestResponse.ValueType # 6 - """ - Router is responding to a request for history. - """ - ROUTER_STATS: StoreAndForward._RequestResponse.ValueType # 7 + ANNOUNCE: StoreAndForward._Type.ValueType # 1 """ - Router is responding to a request for stats. + Server: what it keeps and how far back. Unlike every other message here, an + ANNOUNCE does not travel as an addressed packet on this port: it rides the MINI + header profile, a five-byte anonymous frame - a pip - because a beacon nobody + replies to has no business paying for addressing. The MINI frame carries no + `from`, so Announce.server names the node to sync with. """ - ROUTER_TEXT_DIRECT: StoreAndForward._RequestResponse.ValueType # 8 + SYNC: StoreAndForward._Type.ValueType # 2 """ - Router sends a text message from its history that was a direct message. + Client to server: where each of the client's streams stands. """ - ROUTER_TEXT_BROADCAST: StoreAndForward._RequestResponse.ValueType # 9 + FRAME: StoreAndForward._Type.ValueType # 3 """ - Router sends a text message from its history that was a broadcast. + Server to client: one StoredFrame, sent with want_ack. """ - CLIENT_ERROR: StoreAndForward._RequestResponse.ValueType # 64 + SYNC_DONE: StoreAndForward._Type.ValueType # 4 """ - Client is an in error state. + Server to client: end of this sync round, with the cursors it reached. """ - CLIENT_HISTORY: StoreAndForward._RequestResponse.ValueType # 65 + ABORT: StoreAndForward._Type.ValueType # 5 """ - Client has requested a replay from the router. + Client to server: stop sending. The server keeps the acked positions. """ - CLIENT_STATS: StoreAndForward._RequestResponse.ValueType # 66 + REFUSED: StoreAndForward._Type.ValueType # 6 """ - Client has requested stats from the router. - """ - CLIENT_PING: StoreAndForward._RequestResponse.ValueType # 67 - """ - Client has requested the router respond. This can work as a - "are you there" message. - """ - CLIENT_PONG: StoreAndForward._RequestResponse.ValueType # 68 - """ - The response to a "Ping" - """ - CLIENT_ABORT: StoreAndForward._RequestResponse.ValueType # 106 - """ - Client has requested that the router abort processing the client's request + Server to client: refused, because it is busy, rate limiting, or does not serve + this client. """ - class RequestResponse(_RequestResponse, metaclass=_RequestResponseEnumTypeWrapper): + class Type(_Type, metaclass=_TypeEnumTypeWrapper): """ - 001 - 063 = From Router - 064 - 127 = From Client + Which message this is. """ - UNSET: StoreAndForward.RequestResponse.ValueType # 0 + UNSET: StoreAndForward.Type.ValueType # 0 """ Unset/unused """ - ROUTER_ERROR: StoreAndForward.RequestResponse.ValueType # 1 - """ - Router is an in error state. - """ - ROUTER_HEARTBEAT: StoreAndForward.RequestResponse.ValueType # 2 - """ - Router heartbeat - """ - ROUTER_PING: StoreAndForward.RequestResponse.ValueType # 3 - """ - Router has requested the client respond. This can work as a - "are you there" message. - """ - ROUTER_PONG: StoreAndForward.RequestResponse.ValueType # 4 - """ - The response to a "Ping" + ANNOUNCE: StoreAndForward.Type.ValueType # 1 """ - ROUTER_BUSY: StoreAndForward.RequestResponse.ValueType # 5 + Server: what it keeps and how far back. Unlike every other message here, an + ANNOUNCE does not travel as an addressed packet on this port: it rides the MINI + header profile, a five-byte anonymous frame - a pip - because a beacon nobody + replies to has no business paying for addressing. The MINI frame carries no + `from`, so Announce.server names the node to sync with. """ - Router is currently busy. Please try again later. + SYNC: StoreAndForward.Type.ValueType # 2 """ - ROUTER_HISTORY: StoreAndForward.RequestResponse.ValueType # 6 + Client to server: where each of the client's streams stands. """ - Router is responding to a request for history. + FRAME: StoreAndForward.Type.ValueType # 3 """ - ROUTER_STATS: StoreAndForward.RequestResponse.ValueType # 7 + Server to client: one StoredFrame, sent with want_ack. """ - Router is responding to a request for stats. + SYNC_DONE: StoreAndForward.Type.ValueType # 4 """ - ROUTER_TEXT_DIRECT: StoreAndForward.RequestResponse.ValueType # 8 + Server to client: end of this sync round, with the cursors it reached. """ - Router sends a text message from its history that was a direct message. + ABORT: StoreAndForward.Type.ValueType # 5 """ - ROUTER_TEXT_BROADCAST: StoreAndForward.RequestResponse.ValueType # 9 + Client to server: stop sending. The server keeps the acked positions. """ - Router sends a text message from its history that was a broadcast. + REFUSED: StoreAndForward.Type.ValueType # 6 """ - CLIENT_ERROR: StoreAndForward.RequestResponse.ValueType # 64 - """ - Client is an in error state. - """ - CLIENT_HISTORY: StoreAndForward.RequestResponse.ValueType # 65 - """ - Client has requested a replay from the router. - """ - CLIENT_STATS: StoreAndForward.RequestResponse.ValueType # 66 - """ - Client has requested stats from the router. - """ - CLIENT_PING: StoreAndForward.RequestResponse.ValueType # 67 - """ - Client has requested the router respond. This can work as a - "are you there" message. - """ - CLIENT_PONG: StoreAndForward.RequestResponse.ValueType # 68 - """ - The response to a "Ping" - """ - CLIENT_ABORT: StoreAndForward.RequestResponse.ValueType # 106 - """ - Client has requested that the router abort processing the client's request + Server to client: refused, because it is busy, rate limiting, or does not serve + this client. """ - @typing.final - class Statistics(google.protobuf.message.Message): + @_typing.final + class Cursor(_message.Message): """ - TODO: REPLACE + Position in one stream. A stream is one channel hash, or the client's own direct + messages when channel_hash is absent. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - MESSAGES_TOTAL_FIELD_NUMBER: builtins.int - MESSAGES_SAVED_FIELD_NUMBER: builtins.int - MESSAGES_MAX_FIELD_NUMBER: builtins.int - UP_TIME_FIELD_NUMBER: builtins.int - REQUESTS_FIELD_NUMBER: builtins.int - REQUESTS_HISTORY_FIELD_NUMBER: builtins.int - HEARTBEAT_FIELD_NUMBER: builtins.int - RETURN_MAX_FIELD_NUMBER: builtins.int - RETURN_WINDOW_FIELD_NUMBER: builtins.int - messages_total: builtins.int + CHANNEL_HASH_FIELD_NUMBER: _builtins.int + SINCE_TIME_FIELD_NUMBER: _builtins.int + LAST_ID_FIELD_NUMBER: _builtins.int + channel_hash: _builtins.int """ - Number of messages we have ever seen + The channel hash this cursor is for; absent for the direct message stream. """ - messages_saved: builtins.int + since_time: _builtins.int """ - Number of messages we have currently saved our history. + rx_time of the last frame the client holds from this stream. 0 asks from the start + of what the server still has. """ - messages_max: builtins.int + last_id: _builtins.int """ - Maximum number of messages we will save + id of that frame, which separates two frames that share an rx_time. """ - up_time: builtins.int + def __init__( + self, + *, + channel_hash: _builtins.int | None = ..., + since_time: _builtins.int = ..., + last_id: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash", "channel_hash", b"channel_hash"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash", "channel_hash", b"channel_hash", "last_id", b"last_id", "since_time", b"since_time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__channel_hash: _TypeAlias = _typing.Literal["channel_hash"] # noqa: Y015 + _WhichOneofArgType__channel_hash: _TypeAlias = _typing.Literal["_channel_hash", b"_channel_hash"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_hash) -> _WhichOneofReturnType__channel_hash | None: ... + + @_typing.final + class Announce(_message.Message): """ - Router uptime in seconds + What a server broadcasts about itself, as the payload of a MINI pip rather than an + addressed packet. Keep it small: the point of the profile is that a beacon costs five + header bytes instead of twelve. """ - requests: builtins.int + + DESCRIPTOR: _descriptor.Descriptor + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[StoreAndForward.Announce._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + ANNOUNCE_NONE: StoreAndForward.Announce._Flags.ValueType # 0 + """Nothing set""" + ANNOUNCE_SERVES_DISCOVERY: StoreAndForward.Announce._Flags.ValueType # 1 + """ + This server also serves node discovery records on NODE_DISCOVERY_APP, so one pip tells + a client where to find both. + """ + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + What else this server does: a bitwise OR of Flags values. + """ + + ANNOUNCE_NONE: StoreAndForward.Announce.Flags.ValueType # 0 + """Nothing set""" + ANNOUNCE_SERVES_DISCOVERY: StoreAndForward.Announce.Flags.ValueType # 1 """ - Number of times any client sent a request to the S&F. + This server also serves node discovery records on NODE_DISCOVERY_APP, so one pip tells + a client where to find both. """ - requests_history: builtins.int + + SERVER_FIELD_NUMBER: _builtins.int + SERVED_HASHES_FIELD_NUMBER: _builtins.int + OLDEST_RX_TIME_FIELD_NUMBER: _builtins.int + MAX_PER_SYNC_FIELD_NUMBER: _builtins.int + CAPACITY_FIELD_NUMBER: _builtins.int + HELD_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + server: _builtins.int """ - Number of times the history was requested. + The server to sync with. Explicit because a MINI frame has no `from` field. """ - heartbeat: builtins.bool + oldest_rx_time: _builtins.int """ - Is the heartbeat enabled on the server? + rx_time of the oldest frame still held, so a client can tell which server reaches + furthest back. """ - return_max: builtins.int + max_per_sync: _builtins.int """ - Maximum number of messages the server will return. + Frames the server sends in one sync round before ending it with truncated set. """ - return_window: builtins.int + capacity: _builtins.int """ - Maximum history window in minutes the server will return messages from. + Capacity in frames, for display. """ - def __init__( - self, - *, - messages_total: builtins.int = ..., - messages_saved: builtins.int = ..., - messages_max: builtins.int = ..., - up_time: builtins.int = ..., - requests: builtins.int = ..., - requests_history: builtins.int = ..., - heartbeat: builtins.bool = ..., - return_max: builtins.int = ..., - return_window: builtins.int = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "messages_max", b"messages_max", "messages_saved", b"messages_saved", "messages_total", b"messages_total", "requests", b"requests", "requests_history", b"requests_history", "return_max", b"return_max", "return_window", b"return_window", "up_time", b"up_time"]) -> None: ... - - @typing.final - class History(google.protobuf.message.Message): - """ - TODO: REPLACE - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - HISTORY_MESSAGES_FIELD_NUMBER: builtins.int - WINDOW_FIELD_NUMBER: builtins.int - LAST_REQUEST_FIELD_NUMBER: builtins.int - history_messages: builtins.int - """ - Number of that will be sent to the client - """ - window: builtins.int + held: _builtins.int """ - The window of messages that was used to filter the history client requested + Frames held, for display. """ - last_request: builtins.int + flags: _builtins.int """ - Index in the packet history of the last message sent in a previous request to the server. - Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client. + Bitwise OR of Flags values. """ + @_builtins.property + def served_hashes(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + Channel hashes retained. Empty means every hash it hears. + """ + def __init__( self, *, - history_messages: builtins.int = ..., - window: builtins.int = ..., - last_request: builtins.int = ..., + server: _builtins.int = ..., + served_hashes: _abc.Iterable[_builtins.int] | None = ..., + oldest_rx_time: _builtins.int = ..., + max_per_sync: _builtins.int = ..., + capacity: _builtins.int = ..., + held: _builtins.int = ..., + flags: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["history_messages", b"history_messages", "last_request", b"last_request", "window", b"window"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["capacity", b"capacity", "flags", b"flags", "held", b"held", "max_per_sync", b"max_per_sync", "oldest_rx_time", b"oldest_rx_time", "served_hashes", b"served_hashes", "server", b"server"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - @typing.final - class Heartbeat(google.protobuf.message.Message): + @_typing.final + class Sync(_message.Message): """ - TODO: REPLACE + What a client asks for. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - PERIOD_FIELD_NUMBER: builtins.int - SECONDARY_FIELD_NUMBER: builtins.int - period: builtins.int + CURSORS_FIELD_NUMBER: _builtins.int + MAX_FRAMES_FIELD_NUMBER: _builtins.int + FLAGGED_ONLY_FIELD_NUMBER: _builtins.int + max_frames: _builtins.int """ - Period in seconds that the heartbeat is sent out that will be sent to the client + Client's own cap for this round, to spend less receive time. 0 takes the server's + max_per_sync. """ - secondary: builtins.int + flagged_only: _builtins.bool """ - If set, this is not the primary Store & Forward router on the mesh + Send only frames flagged HOP_STORE and skip the filler. """ + @_builtins.property + def cursors(self) -> _containers.RepeatedCompositeFieldContainer[Global___StoreAndForward.Cursor]: + """ + One cursor per stream the client wants, the direct message stream included. + """ + def __init__( self, *, - period: builtins.int = ..., - secondary: builtins.int = ..., + cursors: _abc.Iterable[Global___StoreAndForward.Cursor] | None = ..., + max_frames: _builtins.int = ..., + flagged_only: _builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["period", b"period", "secondary", b"secondary"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["cursors", b"cursors", "flagged_only", b"flagged_only", "max_frames", b"max_frames"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... - RR_FIELD_NUMBER: builtins.int - STATS_FIELD_NUMBER: builtins.int - HISTORY_FIELD_NUMBER: builtins.int - HEARTBEAT_FIELD_NUMBER: builtins.int - TEXT_FIELD_NUMBER: builtins.int - ORIGINAL_ID_FIELD_NUMBER: builtins.int - rr: global___StoreAndForward.RequestResponse.ValueType - """ - TODO: REPLACE - """ - text: builtins.bytes - """ - Text from history message. - """ - original_id: builtins.int - """ - Contains the original ID of the contained message. - """ - @property - def stats(self) -> global___StoreAndForward.Statistics: + @_typing.final + class SyncDone(_message.Message): """ - TODO: REPLACE + How the round ended. """ - @property - def history(self) -> global___StoreAndForward.History: - """ - TODO: REPLACE - """ + DESCRIPTOR: _descriptor.Descriptor - @property - def heartbeat(self) -> global___StoreAndForward.Heartbeat: - """ - TODO: REPLACE - """ + CURSORS_FIELD_NUMBER: _builtins.int + TRUNCATED_FIELD_NUMBER: _builtins.int + GAP_HASHES_FIELD_NUMBER: _builtins.int + truncated: _builtins.bool + """ + The round hit a cap. Sync again to continue. + """ + @_builtins.property + def cursors(self) -> _containers.RepeatedCompositeFieldContainer[Global___StoreAndForward.Cursor]: + """ + Where each stream stands after the last acked frame. + """ + + @_builtins.property + def gap_hashes(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + Streams whose requested cursor is older than what the server still holds, so + history was lost between them. A hash appears here at most once per round. + """ + + def __init__( + self, + *, + cursors: _abc.Iterable[Global___StoreAndForward.Cursor] | None = ..., + truncated: _builtins.bool = ..., + gap_hashes: _abc.Iterable[_builtins.int] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["cursors", b"cursors", "gap_hashes", b"gap_hashes", "truncated", b"truncated"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + TYPE_FIELD_NUMBER: _builtins.int + ANNOUNCE_FIELD_NUMBER: _builtins.int + SYNC_FIELD_NUMBER: _builtins.int + FRAME_FIELD_NUMBER: _builtins.int + SYNC_DONE_FIELD_NUMBER: _builtins.int + REMAINING_FIELD_NUMBER: _builtins.int + type: Global___StoreAndForward.Type.ValueType + """ + Which message this is. Carried separately from the variant so ABORT and REFUSED, + which have no body, still say what they are. + """ + remaining: _builtins.int + """ + On FRAME: how many frames are left in this round after this one, for a progress + display. + """ + @_builtins.property + def announce(self) -> Global___StoreAndForward.Announce: ... + @_builtins.property + def sync(self) -> Global___StoreAndForward.Sync: ... + @_builtins.property + def frame(self) -> Global___StoredFrame: ... + @_builtins.property + def sync_done(self) -> Global___StoreAndForward.SyncDone: ... def __init__( self, *, - rr: global___StoreAndForward.RequestResponse.ValueType = ..., - stats: global___StoreAndForward.Statistics | None = ..., - history: global___StoreAndForward.History | None = ..., - heartbeat: global___StoreAndForward.Heartbeat | None = ..., - text: builtins.bytes = ..., - original_id: builtins.int = ..., + type: Global___StoreAndForward.Type.ValueType = ..., + announce: Global___StoreAndForward.Announce | None = ..., + sync: Global___StoreAndForward.Sync | None = ..., + frame: Global___StoredFrame | None = ..., + sync_done: Global___StoreAndForward.SyncDone | None = ..., + remaining: _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", "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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["announce", b"announce", "frame", b"frame", "sync", b"sync", "sync_done", b"sync_done", "variant", b"variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["announce", b"announce", "frame", b"frame", "remaining", b"remaining", "sync", b"sync", "sync_done", b"sync_done", "type", b"type", "variant", b"variant"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_variant: _TypeAlias = _typing.Literal["announce", "sync", "frame", "sync_done"] # noqa: Y015 + _WhichOneofArgType_variant: _TypeAlias = _typing.Literal["variant", b"variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_variant) -> _WhichOneofReturnType_variant | None: ... -global___StoreAndForward = StoreAndForward +Global___StoreAndForward: _TypeAlias = StoreAndForward # noqa: Y015 diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index f77e6b0f8..db6c90dae 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/telemetry.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -14,96 +15,74 @@ 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\"\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\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\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\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\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\x10\x35\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) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.telemetry_pb2', _globals) 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 - _ENVIRONMENTMETRICS.fields_by_name['wind_direction']._serialized_options = b'\222?\0028\020' - _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'\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 - _LOCALSTATS.fields_by_name['num_total_nodes']._serialized_options = b'\222?\0028\020' - _LOCALSTATS.fields_by_name['num_tx_dropped']._options = None - _LOCALSTATS.fields_by_name['num_tx_dropped']._serialized_options = b'\222?\0028\020' - _HEALTHMETRICS.fields_by_name['heart_bpm']._options = None - _HEALTHMETRICS.fields_by_name['heart_bpm']._serialized_options = b'\222?\0028\010' - _HEALTHMETRICS.fields_by_name['spO2']._options = None - _HEALTHMETRICS.fields_by_name['spO2']._serialized_options = b'\222?\0028\010' - _HOSTMETRICS.fields_by_name['load1']._options = None - _HOSTMETRICS.fields_by_name['load1']._serialized_options = b'\222?\0028\020' - _HOSTMETRICS.fields_by_name['load5']._options = None - _HOSTMETRICS.fields_by_name['load5']._serialized_options = b'\222?\0028\020' - _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\241\001' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=7538 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=8332 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_DEVICEMETRICS'].fields_by_name['voltage']._options = None + _globals['_DEVICEMETRICS'].fields_by_name['voltage']._serialized_options = b'\222?\0028\020' + _globals['_DEVICEMETRICS'].fields_by_name['channel_utilization']._options = None + _globals['_DEVICEMETRICS'].fields_by_name['channel_utilization']._serialized_options = b'\222?\0028\020' + _globals['_DEVICEMETRICS'].fields_by_name['air_util_tx']._options = None + _globals['_DEVICEMETRICS'].fields_by_name['air_util_tx']._serialized_options = b'\222?\0028\020' + _globals['_LOCALSTATS'].fields_by_name['num_online_nodes']._options = None + _globals['_LOCALSTATS'].fields_by_name['num_online_nodes']._serialized_options = b'\222?\0028\020' + _globals['_LOCALSTATS'].fields_by_name['num_total_nodes']._options = None + _globals['_LOCALSTATS'].fields_by_name['num_total_nodes']._serialized_options = b'\222?\0028\020' + _globals['_LOCALSTATS'].fields_by_name['num_tx_dropped']._options = None + _globals['_LOCALSTATS'].fields_by_name['num_tx_dropped']._serialized_options = b'\222?\0028\020' + _globals['_LOCALSTATS'].fields_by_name['discovery_stage']._options = None + _globals['_LOCALSTATS'].fields_by_name['discovery_stage']._serialized_options = b'\222?\0028\010' + _globals['_LOCALSTATS'].fields_by_name['discovery_servers']._options = None + _globals['_LOCALSTATS'].fields_by_name['discovery_servers']._serialized_options = b'\222?\0028\010' + _globals['_HOSTMETRICS'].fields_by_name['load1']._options = None + _globals['_HOSTMETRICS'].fields_by_name['load1']._serialized_options = b'\222?\0028\020' + _globals['_HOSTMETRICS'].fields_by_name['load5']._options = None + _globals['_HOSTMETRICS'].fields_by_name['load5']._serialized_options = b'\222?\0028\020' + _globals['_HOSTMETRICS'].fields_by_name['load15']._options = None + _globals['_HOSTMETRICS'].fields_by_name['load15']._serialized_options = b'\222?\0028\020' + _globals['_HOSTMETRICS'].fields_by_name['user_string']._options = None + _globals['_HOSTMETRICS'].fields_by_name['user_string']._serialized_options = b'\222?\003\010\241\001' + _globals['_SENSORREADINGS'].fields_by_name['keys']._options = None + _globals['_SENSORREADINGS'].fields_by_name['keys']._serialized_options = b'\222?\004\020\0208\020' + _globals['_SENSORREADINGS'].fields_by_name['values']._options = None + _globals['_SENSORREADINGS'].fields_by_name['values']._serialized_options = b'\222?\002\020@' + _globals['_SENSORREADINGS'].fields_by_name['time_deltas']._options = None + _globals['_SENSORREADINGS'].fields_by_name['time_deltas']._serialized_options = b'\222?\004\020\0278 ' + _globals['_SENSORREADINGS'].fields_by_name['present']._options = None + _globals['_SENSORREADINGS'].fields_by_name['present']._serialized_options = b'\222?\004\020\0308 ' + _globals['_SENSORREADINGS'].fields_by_name['sensors']._options = None + _globals['_SENSORREADINGS'].fields_by_name['sensors']._serialized_options = b'\222?\004\020\0208\010' + _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._options = None + _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._serialized_options = b'\222?\0028 ' + _globals['_TELEMETRYSENSORTYPE']._serialized_start=4257 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=4991 _globals['_DEVICEMETRICS']._serialized_start=95 - _globals['_DEVICEMETRICS']._serialized_end=338 - _globals['_ENVIRONMENTMETRICS']._serialized_start=341 - _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 + _globals['_DEVICEMETRICS']._serialized_end=359 + _globals['_LOCALSTATS']._serialized_start=362 + _globals['_LOCALSTATS']._serialized_end=1042 + _globals['_LOCALSTATS_DISCOVERYSTAGE']._serialized_start=915 + _globals['_LOCALSTATS_DISCOVERYSTAGE']._serialized_end=1042 + _globals['_TRAFFICMANAGEMENTSTATS']._serialized_start=1045 + _globals['_TRAFFICMANAGEMENTSTATS']._serialized_end=1273 + _globals['_HOSTMETRICS']._serialized_start=1276 + _globals['_HOSTMETRICS']._serialized_end=1578 + _globals['_SENSORREADINGS']._serialized_start=1581 + _globals['_SENSORREADINGS']._serialized_end=3299 + _globals['_SENSORREADINGS_QUANTITY']._serialized_start=1728 + _globals['_SENSORREADINGS_QUANTITY']._serialized_end=3299 + _globals['_TELEMETRY']._serialized_start=3302 + _globals['_TELEMETRY']._serialized_end=3659 + _globals['_NAU7802CONFIG']._serialized_start=3661 + _globals['_NAU7802CONFIG']._serialized_end=3730 + _globals['_AS3935STATE']._serialized_start=3732 + _globals['_AS3935STATE']._serialized_end=3768 + _globals['_SEN5XSTATE']._serialized_start=3771 + _globals['_SEN5XSTATE']._serialized_end=4011 + _globals['_SEN6XSTATE']._serialized_start=4014 + _globals['_SEN6XSTATE']._serialized_end=4254 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index f78242e80..649bfa137 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -3,28 +3,28 @@ 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 +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor class _TelemetrySensorType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 -class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TelemetrySensorType.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor +class _TelemetrySensorTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_TelemetrySensorType.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor SENSOR_UNSET: _TelemetrySensorType.ValueType # 0 """ No external telemetry sensor explicitly set @@ -53,207 +53,192 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra """ High accuracy temperature and pressure """ - SHTC3: _TelemetrySensorType.ValueType # 7 - """ - TODO - REMOVE High accuracy temperature and humidity - """ - LPS22: _TelemetrySensorType.ValueType # 8 + LPS22: _TelemetrySensorType.ValueType # 7 """ High accuracy pressure """ - QMC6310: _TelemetrySensorType.ValueType # 9 + QMC6310: _TelemetrySensorType.ValueType # 8 """ 3-Axis magnetic sensor """ - QMI8658: _TelemetrySensorType.ValueType # 10 + QMI8658: _TelemetrySensorType.ValueType # 9 """ 6-Axis inertial measurement sensor """ - QMC5883L: _TelemetrySensorType.ValueType # 11 + QMC5883L: _TelemetrySensorType.ValueType # 10 """ 3-Axis magnetic sensor """ - SHT31: _TelemetrySensorType.ValueType # 12 - """ - TODO - REMOVE High accuracy temperature and humidity - """ - PMSA003I: _TelemetrySensorType.ValueType # 13 + PMSA003I: _TelemetrySensorType.ValueType # 11 """ PM2.5 air quality sensor """ - INA3221: _TelemetrySensorType.ValueType # 14 + INA3221: _TelemetrySensorType.ValueType # 12 """ INA3221 3 Channel Voltage / Current Sensor """ - BMP085: _TelemetrySensorType.ValueType # 15 + BMP085: _TelemetrySensorType.ValueType # 13 """ BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280) """ - RCWL9620: _TelemetrySensorType.ValueType # 16 + RCWL9620: _TelemetrySensorType.ValueType # 14 """ RCWL-9620 Doppler Radar Distance Sensor, used for water level detection """ - SHT4X: _TelemetrySensorType.ValueType # 17 - """ - TODO - REMOVE Sensirion High accuracy temperature and humidity - """ - VEML7700: _TelemetrySensorType.ValueType # 18 + VEML7700: _TelemetrySensorType.ValueType # 15 """ VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. """ - MLX90632: _TelemetrySensorType.ValueType # 19 + MLX90632: _TelemetrySensorType.ValueType # 16 """ MLX90632 non-contact IR temperature sensor. """ - OPT3001: _TelemetrySensorType.ValueType # 20 + OPT3001: _TelemetrySensorType.ValueType # 17 """ TI OPT3001 Ambient Light Sensor """ - LTR390UV: _TelemetrySensorType.ValueType # 21 + LTR390UV: _TelemetrySensorType.ValueType # 18 """ Lite On LTR-390UV-01 UV Light Sensor """ - TSL25911FN: _TelemetrySensorType.ValueType # 22 + TSL25911FN: _TelemetrySensorType.ValueType # 19 """ AMS TSL25911FN RGB Light Sensor """ - AHT10: _TelemetrySensorType.ValueType # 23 + AHT10: _TelemetrySensorType.ValueType # 20 """ AHT10 Integrated temperature and humidity sensor """ - DFROBOT_LARK: _TelemetrySensorType.ValueType # 24 + DFROBOT_LARK: _TelemetrySensorType.ValueType # 21 """ DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction) """ - NAU7802: _TelemetrySensorType.ValueType # 25 + NAU7802: _TelemetrySensorType.ValueType # 22 """ NAU7802 Scale Chip or compatible """ - BMP3XX: _TelemetrySensorType.ValueType # 26 + BMP3XX: _TelemetrySensorType.ValueType # 23 """ BMP3XX High accuracy temperature and pressure """ - ICM20948: _TelemetrySensorType.ValueType # 27 + ICM20948: _TelemetrySensorType.ValueType # 24 """ ICM-20948 9-Axis digital motion processor """ - MAX17048: _TelemetrySensorType.ValueType # 28 + MAX17048: _TelemetrySensorType.ValueType # 25 """ MAX17048 1S lipo battery sensor (voltage, state of charge, time to go) """ - CUSTOM_SENSOR: _TelemetrySensorType.ValueType # 29 + CUSTOM_SENSOR: _TelemetrySensorType.ValueType # 26 """ Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor """ - MAX30102: _TelemetrySensorType.ValueType # 30 + MAX30102: _TelemetrySensorType.ValueType # 27 """ MAX30102 Pulse Oximeter and Heart-Rate Sensor """ - MLX90614: _TelemetrySensorType.ValueType # 31 + MLX90614: _TelemetrySensorType.ValueType # 28 """ MLX90614 non-contact IR temperature sensor """ - SCD4X: _TelemetrySensorType.ValueType # 32 + SCD4X: _TelemetrySensorType.ValueType # 29 """ SCD40/SCD41 CO2, humidity, temperature sensor """ - RADSENS: _TelemetrySensorType.ValueType # 33 + RADSENS: _TelemetrySensorType.ValueType # 30 """ ClimateGuard RadSens, radiation, Geiger-Muller Tube """ - INA226: _TelemetrySensorType.ValueType # 34 + INA226: _TelemetrySensorType.ValueType # 31 """ High accuracy current and voltage """ - DFROBOT_RAIN: _TelemetrySensorType.ValueType # 35 + DFROBOT_RAIN: _TelemetrySensorType.ValueType # 32 """ DFRobot Gravity tipping bucket rain gauge """ - DPS310: _TelemetrySensorType.ValueType # 36 + DPS310: _TelemetrySensorType.ValueType # 33 """ Infineon DPS310 High accuracy pressure and temperature """ - RAK12035: _TelemetrySensorType.ValueType # 37 + RAK12035: _TelemetrySensorType.ValueType # 34 """ RAKWireless RAK12035 Soil Moisture Sensor Module """ - MAX17261: _TelemetrySensorType.ValueType # 38 + MAX17261: _TelemetrySensorType.ValueType # 35 """ MAX17261 lipo battery gauge """ - PCT2075: _TelemetrySensorType.ValueType # 39 + PCT2075: _TelemetrySensorType.ValueType # 36 """ PCT2075 Temperature Sensor """ - ADS1X15: _TelemetrySensorType.ValueType # 40 + ADS1X15: _TelemetrySensorType.ValueType # 37 """ ADS1X15 ADC """ - ADS1X15_ALT: _TelemetrySensorType.ValueType # 41 + ADS1X15_ALT: _TelemetrySensorType.ValueType # 38 """ ADS1X15 ADC_ALT """ - SFA30: _TelemetrySensorType.ValueType # 42 + SFA30: _TelemetrySensorType.ValueType # 39 """ Sensirion SFA30 Formaldehyde sensor """ - SEN5X: _TelemetrySensorType.ValueType # 43 + SEN5X: _TelemetrySensorType.ValueType # 40 """ SEN5X PM SENSORS """ - TSL2561: _TelemetrySensorType.ValueType # 44 + TSL2561: _TelemetrySensorType.ValueType # 41 """ TSL2561 light sensor """ - BH1750: _TelemetrySensorType.ValueType # 45 + BH1750: _TelemetrySensorType.ValueType # 42 """ BH1750 light sensor """ - HDC1080: _TelemetrySensorType.ValueType # 46 + HDC1080: _TelemetrySensorType.ValueType # 43 """ HDC1080 Temperature and Humidity Sensor """ - SHT21: _TelemetrySensorType.ValueType # 47 - """ - TODO - REMOVE STH21 Temperature and R. Humidity sensor - """ - STC31: _TelemetrySensorType.ValueType # 48 + STC31: _TelemetrySensorType.ValueType # 44 """ Sensirion STC31 CO2 sensor """ - SCD30: _TelemetrySensorType.ValueType # 49 + SCD30: _TelemetrySensorType.ValueType # 45 """ SCD30 CO2, humidity, temperature sensor """ - SHTXX: _TelemetrySensorType.ValueType # 50 + SHTXX: _TelemetrySensorType.ValueType # 46 """ - SHT family of sensors for temperature and humidity + Sensirion SHT family for temperature and humidity: SHTC3, SHT21, SHT31, SHT4X and the + rest. One value, because the driver is one. """ - DS248X: _TelemetrySensorType.ValueType # 51 + DS248X: _TelemetrySensorType.ValueType # 47 """ DS248X Bridge for one-wire temperature sensors """ - MMC5983MA: _TelemetrySensorType.ValueType # 52 + MMC5983MA: _TelemetrySensorType.ValueType # 48 """ MMC5983MA 3-Axis Digital Magnetic Sensor """ - ICM42607P: _TelemetrySensorType.ValueType # 53 + ICM42607P: _TelemetrySensorType.ValueType # 49 """ ICM-42607-P 6-Axis IMU """ - SPA06: _TelemetrySensorType.ValueType # 54 + SPA06: _TelemetrySensorType.ValueType # 50 """ SPA06 pressure and temperature """ - HM330X: _TelemetrySensorType.ValueType # 55 + HM330X: _TelemetrySensorType.ValueType # 51 """ HM330X PM SENSOR """ - SEN6X: _TelemetrySensorType.ValueType # 56 + SEN6X: _TelemetrySensorType.ValueType # 52 """ Sensirion SEN6X PM/RHT/VOC/NOx/CO2/HCHO sensor family (SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C) """ - AS3935: _TelemetrySensorType.ValueType # 57 + AS3935: _TelemetrySensorType.ValueType # 53 """ AS3935 Franklin lightning sensor """ @@ -291,1387 +276,559 @@ BMP280: TelemetrySensorType.ValueType # 6 """ High accuracy temperature and pressure """ -SHTC3: TelemetrySensorType.ValueType # 7 -""" -TODO - REMOVE High accuracy temperature and humidity -""" -LPS22: TelemetrySensorType.ValueType # 8 +LPS22: TelemetrySensorType.ValueType # 7 """ High accuracy pressure """ -QMC6310: TelemetrySensorType.ValueType # 9 +QMC6310: TelemetrySensorType.ValueType # 8 """ 3-Axis magnetic sensor """ -QMI8658: TelemetrySensorType.ValueType # 10 +QMI8658: TelemetrySensorType.ValueType # 9 """ 6-Axis inertial measurement sensor """ -QMC5883L: TelemetrySensorType.ValueType # 11 +QMC5883L: TelemetrySensorType.ValueType # 10 """ 3-Axis magnetic sensor """ -SHT31: TelemetrySensorType.ValueType # 12 -""" -TODO - REMOVE High accuracy temperature and humidity -""" -PMSA003I: TelemetrySensorType.ValueType # 13 +PMSA003I: TelemetrySensorType.ValueType # 11 """ PM2.5 air quality sensor """ -INA3221: TelemetrySensorType.ValueType # 14 +INA3221: TelemetrySensorType.ValueType # 12 """ INA3221 3 Channel Voltage / Current Sensor """ -BMP085: TelemetrySensorType.ValueType # 15 +BMP085: TelemetrySensorType.ValueType # 13 """ BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280) """ -RCWL9620: TelemetrySensorType.ValueType # 16 +RCWL9620: TelemetrySensorType.ValueType # 14 """ RCWL-9620 Doppler Radar Distance Sensor, used for water level detection """ -SHT4X: TelemetrySensorType.ValueType # 17 -""" -TODO - REMOVE Sensirion High accuracy temperature and humidity -""" -VEML7700: TelemetrySensorType.ValueType # 18 +VEML7700: TelemetrySensorType.ValueType # 15 """ VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. """ -MLX90632: TelemetrySensorType.ValueType # 19 +MLX90632: TelemetrySensorType.ValueType # 16 """ MLX90632 non-contact IR temperature sensor. """ -OPT3001: TelemetrySensorType.ValueType # 20 +OPT3001: TelemetrySensorType.ValueType # 17 """ TI OPT3001 Ambient Light Sensor """ -LTR390UV: TelemetrySensorType.ValueType # 21 +LTR390UV: TelemetrySensorType.ValueType # 18 """ Lite On LTR-390UV-01 UV Light Sensor """ -TSL25911FN: TelemetrySensorType.ValueType # 22 +TSL25911FN: TelemetrySensorType.ValueType # 19 """ AMS TSL25911FN RGB Light Sensor """ -AHT10: TelemetrySensorType.ValueType # 23 +AHT10: TelemetrySensorType.ValueType # 20 """ AHT10 Integrated temperature and humidity sensor """ -DFROBOT_LARK: TelemetrySensorType.ValueType # 24 +DFROBOT_LARK: TelemetrySensorType.ValueType # 21 """ DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction) """ -NAU7802: TelemetrySensorType.ValueType # 25 +NAU7802: TelemetrySensorType.ValueType # 22 """ NAU7802 Scale Chip or compatible """ -BMP3XX: TelemetrySensorType.ValueType # 26 +BMP3XX: TelemetrySensorType.ValueType # 23 """ BMP3XX High accuracy temperature and pressure """ -ICM20948: TelemetrySensorType.ValueType # 27 +ICM20948: TelemetrySensorType.ValueType # 24 """ ICM-20948 9-Axis digital motion processor """ -MAX17048: TelemetrySensorType.ValueType # 28 +MAX17048: TelemetrySensorType.ValueType # 25 """ MAX17048 1S lipo battery sensor (voltage, state of charge, time to go) """ -CUSTOM_SENSOR: TelemetrySensorType.ValueType # 29 +CUSTOM_SENSOR: TelemetrySensorType.ValueType # 26 """ Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor """ -MAX30102: TelemetrySensorType.ValueType # 30 +MAX30102: TelemetrySensorType.ValueType # 27 """ MAX30102 Pulse Oximeter and Heart-Rate Sensor """ -MLX90614: TelemetrySensorType.ValueType # 31 +MLX90614: TelemetrySensorType.ValueType # 28 """ MLX90614 non-contact IR temperature sensor """ -SCD4X: TelemetrySensorType.ValueType # 32 +SCD4X: TelemetrySensorType.ValueType # 29 """ SCD40/SCD41 CO2, humidity, temperature sensor """ -RADSENS: TelemetrySensorType.ValueType # 33 +RADSENS: TelemetrySensorType.ValueType # 30 """ ClimateGuard RadSens, radiation, Geiger-Muller Tube """ -INA226: TelemetrySensorType.ValueType # 34 +INA226: TelemetrySensorType.ValueType # 31 """ High accuracy current and voltage """ -DFROBOT_RAIN: TelemetrySensorType.ValueType # 35 +DFROBOT_RAIN: TelemetrySensorType.ValueType # 32 """ DFRobot Gravity tipping bucket rain gauge """ -DPS310: TelemetrySensorType.ValueType # 36 +DPS310: TelemetrySensorType.ValueType # 33 """ Infineon DPS310 High accuracy pressure and temperature """ -RAK12035: TelemetrySensorType.ValueType # 37 +RAK12035: TelemetrySensorType.ValueType # 34 """ RAKWireless RAK12035 Soil Moisture Sensor Module """ -MAX17261: TelemetrySensorType.ValueType # 38 +MAX17261: TelemetrySensorType.ValueType # 35 """ MAX17261 lipo battery gauge """ -PCT2075: TelemetrySensorType.ValueType # 39 +PCT2075: TelemetrySensorType.ValueType # 36 """ PCT2075 Temperature Sensor """ -ADS1X15: TelemetrySensorType.ValueType # 40 +ADS1X15: TelemetrySensorType.ValueType # 37 """ ADS1X15 ADC """ -ADS1X15_ALT: TelemetrySensorType.ValueType # 41 +ADS1X15_ALT: TelemetrySensorType.ValueType # 38 """ ADS1X15 ADC_ALT """ -SFA30: TelemetrySensorType.ValueType # 42 +SFA30: TelemetrySensorType.ValueType # 39 """ Sensirion SFA30 Formaldehyde sensor """ -SEN5X: TelemetrySensorType.ValueType # 43 +SEN5X: TelemetrySensorType.ValueType # 40 """ SEN5X PM SENSORS """ -TSL2561: TelemetrySensorType.ValueType # 44 +TSL2561: TelemetrySensorType.ValueType # 41 """ TSL2561 light sensor """ -BH1750: TelemetrySensorType.ValueType # 45 +BH1750: TelemetrySensorType.ValueType # 42 """ BH1750 light sensor """ -HDC1080: TelemetrySensorType.ValueType # 46 +HDC1080: TelemetrySensorType.ValueType # 43 """ HDC1080 Temperature and Humidity Sensor """ -SHT21: TelemetrySensorType.ValueType # 47 -""" -TODO - REMOVE STH21 Temperature and R. Humidity sensor -""" -STC31: TelemetrySensorType.ValueType # 48 +STC31: TelemetrySensorType.ValueType # 44 """ Sensirion STC31 CO2 sensor """ -SCD30: TelemetrySensorType.ValueType # 49 +SCD30: TelemetrySensorType.ValueType # 45 """ SCD30 CO2, humidity, temperature sensor """ -SHTXX: TelemetrySensorType.ValueType # 50 +SHTXX: TelemetrySensorType.ValueType # 46 """ -SHT family of sensors for temperature and humidity +Sensirion SHT family for temperature and humidity: SHTC3, SHT21, SHT31, SHT4X and the +rest. One value, because the driver is one. """ -DS248X: TelemetrySensorType.ValueType # 51 +DS248X: TelemetrySensorType.ValueType # 47 """ DS248X Bridge for one-wire temperature sensors """ -MMC5983MA: TelemetrySensorType.ValueType # 52 +MMC5983MA: TelemetrySensorType.ValueType # 48 """ MMC5983MA 3-Axis Digital Magnetic Sensor """ -ICM42607P: TelemetrySensorType.ValueType # 53 +ICM42607P: TelemetrySensorType.ValueType # 49 """ ICM-42607-P 6-Axis IMU """ -SPA06: TelemetrySensorType.ValueType # 54 +SPA06: TelemetrySensorType.ValueType # 50 """ SPA06 pressure and temperature """ -HM330X: TelemetrySensorType.ValueType # 55 +HM330X: TelemetrySensorType.ValueType # 51 """ HM330X PM SENSOR """ -SEN6X: TelemetrySensorType.ValueType # 56 +SEN6X: TelemetrySensorType.ValueType # 52 """ Sensirion SEN6X PM/RHT/VOC/NOx/CO2/HCHO sensor family (SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C) """ -AS3935: TelemetrySensorType.ValueType # 57 +AS3935: TelemetrySensorType.ValueType # 53 """ AS3935 Franklin lightning sensor """ -global___TelemetrySensorType = TelemetrySensorType +Global___TelemetrySensorType: _TypeAlias = TelemetrySensorType # noqa: Y015 -@typing.final -class DeviceMetrics(google.protobuf.message.Message): +@_typing.final +class DeviceMetrics(_message.Message): """ Key native device metrics such as battery level """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - BATTERY_LEVEL_FIELD_NUMBER: builtins.int - VOLTAGE_FIELD_NUMBER: builtins.int - CHANNEL_UTILIZATION_FIELD_NUMBER: builtins.int - AIR_UTIL_TX_FIELD_NUMBER: builtins.int - UPTIME_SECONDS_FIELD_NUMBER: builtins.int - battery_level: builtins.int + BATTERY_LEVEL_FIELD_NUMBER: _builtins.int + VOLTAGE_FIELD_NUMBER: _builtins.int + CHANNEL_UTILIZATION_FIELD_NUMBER: _builtins.int + AIR_UTIL_TX_FIELD_NUMBER: _builtins.int + UPTIME_SECONDS_FIELD_NUMBER: _builtins.int + battery_level: _builtins.int """ 0-100 (>100 means powered) """ - voltage: builtins.float + voltage: _builtins.int """ - Voltage measured + Voltage in mV (millivolts) """ - channel_utilization: builtins.float + channel_utilization: _builtins.int """ - Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). + Channel utilization x100 (e.g. 2550 = 25.50%) """ - air_util_tx: builtins.float + air_util_tx: _builtins.int """ - Percent of airtime for transmission used within the last hour. + Percent of airtime for TX x100 (e.g. 1025 = 10.25%) """ - uptime_seconds: builtins.int + uptime_seconds: _builtins.int """ How long the device has been running since the last reboot (in seconds) """ def __init__( self, *, - battery_level: builtins.int | None = ..., - voltage: builtins.float | None = ..., - channel_utilization: builtins.float | None = ..., - air_util_tx: builtins.float | None = ..., - uptime_seconds: builtins.int | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_air_util_tx", b"_air_util_tx"]) -> typing.Literal["air_util_tx"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_battery_level", b"_battery_level"]) -> typing.Literal["battery_level"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_channel_utilization", b"_channel_utilization"]) -> typing.Literal["channel_utilization"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_uptime_seconds", b"_uptime_seconds"]) -> typing.Literal["uptime_seconds"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_voltage", b"_voltage"]) -> typing.Literal["voltage"] | None: ... - -global___DeviceMetrics = DeviceMetrics - -@typing.final -class EnvironmentMetrics(google.protobuf.message.Message): - """ - Weather station or other environmental metrics - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - TEMPERATURE_FIELD_NUMBER: builtins.int - RELATIVE_HUMIDITY_FIELD_NUMBER: builtins.int - BAROMETRIC_PRESSURE_FIELD_NUMBER: builtins.int - GAS_RESISTANCE_FIELD_NUMBER: builtins.int - VOLTAGE_FIELD_NUMBER: builtins.int - CURRENT_FIELD_NUMBER: builtins.int - IAQ_FIELD_NUMBER: builtins.int - DISTANCE_FIELD_NUMBER: builtins.int - LUX_FIELD_NUMBER: builtins.int - WHITE_LUX_FIELD_NUMBER: builtins.int - IR_LUX_FIELD_NUMBER: builtins.int - UV_LUX_FIELD_NUMBER: builtins.int - WIND_DIRECTION_FIELD_NUMBER: builtins.int - WIND_SPEED_FIELD_NUMBER: builtins.int - WEIGHT_FIELD_NUMBER: builtins.int - WIND_GUST_FIELD_NUMBER: builtins.int - WIND_LULL_FIELD_NUMBER: builtins.int - RADIATION_FIELD_NUMBER: builtins.int - RAINFALL_1H_FIELD_NUMBER: builtins.int - RAINFALL_24H_FIELD_NUMBER: builtins.int - SOIL_MOISTURE_FIELD_NUMBER: builtins.int - SOIL_TEMPERATURE_FIELD_NUMBER: builtins.int - 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 - """ - relative_humidity: builtins.float - """ - Relative humidity percent measured - """ - barometric_pressure: builtins.float - """ - Barometric pressure in hPA measured - """ - gas_resistance: builtins.float - """ - Gas resistance in MOhm measured - """ - voltage: builtins.float - """ - Voltage measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) - """ - current: builtins.float - """ - Current measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) - """ - iaq: builtins.int - """ - relative scale IAQ value as measured by Bosch BME680 . value 0-500. - Belongs to Air Quality but is not particle but VOC measurement. Other VOC values can also be put in here. - """ - distance: builtins.float - """ - RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm. - """ - lux: builtins.float - """ - VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. - """ - white_lux: builtins.float - """ - VEML7700 high accuracy white light(irradiance) not calibrated digital 16-bit resolution sensor. - """ - ir_lux: builtins.float - """ - Infrared lux - """ - uv_lux: builtins.float - """ - Ultraviolet lux - """ - wind_direction: builtins.int - """ - Wind direction in degrees - 0 degrees = North, 90 = East, etc... - """ - wind_speed: builtins.float - """ - Wind speed in m/s - """ - weight: builtins.float - """ - Weight in KG - """ - wind_gust: builtins.float - """ - Wind gust in m/s - """ - wind_lull: builtins.float - """ - Wind lull in m/s - """ - radiation: builtins.float - """ - Radiation in µR/h - """ - rainfall_1h: builtins.float - """ - Rainfall in the last hour in mm - """ - rainfall_24h: builtins.float - """ - Rainfall in the last 24 hours in mm - """ - soil_moisture: builtins.int - """ - Soil moisture measured (% 1-100) - """ - soil_temperature: builtins.float - """ - Soil temperature measured (*C) - """ - 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]: - """ - Never implemented, but Voltage may be mis-interpreted by old clients as temperature - """ - - def __init__( - self, - *, - temperature: builtins.float | None = ..., - relative_humidity: builtins.float | None = ..., - barometric_pressure: builtins.float | None = ..., - gas_resistance: builtins.float | None = ..., - voltage: builtins.float | None = ..., - current: builtins.float | None = ..., - iaq: builtins.int | None = ..., - distance: builtins.float | None = ..., - lux: builtins.float | None = ..., - white_lux: builtins.float | None = ..., - ir_lux: builtins.float | None = ..., - uv_lux: builtins.float | None = ..., - wind_direction: builtins.int | None = ..., - wind_speed: builtins.float | None = ..., - weight: builtins.float | None = ..., - wind_gust: builtins.float | None = ..., - wind_lull: builtins.float | None = ..., - radiation: builtins.float | None = ..., - rainfall_1h: builtins.float | None = ..., - rainfall_24h: builtins.float | None = ..., - 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 = ..., + battery_level: _builtins.int | None = ..., + voltage: _builtins.int | None = ..., + channel_utilization: _builtins.int | None = ..., + air_util_tx: _builtins.int | None = ..., + uptime_seconds: _builtins.int | None = ..., ) -> 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 - def WhichOneof(self, oneof_group: typing.Literal["_current", b"_current"]) -> typing.Literal["current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_distance", b"_distance"]) -> typing.Literal["distance"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_gas_resistance", b"_gas_resistance"]) -> typing.Literal["gas_resistance"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_iaq", b"_iaq"]) -> typing.Literal["iaq"] | None: ... - @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: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_rainfall_24h", b"_rainfall_24h"]) -> typing.Literal["rainfall_24h"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_relative_humidity", b"_relative_humidity"]) -> typing.Literal["relative_humidity"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_soil_moisture", b"_soil_moisture"]) -> typing.Literal["soil_moisture"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_soil_temperature", b"_soil_temperature"]) -> typing.Literal["soil_temperature"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_temperature", b"_temperature"]) -> typing.Literal["temperature"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_uv_lux", b"_uv_lux"]) -> typing.Literal["uv_lux"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_voltage", b"_voltage"]) -> typing.Literal["voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_weight", b"_weight"]) -> typing.Literal["weight"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_white_lux", b"_white_lux"]) -> typing.Literal["white_lux"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_wind_direction", b"_wind_direction"]) -> typing.Literal["wind_direction"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_wind_gust", b"_wind_gust"]) -> typing.Literal["wind_gust"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_wind_lull", b"_wind_lull"]) -> typing.Literal["wind_lull"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_wind_speed", b"_wind_speed"]) -> typing.Literal["wind_speed"] | None: ... - -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 + _HasFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__air_util_tx: _TypeAlias = _typing.Literal["air_util_tx"] # noqa: Y015 + _WhichOneofArgType__air_util_tx: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx"] # noqa: Y015 + _WhichOneofReturnType__battery_level: _TypeAlias = _typing.Literal["battery_level"] # noqa: Y015 + _WhichOneofArgType__battery_level: _TypeAlias = _typing.Literal["_battery_level", b"_battery_level"] # noqa: Y015 + _WhichOneofReturnType__channel_utilization: _TypeAlias = _typing.Literal["channel_utilization"] # noqa: Y015 + _WhichOneofArgType__channel_utilization: _TypeAlias = _typing.Literal["_channel_utilization", b"_channel_utilization"] # noqa: Y015 + _WhichOneofReturnType__uptime_seconds: _TypeAlias = _typing.Literal["uptime_seconds"] # noqa: Y015 + _WhichOneofArgType__uptime_seconds: _TypeAlias = _typing.Literal["_uptime_seconds", b"_uptime_seconds"] # noqa: Y015 + _WhichOneofReturnType__voltage: _TypeAlias = _typing.Literal["voltage"] # noqa: Y015 + _WhichOneofArgType__voltage: _TypeAlias = _typing.Literal["_voltage", b"_voltage"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__air_util_tx) -> _WhichOneofReturnType__air_util_tx | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__battery_level) -> _WhichOneofReturnType__battery_level | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_utilization) -> _WhichOneofReturnType__channel_utilization | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__uptime_seconds) -> _WhichOneofReturnType__uptime_seconds | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voltage) -> _WhichOneofReturnType__voltage | None: ... + +Global___DeviceMetrics: _TypeAlias = DeviceMetrics # noqa: Y015 + +@_typing.final +class LocalStats(_message.Message): """ - 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) + Local device mesh statistics """ - 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): - """ - Power Metrics (voltage / current / etc) - """ + DESCRIPTOR: _descriptor.Descriptor - DESCRIPTOR: google.protobuf.descriptor.Descriptor + class _DiscoveryStage: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - CH1_VOLTAGE_FIELD_NUMBER: builtins.int - CH1_CURRENT_FIELD_NUMBER: builtins.int - CH2_VOLTAGE_FIELD_NUMBER: builtins.int - CH2_CURRENT_FIELD_NUMBER: builtins.int - CH3_VOLTAGE_FIELD_NUMBER: builtins.int - CH3_CURRENT_FIELD_NUMBER: builtins.int - CH4_VOLTAGE_FIELD_NUMBER: builtins.int - CH4_CURRENT_FIELD_NUMBER: builtins.int - CH5_VOLTAGE_FIELD_NUMBER: builtins.int - CH5_CURRENT_FIELD_NUMBER: builtins.int - CH6_VOLTAGE_FIELD_NUMBER: builtins.int - CH6_CURRENT_FIELD_NUMBER: builtins.int - CH7_VOLTAGE_FIELD_NUMBER: builtins.int - CH7_CURRENT_FIELD_NUMBER: builtins.int - CH8_VOLTAGE_FIELD_NUMBER: builtins.int - CH8_CURRENT_FIELD_NUMBER: builtins.int - ch1_voltage: builtins.float - """ - Voltage (Ch1) - """ - ch1_current: builtins.float - """ - Current (Ch1) - """ - ch2_voltage: builtins.float - """ - Voltage (Ch2) - """ - ch2_current: builtins.float - """ - Current (Ch2) - """ - ch3_voltage: builtins.float - """ - Voltage (Ch3) - """ - ch3_current: builtins.float - """ - Current (Ch3) - """ - ch4_voltage: builtins.float - """ - Voltage (Ch4) - TODO Remove - """ - ch4_current: builtins.float - """ - Current (Ch4) - TODO Remove - """ - ch5_voltage: builtins.float - """ - Voltage (Ch5) - TODO Remove - """ - ch5_current: builtins.float - """ - Current (Ch5) - TODO Remove - """ - ch6_voltage: builtins.float - """ - Voltage (Ch6) - TODO Remove - """ - ch6_current: builtins.float - """ - Current (Ch6) - TODO Remove - """ - ch7_voltage: builtins.float - """ - Voltage (Ch7) - TODO Remove - """ - ch7_current: builtins.float - """ - Current (Ch7) - TODO Remove - """ - ch8_voltage: builtins.float - """ - Voltage (Ch8) - TODO Remove - """ - ch8_current: builtins.float - """ - Current (Ch8) - TODO Remove - """ - def __init__( - self, - *, - ch1_voltage: builtins.float | None = ..., - ch1_current: builtins.float | None = ..., - ch2_voltage: builtins.float | None = ..., - ch2_current: builtins.float | None = ..., - ch3_voltage: builtins.float | None = ..., - ch3_current: builtins.float | None = ..., - ch4_voltage: builtins.float | None = ..., - ch4_current: builtins.float | None = ..., - ch5_voltage: builtins.float | None = ..., - ch5_current: builtins.float | None = ..., - ch6_voltage: builtins.float | None = ..., - ch6_current: builtins.float | None = ..., - ch7_voltage: builtins.float | None = ..., - ch7_current: builtins.float | None = ..., - ch8_voltage: builtins.float | None = ..., - ch8_current: builtins.float | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_ch1_current", b"_ch1_current", "_ch1_voltage", b"_ch1_voltage", "_ch2_current", b"_ch2_current", "_ch2_voltage", b"_ch2_voltage", "_ch3_current", b"_ch3_current", "_ch3_voltage", b"_ch3_voltage", "_ch4_current", b"_ch4_current", "_ch4_voltage", b"_ch4_voltage", "_ch5_current", b"_ch5_current", "_ch5_voltage", b"_ch5_voltage", "_ch6_current", b"_ch6_current", "_ch6_voltage", b"_ch6_voltage", "_ch7_current", b"_ch7_current", "_ch7_voltage", b"_ch7_voltage", "_ch8_current", b"_ch8_current", "_ch8_voltage", b"_ch8_voltage", "ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage", "ch4_current", b"ch4_current", "ch4_voltage", b"ch4_voltage", "ch5_current", b"ch5_current", "ch5_voltage", b"ch5_voltage", "ch6_current", b"ch6_current", "ch6_voltage", b"ch6_voltage", "ch7_current", b"ch7_current", "ch7_voltage", b"ch7_voltage", "ch8_current", b"ch8_current", "ch8_voltage", b"ch8_voltage"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_ch1_current", b"_ch1_current", "_ch1_voltage", b"_ch1_voltage", "_ch2_current", b"_ch2_current", "_ch2_voltage", b"_ch2_voltage", "_ch3_current", b"_ch3_current", "_ch3_voltage", b"_ch3_voltage", "_ch4_current", b"_ch4_current", "_ch4_voltage", b"_ch4_voltage", "_ch5_current", b"_ch5_current", "_ch5_voltage", b"_ch5_voltage", "_ch6_current", b"_ch6_current", "_ch6_voltage", b"_ch6_voltage", "_ch7_current", b"_ch7_current", "_ch7_voltage", b"_ch7_voltage", "_ch8_current", b"_ch8_current", "_ch8_voltage", b"_ch8_voltage", "ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage", "ch4_current", b"ch4_current", "ch4_voltage", b"ch4_voltage", "ch5_current", b"ch5_current", "ch5_voltage", b"ch5_voltage", "ch6_current", b"ch6_current", "ch6_voltage", b"ch6_voltage", "ch7_current", b"ch7_current", "ch7_voltage", b"ch7_voltage", "ch8_current", b"ch8_current", "ch8_voltage", b"ch8_voltage"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch1_current", b"_ch1_current"]) -> typing.Literal["ch1_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch1_voltage", b"_ch1_voltage"]) -> typing.Literal["ch1_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch2_current", b"_ch2_current"]) -> typing.Literal["ch2_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch2_voltage", b"_ch2_voltage"]) -> typing.Literal["ch2_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch3_current", b"_ch3_current"]) -> typing.Literal["ch3_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch3_voltage", b"_ch3_voltage"]) -> typing.Literal["ch3_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch4_current", b"_ch4_current"]) -> typing.Literal["ch4_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch4_voltage", b"_ch4_voltage"]) -> typing.Literal["ch4_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch5_current", b"_ch5_current"]) -> typing.Literal["ch5_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch5_voltage", b"_ch5_voltage"]) -> typing.Literal["ch5_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch6_current", b"_ch6_current"]) -> typing.Literal["ch6_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch6_voltage", b"_ch6_voltage"]) -> typing.Literal["ch6_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch7_current", b"_ch7_current"]) -> typing.Literal["ch7_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch7_voltage", b"_ch7_voltage"]) -> typing.Literal["ch7_voltage"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch8_current", b"_ch8_current"]) -> typing.Literal["ch8_current"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_ch8_voltage", b"_ch8_voltage"]) -> typing.Literal["ch8_voltage"] | None: ... - -global___PowerMetrics = PowerMetrics - -@typing.final -class AirQualityMetrics(google.protobuf.message.Message): - """ - Air quality metrics - """ + class _DiscoveryStageEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[LocalStats._DiscoveryStage.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + DISCOVERY_STAGE_UNSET: LocalStats._DiscoveryStage.ValueType # 0 + """ + Not reported. + """ + DISCOVERY_STAGE_ANNOUNCE: LocalStats._DiscoveryStage.ValueType # 1 + """ + Full-budget NodeInfo at node_info_broadcast_secs: no discovery server, few nodes. + """ + DISCOVERY_STAGE_TAPER: LocalStats._DiscoveryStage.ValueType # 2 + """ + Interval times taper_factor: a discovery server heard, or discovery_node_threshold nodes. + """ + DISCOVERY_STAGE_SERVE: LocalStats._DiscoveryStage.ValueType # 3 + """ + Enough servers heard for long enough: NodeInfo at hop_limit 1, plus one full-budget + announce per full_announce_secs. + """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + class DiscoveryStage(_DiscoveryStage, metaclass=_DiscoveryStageEnumTypeWrapper): + """ + Where this node stands on the node discovery cadence ladder (SCHEMA.md section 8). + """ - PM10_STANDARD_FIELD_NUMBER: builtins.int - PM25_STANDARD_FIELD_NUMBER: builtins.int - PM100_STANDARD_FIELD_NUMBER: builtins.int - PM10_ENVIRONMENTAL_FIELD_NUMBER: builtins.int - PM25_ENVIRONMENTAL_FIELD_NUMBER: builtins.int - PM100_ENVIRONMENTAL_FIELD_NUMBER: builtins.int - PARTICLES_03UM_FIELD_NUMBER: builtins.int - PARTICLES_05UM_FIELD_NUMBER: builtins.int - PARTICLES_10UM_FIELD_NUMBER: builtins.int - PARTICLES_25UM_FIELD_NUMBER: builtins.int - PARTICLES_50UM_FIELD_NUMBER: builtins.int - PARTICLES_100UM_FIELD_NUMBER: builtins.int - CO2_FIELD_NUMBER: builtins.int - CO2_TEMPERATURE_FIELD_NUMBER: builtins.int - CO2_HUMIDITY_FIELD_NUMBER: builtins.int - FORM_FORMALDEHYDE_FIELD_NUMBER: builtins.int - FORM_HUMIDITY_FIELD_NUMBER: builtins.int - FORM_TEMPERATURE_FIELD_NUMBER: builtins.int - PM40_STANDARD_FIELD_NUMBER: builtins.int - PARTICLES_40UM_FIELD_NUMBER: builtins.int - PM_TEMPERATURE_FIELD_NUMBER: builtins.int - PM_HUMIDITY_FIELD_NUMBER: builtins.int - 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 - """ - pm25_standard: builtins.int - """ - Concentration Units Standard PM2.5 in ug/m3 - """ - pm100_standard: builtins.int - """ - Concentration Units Standard PM10.0 in ug/m3 - """ - pm10_environmental: builtins.int - """ - Concentration Units Environmental PM1.0 in ug/m3 - """ - pm25_environmental: builtins.int - """ - Concentration Units Environmental PM2.5 in ug/m3 - """ - pm100_environmental: builtins.int - """ - Concentration Units Environmental PM10.0 in ug/m3 - """ - particles_03um: builtins.int - """ - 0.3um Particle Count in #/0.1l - """ - particles_05um: builtins.int - """ - 0.5um Particle Count in #/0.1l - """ - particles_10um: builtins.int - """ - 1.0um Particle Count in #/0.1l - """ - particles_25um: builtins.int - """ - 2.5um Particle Count in #/0.1l - """ - particles_50um: builtins.int + DISCOVERY_STAGE_UNSET: LocalStats.DiscoveryStage.ValueType # 0 """ - 5.0um Particle Count in #/0.1l + Not reported. """ - particles_100um: builtins.int + DISCOVERY_STAGE_ANNOUNCE: LocalStats.DiscoveryStage.ValueType # 1 """ - 10.0um Particle Count in #/0.1l + Full-budget NodeInfo at node_info_broadcast_secs: no discovery server, few nodes. """ - co2: builtins.int + DISCOVERY_STAGE_TAPER: LocalStats.DiscoveryStage.ValueType # 2 """ - CO2 concentration in ppm + Interval times taper_factor: a discovery server heard, or discovery_node_threshold nodes. """ - co2_temperature: builtins.float + DISCOVERY_STAGE_SERVE: LocalStats.DiscoveryStage.ValueType # 3 """ - CO2 sensor temperature in degC - """ - co2_humidity: builtins.float - """ - CO2 sensor relative humidity in % - """ - form_formaldehyde: builtins.float - """ - Formaldehyde sensor formaldehyde concentration in ppb - """ - form_humidity: builtins.float - """ - Formaldehyde sensor relative humidity in %RH - """ - form_temperature: builtins.float - """ - Formaldehyde sensor temperature in degrees Celsius - """ - pm40_standard: builtins.int - """ - Concentration Units Standard PM4.0 in ug/m3 - """ - particles_40um: builtins.int - """ - 4.0um Particle Count in #/0.1l - """ - pm_temperature: builtins.float - """ - PM Sensor Temperature - """ - pm_humidity: builtins.float - """ - PM Sensor humidity - """ - pm_voc_idx: builtins.float - """ - PM Sensor VOC Index - """ - pm_nox_idx: builtins.float - """ - PM Sensor NOx Index - """ - particles_tps: builtins.float - """ - 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, - *, - pm10_standard: builtins.int | None = ..., - pm25_standard: builtins.int | None = ..., - pm100_standard: builtins.int | None = ..., - pm10_environmental: builtins.int | None = ..., - pm25_environmental: builtins.int | None = ..., - pm100_environmental: builtins.int | None = ..., - particles_03um: builtins.int | None = ..., - particles_05um: builtins.int | None = ..., - particles_10um: builtins.int | None = ..., - particles_25um: builtins.int | None = ..., - particles_50um: builtins.int | None = ..., - particles_100um: builtins.int | None = ..., - co2: builtins.int | None = ..., - co2_temperature: builtins.float | None = ..., - co2_humidity: builtins.float | None = ..., - form_formaldehyde: builtins.float | None = ..., - form_humidity: builtins.float | None = ..., - form_temperature: builtins.float | None = ..., - pm40_standard: builtins.int | None = ..., - particles_40um: builtins.int | None = ..., - pm_temperature: builtins.float | None = ..., - pm_humidity: builtins.float | None = ..., - 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_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 - def WhichOneof(self, oneof_group: typing.Literal["_co2_humidity", b"_co2_humidity"]) -> typing.Literal["co2_humidity"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_co2_temperature", b"_co2_temperature"]) -> typing.Literal["co2_temperature"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_form_formaldehyde", b"_form_formaldehyde"]) -> typing.Literal["form_formaldehyde"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_form_humidity", b"_form_humidity"]) -> typing.Literal["form_humidity"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_form_temperature", b"_form_temperature"]) -> typing.Literal["form_temperature"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_03um", b"_particles_03um"]) -> typing.Literal["particles_03um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_05um", b"_particles_05um"]) -> typing.Literal["particles_05um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_100um", b"_particles_100um"]) -> typing.Literal["particles_100um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_10um", b"_particles_10um"]) -> typing.Literal["particles_10um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_25um", b"_particles_25um"]) -> typing.Literal["particles_25um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_40um", b"_particles_40um"]) -> typing.Literal["particles_40um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_50um", b"_particles_50um"]) -> typing.Literal["particles_50um"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_particles_tps", b"_particles_tps"]) -> typing.Literal["particles_tps"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm100_environmental", b"_pm100_environmental"]) -> typing.Literal["pm100_environmental"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm100_standard", b"_pm100_standard"]) -> typing.Literal["pm100_standard"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm10_environmental", b"_pm10_environmental"]) -> typing.Literal["pm10_environmental"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm10_standard", b"_pm10_standard"]) -> typing.Literal["pm10_standard"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm25_environmental", b"_pm25_environmental"]) -> typing.Literal["pm25_environmental"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm25_standard", b"_pm25_standard"]) -> typing.Literal["pm25_standard"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm40_standard", b"_pm40_standard"]) -> typing.Literal["pm40_standard"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_pm_humidity", b"_pm_humidity"]) -> typing.Literal["pm_humidity"] | None: ... - @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: ... - -global___AirQualityMetrics = AirQualityMetrics - -@typing.final -class LocalStats(google.protobuf.message.Message): - """ - Local device mesh statistics + Enough servers heard for long enough: NodeInfo at hop_limit 1, plus one full-budget + announce per full_announce_secs. """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - UPTIME_SECONDS_FIELD_NUMBER: builtins.int - CHANNEL_UTILIZATION_FIELD_NUMBER: builtins.int - AIR_UTIL_TX_FIELD_NUMBER: builtins.int - NUM_PACKETS_TX_FIELD_NUMBER: builtins.int - NUM_PACKETS_RX_FIELD_NUMBER: builtins.int - NUM_PACKETS_RX_BAD_FIELD_NUMBER: builtins.int - NUM_ONLINE_NODES_FIELD_NUMBER: builtins.int - NUM_TOTAL_NODES_FIELD_NUMBER: builtins.int - NUM_RX_DUPE_FIELD_NUMBER: builtins.int - NUM_TX_RELAY_FIELD_NUMBER: builtins.int - NUM_TX_RELAY_CANCELED_FIELD_NUMBER: builtins.int - HEAP_TOTAL_BYTES_FIELD_NUMBER: builtins.int - HEAP_FREE_BYTES_FIELD_NUMBER: builtins.int - NUM_TX_DROPPED_FIELD_NUMBER: builtins.int - NOISE_FLOOR_FIELD_NUMBER: builtins.int - uptime_seconds: builtins.int + UPTIME_SECONDS_FIELD_NUMBER: _builtins.int + CHANNEL_UTILIZATION_FIELD_NUMBER: _builtins.int + AIR_UTIL_TX_FIELD_NUMBER: _builtins.int + NUM_PACKETS_TX_FIELD_NUMBER: _builtins.int + NUM_PACKETS_RX_FIELD_NUMBER: _builtins.int + NUM_PACKETS_RX_BAD_FIELD_NUMBER: _builtins.int + NUM_ONLINE_NODES_FIELD_NUMBER: _builtins.int + NUM_TOTAL_NODES_FIELD_NUMBER: _builtins.int + NUM_RX_DUPE_FIELD_NUMBER: _builtins.int + NUM_TX_RELAY_FIELD_NUMBER: _builtins.int + NUM_TX_RELAY_CANCELED_FIELD_NUMBER: _builtins.int + HEAP_TOTAL_BYTES_FIELD_NUMBER: _builtins.int + HEAP_FREE_BYTES_FIELD_NUMBER: _builtins.int + NUM_TX_DROPPED_FIELD_NUMBER: _builtins.int + NOISE_FLOOR_FIELD_NUMBER: _builtins.int + NUM_TX_RELAY_SUPPRESSED_FIELD_NUMBER: _builtins.int + DISCOVERY_STAGE_FIELD_NUMBER: _builtins.int + DISCOVERY_SERVERS_FIELD_NUMBER: _builtins.int + uptime_seconds: _builtins.int """ How long the device has been running since the last reboot (in seconds) """ - channel_utilization: builtins.float + channel_utilization: _builtins.int """ - Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). + Channel utilization x100 """ - air_util_tx: builtins.float + air_util_tx: _builtins.int """ - Percent of airtime for transmission used within the last hour. + Percent of airtime for TX x100 """ - num_packets_tx: builtins.int + num_packets_tx: _builtins.int """ Number of packets sent """ - num_packets_rx: builtins.int + num_packets_rx: _builtins.int """ Number of packets received (both good and bad) """ - num_packets_rx_bad: builtins.int + num_packets_rx_bad: _builtins.int """ Number of packets received that are malformed or violate the protocol """ - num_online_nodes: builtins.int + num_online_nodes: _builtins.int """ Number of nodes online (in the past 2 hours) """ - num_total_nodes: builtins.int + num_total_nodes: _builtins.int """ Number of nodes total """ - num_rx_dupe: builtins.int + num_rx_dupe: _builtins.int """ Number of received packets that were duplicates (due to multiple nodes relaying). - If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role. + If this number is high, there are nodes in the mesh relaying packets when it is + unnecessary, for example because too many of them carry a relaying role. """ - num_tx_relay: builtins.int + num_tx_relay: _builtins.int """ Number of packets we transmitted that were a relay for others (not originating from ourselves). """ - num_tx_relay_canceled: builtins.int + num_tx_relay_canceled: _builtins.int """ Number of times we canceled a packet to be relayed, because someone else did it before us. - This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you. + This is always zero on a node that relays without waiting, which is what a ROUTER + does. If this number is high, other nodes are relaying faster than you. """ - heap_total_bytes: builtins.int + heap_total_bytes: _builtins.int """ Number of bytes used in the heap """ - heap_free_bytes: builtins.int + heap_free_bytes: _builtins.int """ Number of bytes free in the heap """ - num_tx_dropped: builtins.int + num_tx_dropped: _builtins.int """ Number of packets that were dropped because the transmit queue was full. """ - noise_floor: builtins.int + noise_floor: _builtins.int + """ + Noise floor in dBm (negative) + """ + num_tx_relay_suppressed: _builtins.int + """ + Broadcasts this node did not relay because client auto-mute was in force + (DeviceConfig.auto_mute_router_count). """ - Noise floor value measured in dBm + discovery_stage: Global___LocalStats.DiscoveryStage.ValueType + """ + The stage, and below it the reason: how many discovery servers this node hears. + num_online_nodes is the other input. + """ + discovery_servers: _builtins.int + """ + Distinct discovery servers heard within the last three hours. """ def __init__( self, *, - uptime_seconds: builtins.int = ..., - channel_utilization: builtins.float = ..., - air_util_tx: builtins.float = ..., - num_packets_tx: builtins.int = ..., - num_packets_rx: builtins.int = ..., - num_packets_rx_bad: builtins.int = ..., - num_online_nodes: builtins.int = ..., - num_total_nodes: builtins.int = ..., - num_rx_dupe: builtins.int = ..., - num_tx_relay: builtins.int = ..., - num_tx_relay_canceled: builtins.int = ..., - heap_total_bytes: builtins.int = ..., - heap_free_bytes: builtins.int = ..., - num_tx_dropped: builtins.int = ..., - noise_floor: builtins.int = ..., + uptime_seconds: _builtins.int = ..., + channel_utilization: _builtins.int = ..., + air_util_tx: _builtins.int = ..., + num_packets_tx: _builtins.int = ..., + num_packets_rx: _builtins.int = ..., + num_packets_rx_bad: _builtins.int = ..., + num_online_nodes: _builtins.int = ..., + num_total_nodes: _builtins.int = ..., + num_rx_dupe: _builtins.int = ..., + num_tx_relay: _builtins.int = ..., + num_tx_relay_canceled: _builtins.int = ..., + heap_total_bytes: _builtins.int = ..., + heap_free_bytes: _builtins.int = ..., + num_tx_dropped: _builtins.int = ..., + noise_floor: _builtins.int = ..., + num_tx_relay_suppressed: _builtins.int = ..., + discovery_stage: Global___LocalStats.DiscoveryStage.ValueType = ..., + discovery_servers: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "heap_free_bytes", b"heap_free_bytes", "heap_total_bytes", b"heap_total_bytes", "noise_floor", b"noise_floor", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_rx_dupe", b"num_rx_dupe", "num_total_nodes", b"num_total_nodes", "num_tx_dropped", b"num_tx_dropped", "num_tx_relay", b"num_tx_relay", "num_tx_relay_canceled", b"num_tx_relay_canceled", "uptime_seconds", b"uptime_seconds"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "discovery_servers", b"discovery_servers", "discovery_stage", b"discovery_stage", "heap_free_bytes", b"heap_free_bytes", "heap_total_bytes", b"heap_total_bytes", "noise_floor", b"noise_floor", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_rx_dupe", b"num_rx_dupe", "num_total_nodes", b"num_total_nodes", "num_tx_dropped", b"num_tx_dropped", "num_tx_relay", b"num_tx_relay", "num_tx_relay_canceled", b"num_tx_relay_canceled", "num_tx_relay_suppressed", b"num_tx_relay_suppressed", "uptime_seconds", b"uptime_seconds"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___LocalStats = LocalStats +Global___LocalStats: _TypeAlias = LocalStats # noqa: Y015 -@typing.final -class TrafficManagementStats(google.protobuf.message.Message): +@_typing.final +class TrafficManagementStats(_message.Message): """ Traffic management statistics for mesh network optimization """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - PACKETS_INSPECTED_FIELD_NUMBER: builtins.int - POSITION_DEDUP_DROPS_FIELD_NUMBER: builtins.int - NODEINFO_CACHE_HITS_FIELD_NUMBER: builtins.int - RATE_LIMIT_DROPS_FIELD_NUMBER: builtins.int - UNKNOWN_PACKET_DROPS_FIELD_NUMBER: builtins.int - HOP_EXHAUSTED_PACKETS_FIELD_NUMBER: builtins.int - ROUTER_HOPS_PRESERVED_FIELD_NUMBER: builtins.int - packets_inspected: builtins.int + PACKETS_INSPECTED_FIELD_NUMBER: _builtins.int + POSITION_DEDUP_DROPS_FIELD_NUMBER: _builtins.int + NODEINFO_CACHE_HITS_FIELD_NUMBER: _builtins.int + RATE_LIMIT_DROPS_FIELD_NUMBER: _builtins.int + UNKNOWN_PACKET_DROPS_FIELD_NUMBER: _builtins.int + HOP_EXHAUSTED_PACKETS_FIELD_NUMBER: _builtins.int + ROUTER_HOPS_PRESERVED_FIELD_NUMBER: _builtins.int + packets_inspected: _builtins.int """ Total number of packets inspected by traffic management """ - position_dedup_drops: builtins.int + position_dedup_drops: _builtins.int """ Number of position packets dropped due to deduplication """ - nodeinfo_cache_hits: builtins.int + nodeinfo_cache_hits: _builtins.int """ Number of NodeInfo requests answered from cache """ - rate_limit_drops: builtins.int + rate_limit_drops: _builtins.int """ Number of packets dropped due to rate limiting """ - unknown_packet_drops: builtins.int + unknown_packet_drops: _builtins.int """ Number of unknown/undecryptable packets dropped """ - hop_exhausted_packets: builtins.int + hop_exhausted_packets: _builtins.int """ Number of packets with hop_limit exhausted for local-only broadcast """ - router_hops_preserved: builtins.int + router_hops_preserved: _builtins.int """ Number of times router hop preservation was applied """ def __init__( self, *, - packets_inspected: builtins.int = ..., - position_dedup_drops: builtins.int = ..., - nodeinfo_cache_hits: builtins.int = ..., - rate_limit_drops: builtins.int = ..., - unknown_packet_drops: builtins.int = ..., - hop_exhausted_packets: builtins.int = ..., - router_hops_preserved: builtins.int = ..., + packets_inspected: _builtins.int = ..., + position_dedup_drops: _builtins.int = ..., + nodeinfo_cache_hits: _builtins.int = ..., + rate_limit_drops: _builtins.int = ..., + unknown_packet_drops: _builtins.int = ..., + hop_exhausted_packets: _builtins.int = ..., + router_hops_preserved: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["hop_exhausted_packets", b"hop_exhausted_packets", "nodeinfo_cache_hits", b"nodeinfo_cache_hits", "packets_inspected", b"packets_inspected", "position_dedup_drops", b"position_dedup_drops", "rate_limit_drops", b"rate_limit_drops", "router_hops_preserved", b"router_hops_preserved", "unknown_packet_drops", b"unknown_packet_drops"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["hop_exhausted_packets", b"hop_exhausted_packets", "nodeinfo_cache_hits", b"nodeinfo_cache_hits", "packets_inspected", b"packets_inspected", "position_dedup_drops", b"position_dedup_drops", "rate_limit_drops", b"rate_limit_drops", "router_hops_preserved", b"router_hops_preserved", "unknown_packet_drops", b"unknown_packet_drops"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___TrafficManagementStats = TrafficManagementStats +Global___TrafficManagementStats: _TypeAlias = TrafficManagementStats # noqa: Y015 -@typing.final -class HealthMetrics(google.protobuf.message.Message): - """ - Health telemetry metrics - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - HEART_BPM_FIELD_NUMBER: builtins.int - SPO2_FIELD_NUMBER: builtins.int - TEMPERATURE_FIELD_NUMBER: builtins.int - heart_bpm: builtins.int - """ - Heart rate (beats per minute) - """ - spO2: builtins.int - """ - SpO2 (blood oxygen saturation) level - """ - temperature: builtins.float - """ - Body temperature in degrees Celsius - """ - def __init__( - self, - *, - heart_bpm: builtins.int | None = ..., - spO2: builtins.int | None = ..., - temperature: builtins.float | None = ..., - ) -> None: ... - def HasField(self, field_name: typing.Literal["_heart_bpm", b"_heart_bpm", "_spO2", b"_spO2", "_temperature", b"_temperature", "heart_bpm", b"heart_bpm", "spO2", b"spO2", "temperature", b"temperature"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_heart_bpm", b"_heart_bpm", "_spO2", b"_spO2", "_temperature", b"_temperature", "heart_bpm", b"heart_bpm", "spO2", b"spO2", "temperature", b"temperature"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_heart_bpm", b"_heart_bpm"]) -> typing.Literal["heart_bpm"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_spO2", b"_spO2"]) -> typing.Literal["spO2"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_temperature", b"_temperature"]) -> typing.Literal["temperature"] | None: ... - -global___HealthMetrics = HealthMetrics - -@typing.final -class HostMetrics(google.protobuf.message.Message): +@_typing.final +class HostMetrics(_message.Message): """ Linux host metrics """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - UPTIME_SECONDS_FIELD_NUMBER: builtins.int - FREEMEM_BYTES_FIELD_NUMBER: builtins.int - DISKFREE1_BYTES_FIELD_NUMBER: builtins.int - DISKFREE2_BYTES_FIELD_NUMBER: builtins.int - DISKFREE3_BYTES_FIELD_NUMBER: builtins.int - LOAD1_FIELD_NUMBER: builtins.int - LOAD5_FIELD_NUMBER: builtins.int - LOAD15_FIELD_NUMBER: builtins.int - USER_STRING_FIELD_NUMBER: builtins.int - uptime_seconds: builtins.int + UPTIME_SECONDS_FIELD_NUMBER: _builtins.int + FREEMEM_BYTES_FIELD_NUMBER: _builtins.int + DISKFREE1_BYTES_FIELD_NUMBER: _builtins.int + DISKFREE2_BYTES_FIELD_NUMBER: _builtins.int + DISKFREE3_BYTES_FIELD_NUMBER: _builtins.int + LOAD1_FIELD_NUMBER: _builtins.int + LOAD5_FIELD_NUMBER: _builtins.int + LOAD15_FIELD_NUMBER: _builtins.int + USER_STRING_FIELD_NUMBER: _builtins.int + uptime_seconds: _builtins.int """ Host system uptime """ - freemem_bytes: builtins.int + freemem_bytes: _builtins.int """ Host system free memory """ - diskfree1_bytes: builtins.int + diskfree1_bytes: _builtins.int """ Host system disk space free for / """ - diskfree2_bytes: builtins.int + diskfree2_bytes: _builtins.int """ Secondary system disk space free """ - diskfree3_bytes: builtins.int + diskfree3_bytes: _builtins.int """ Tertiary disk space free """ - load1: builtins.int + load1: _builtins.int """ Host system one minute load in 1/100ths """ - load5: builtins.int + load5: _builtins.int """ Host system five minute load in 1/100ths """ - load15: builtins.int + load15: _builtins.int """ Host system fifteen minute load in 1/100ths """ - user_string: builtins.str + user_string: _builtins.str """ Optional User-provided string for arbitrary host system information that doesn't make sense as a dedicated entry. @@ -1679,161 +836,727 @@ class HostMetrics(google.protobuf.message.Message): def __init__( self, *, - uptime_seconds: builtins.int = ..., - freemem_bytes: builtins.int = ..., - diskfree1_bytes: builtins.int = ..., - diskfree2_bytes: builtins.int | None = ..., - diskfree3_bytes: builtins.int | None = ..., - load1: builtins.int = ..., - load5: builtins.int = ..., - load15: builtins.int = ..., - user_string: builtins.str | None = ..., + uptime_seconds: _builtins.int = ..., + freemem_bytes: _builtins.int = ..., + diskfree1_bytes: _builtins.int = ..., + diskfree2_bytes: _builtins.int | None = ..., + diskfree3_bytes: _builtins.int | None = ..., + load1: _builtins.int = ..., + load5: _builtins.int = ..., + load15: _builtins.int = ..., + user_string: _builtins.str | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "user_string", b"user_string"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree1_bytes", b"diskfree1_bytes", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "freemem_bytes", b"freemem_bytes", "load1", b"load1", "load15", b"load15", "load5", b"load5", "uptime_seconds", b"uptime_seconds", "user_string", b"user_string"]) -> None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes"]) -> typing.Literal["diskfree2_bytes"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_diskfree3_bytes", b"_diskfree3_bytes"]) -> typing.Literal["diskfree3_bytes"] | None: ... - @typing.overload - def WhichOneof(self, oneof_group: typing.Literal["_user_string", b"_user_string"]) -> typing.Literal["user_string"] | None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "user_string", b"user_string"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree1_bytes", b"diskfree1_bytes", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "freemem_bytes", b"freemem_bytes", "load1", b"load1", "load15", b"load15", "load5", b"load5", "uptime_seconds", b"uptime_seconds", "user_string", b"user_string"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__diskfree2_bytes: _TypeAlias = _typing.Literal["diskfree2_bytes"] # noqa: Y015 + _WhichOneofArgType__diskfree2_bytes: _TypeAlias = _typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes"] # noqa: Y015 + _WhichOneofReturnType__diskfree3_bytes: _TypeAlias = _typing.Literal["diskfree3_bytes"] # noqa: Y015 + _WhichOneofArgType__diskfree3_bytes: _TypeAlias = _typing.Literal["_diskfree3_bytes", b"_diskfree3_bytes"] # noqa: Y015 + _WhichOneofReturnType__user_string: _TypeAlias = _typing.Literal["user_string"] # noqa: Y015 + _WhichOneofArgType__user_string: _TypeAlias = _typing.Literal["_user_string", b"_user_string"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__diskfree2_bytes) -> _WhichOneofReturnType__diskfree2_bytes | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__diskfree3_bytes) -> _WhichOneofReturnType__diskfree3_bytes | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__user_string) -> _WhichOneofReturnType__user_string | None: ... + +Global___HostMetrics: _TypeAlias = HostMetrics # noqa: Y015 + +@_typing.final +class SensorReadings(_message.Message): + """ + A list of sensor readings. + + Replaces the fixed typed metric messages. Those declared one field per quantity, + which meant most of the message was absent on any given node, a node could never + report two of the same quantity, and every new sensor needed a schema change. Six + separate temperature fields and three channel-indexed voltage pairs were the + symptom. + + The layout is columnar and delta coded. `keys` names the quantity set once; + `values` holds one column per key, each column delta coded down the samples; + `time_deltas` carries the sample times differenced twice; `present` carries one + bitmap per sample; `sensors` carries one entry per key. Nothing repeats a quantity + name or a timestamp per reading. + + That is the whole compression story, and it is ordinary packed protobuf: no bit + packing, no separate codec, nothing a generated decoder cannot already read. On a + captured 21-hour corpus of public broker traffic, eight buffered samples cost + about 71 bytes here against 200 as one message per reading. + + A single sample is the live broadcast: one entry per column, no deltas, no times. + Send as many samples as the payload allows, then start another message. + + On size: a reading costs one key byte plus one to three value bytes, against a + typed field's one to two tag bytes plus the same value. That is slightly larger for + a three-reading BME280 broadcast and slightly smaller once a quantity would need a + two-byte tag, which a catalogue this size reaches quickly. What it buys is unbounded + quantities, repeated quantities and no schema churn per sensor. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Quantity: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _QuantityEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SensorReadings._Quantity.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + QUANTITY_UNSET: SensorReadings._Quantity.ValueType # 0 + """Not set; never valid in a key""" + AIR_TEMPERATURE_C_CENTI: SensorReadings._Quantity.ValueType # 1 + """--- Atmosphere --- + + Air temperature, centi-degrees Celsius (2350 = 23.50 C) + """ + AIR_HUMIDITY_PCT_CENTI: SensorReadings._Quantity.ValueType # 2 + """Relative humidity, centi-percent (6550 = 65.50 %)""" + AIR_PRESSURE_PA: SensorReadings._Quantity.ValueType # 3 + """Barometric pressure, pascals (101325)""" + WIND_DIRECTION_DEG: SensorReadings._Quantity.ValueType # 4 + """Wind direction, degrees true, 0..359""" + WIND_SPEED_CMS: SensorReadings._Quantity.ValueType # 5 + """Wind speed, centimetres per second""" + WIND_GUST_CMS: SensorReadings._Quantity.ValueType # 6 + """Wind gust, centimetres per second""" + WIND_LULL_CMS: SensorReadings._Quantity.ValueType # 7 + """Wind lull, centimetres per second""" + RAINFALL_1H_MM: SensorReadings._Quantity.ValueType # 8 + """Rainfall in the last hour, millimetres""" + RAINFALL_24H_MM: SensorReadings._Quantity.ValueType # 9 + """Rainfall in the last 24 hours, millimetres""" + RADIATION_URH: SensorReadings._Quantity.ValueType # 10 + """Ionising radiation, microroentgen per hour""" + LIGHTNING_STRIKES_1H: SensorReadings._Quantity.ValueType # 11 + """Lightning strikes detected in the last hour""" + LIGHTNING_DISTANCE_KM: SensorReadings._Quantity.ValueType # 12 + """Distance to the leading edge of the storm, kilometres""" + ILLUMINANCE_LUX_DECI: SensorReadings._Quantity.ValueType # 13 + """--- Light --- + + + Ambient illuminance, deci-lux (12345 = 1234.5 lx). + + Deci and not centi: the best ambient light sensors in use resolve about + 0.004 lx at maximum gain and most resolve 1 lx, while readings run to six + figures in daylight. A hundredth of a lux is finer than any of them and + multiplies every delta by ten for it, which costs a byte per sample on a + column that moves at all. + """ + ILLUMINANCE_WHITE_LUX_DECI: SensorReadings._Quantity.ValueType # 14 + """White-channel illuminance, deci-lux""" + ILLUMINANCE_IR_LUX_DECI: SensorReadings._Quantity.ValueType # 15 + """Infrared illuminance, deci-lux""" + ILLUMINANCE_UV_LUX_DECI: SensorReadings._Quantity.ValueType # 16 + """Ultraviolet illuminance, deci-lux""" + SOLAR_IRRADIANCE_WM2: SensorReadings._Quantity.ValueType # 17 + """Solar irradiance, watts per square metre""" + VOLTAGE_MV: SensorReadings._Quantity.ValueType # 18 + """--- Electrical --- + + Voltage, millivolts. Ordinal selects the channel. + """ + CURRENT_MA: SensorReadings._Quantity.ValueType # 19 + """Current, milliamps, negative when discharging. Ordinal selects the channel.""" + VOLTAGE_UV: SensorReadings._Quantity.ValueType # 20 + """ + Voltage, microvolts. For electrochemical sensor outputs, whose signal sits in + the microvolt range. Supply rails and battery voltages use VOLTAGE_MV: a rail + carried here is four bytes absolute and inflates every delta a thousandfold. + Ordinal selects the channel. + """ + DISTANCE_MM: SensorReadings._Quantity.ValueType # 21 + """--- Distance and mass --- -global___HostMetrics = HostMetrics + Distance, millimetres + """ + WEIGHT_G: SensorReadings._Quantity.ValueType # 22 + """Weight, grams""" + SOIL_TEMPERATURE_C_CENTI: SensorReadings._Quantity.ValueType # 23 + """--- Soil --- -@typing.final -class Telemetry(google.protobuf.message.Message): - """ - Types of Measurements the telemetry module is equipped to handle - """ + Soil temperature, centi-degrees Celsius + """ + SOIL_MOISTURE_PCT: SensorReadings._Quantity.ValueType # 24 + """Soil moisture, percent""" + SOIL_PH_CENTI: SensorReadings._Quantity.ValueType # 25 + """Soil pH, centi-pH (725 = pH 7.25)""" + SOIL_CONDUCTIVITY_USCM: SensorReadings._Quantity.ValueType # 26 + """Electrical conductivity, microsiemens per centimetre""" + SOIL_NITROGEN_MGKG: SensorReadings._Quantity.ValueType # 27 + """Nitrogen, milligrams per kilogram""" + SOIL_PHOSPHORUS_MGKG: SensorReadings._Quantity.ValueType # 28 + """Phosphorus, milligrams per kilogram""" + SOIL_POTASSIUM_MGKG: SensorReadings._Quantity.ValueType # 29 + """Potassium, milligrams per kilogram""" + WATER_PH_CENTI: SensorReadings._Quantity.ValueType # 30 + """--- Water --- + + pH of water or solution, centi-pH + """ + WATER_CONDUCTIVITY_USCM: SensorReadings._Quantity.ValueType # 31 + """Electrical conductivity, microsiemens per centimetre""" + WATER_SALINITY_MGL: SensorReadings._Quantity.ValueType # 32 + """Salinity, milligrams per litre""" + WATER_DISSOLVED_OXYGEN_MGL_CENTI: SensorReadings._Quantity.ValueType # 33 + """Dissolved oxygen, centi-milligrams per litre""" + WATER_ORP_MV: SensorReadings._Quantity.ValueType # 34 + """Oxidation-reduction potential, millivolts, may be negative""" + WATER_COD_MGL: SensorReadings._Quantity.ValueType # 35 + """Chemical oxygen demand, milligrams per litre""" + WATER_BOD_MGL: SensorReadings._Quantity.ValueType # 36 + """Biochemical oxygen demand, milligrams per litre""" + WATER_TURBIDITY_NTU_CENTI: SensorReadings._Quantity.ValueType # 37 + """Turbidity, centi-NTU""" + WATER_NITRATE_PPM_CENTI: SensorReadings._Quantity.ValueType # 38 + """Nitrate, centi-ppm""" + WATER_AMMONIUM_PPM_CENTI: SensorReadings._Quantity.ValueType # 39 + """Ammonium, centi-ppm""" + PM1_0_STD_UGM3_DECI: SensorReadings._Quantity.ValueType # 40 + """--- Air Quality --- + + PM1.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3) + """ + PM2_5_STD_UGM3_DECI: SensorReadings._Quantity.ValueType # 41 + """PM2.5, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM4_0_STD_UGM3_DECI: SensorReadings._Quantity.ValueType # 42 + """PM4.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM10_0_STD_UGM3_DECI: SensorReadings._Quantity.ValueType # 43 + """PM10.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM1_0_ENV_UGM3_DECI: SensorReadings._Quantity.ValueType # 44 + """PM1.0, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM2_5_ENV_UGM3_DECI: SensorReadings._Quantity.ValueType # 45 + """PM2.5, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM10_0_ENV_UGM3_DECI: SensorReadings._Quantity.ValueType # 46 + """PM10.0, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PARTICLES_0_3UM: SensorReadings._Quantity.ValueType # 47 + """Particles at least 0.3 um (#/0.1l)""" + PARTICLES_0_5UM: SensorReadings._Quantity.ValueType # 48 + """Particles at least 0.5 um (#/0.1l)""" + PARTICLES_1_0UM: SensorReadings._Quantity.ValueType # 49 + """Particles at least 1.0 um (#/0.1l)""" + PARTICLES_2_5UM: SensorReadings._Quantity.ValueType # 50 + """Particles at least 2.5 um (#/0.1l)""" + PARTICLES_4_0UM: SensorReadings._Quantity.ValueType # 51 + """Particles at least 4.0 um (#/0.1l)""" + PARTICLES_5_0UM: SensorReadings._Quantity.ValueType # 52 + """Particles at least 5.0 um (#/0.1l)""" + PARTICLES_10_0UM: SensorReadings._Quantity.ValueType # 53 + """Particles at least 10.0 um (#/0.1l)""" + PARTICLE_SIZE_UM_CENTI: SensorReadings._Quantity.ValueType # 54 + """Typical particle size, centi-micrometres (235 = 2.35 um)""" + CO2_PPM: SensorReadings._Quantity.ValueType # 55 + """Carbon dioxide, parts per million""" + HCHO_PPB: SensorReadings._Quantity.ValueType # 56 + """Formaldehyde, parts per billion""" + VOC_INDEX: SensorReadings._Quantity.ValueType # 57 + """VOC index""" + NOX_INDEX: SensorReadings._Quantity.ValueType # 58 + """NOx index""" + IAQ_INDEX: SensorReadings._Quantity.ValueType # 59 + """Indoor air quality index, 0..500""" + SENSOR_GAS_RESISTANCE_KOHM: SensorReadings._Quantity.ValueType # 60 + """Metal Oxyde Sensor Gas resistance, kilo-ohms""" + PM_STATUS_FLAGS: SensorReadings._Quantity.ValueType # 61 + """ + Raw PM sensor status/error register, as defined by the sensor's own datasheet. + A bitmask rather than a measurement; see the sensor named in `sensors`. + """ + SENSOR_TEMPERATURE_C_CENTI: SensorReadings._Quantity.ValueType # 62 + """--- Compensation channels --- + + A gas or particulate sensor reports its own temperature and humidity so a + reading can be corrected for them. These are NOT ambient conditions: the part + sits in an enclosure and self-heats, so the value runs warm and averaging it + with AIR_TEMPERATURE_C_CENTI corrupts both. They are separate quantities for + that reason and not per sensor family: what makes them distinct is being a + compensation channel, so name the part in `sensors` and use the ordinal to + separate two of the same kind. + + Sensor-internal temperature, centi-degrees Celsius (2350 = 23.50 C) + """ + SENSOR_HUMIDITY_PCT_CENTI: SensorReadings._Quantity.ValueType # 63 + """Sensor-internal humidity, centi-percent (6550 = 65.50 %)""" + BODY_HEART_RATE_BPM: SensorReadings._Quantity.ValueType # 64 + """--- Body --- - DESCRIPTOR: google.protobuf.descriptor.Descriptor + Heart rate, beats per minute + """ + BODY_SPO2_PCT: SensorReadings._Quantity.ValueType # 65 + """Blood oxygen saturation, percent""" + BODY_TEMPERATURE_C_CENTI: SensorReadings._Quantity.ValueType # 66 + """Body temperature, centi-degrees Celsius""" - TIME_FIELD_NUMBER: builtins.int - DEVICE_METRICS_FIELD_NUMBER: builtins.int - ENVIRONMENT_METRICS_FIELD_NUMBER: builtins.int - AIR_QUALITY_METRICS_FIELD_NUMBER: builtins.int - POWER_METRICS_FIELD_NUMBER: builtins.int - LOCAL_STATS_FIELD_NUMBER: builtins.int - 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 - """ - @property - def device_metrics(self) -> global___DeviceMetrics: + class Quantity(_Quantity, metaclass=_QuantityEnumTypeWrapper): """ - Key native device metrics such as battery level + What a reading measures, including the unit and scale it is reported in. + + The unit is part of the quantity rather than a separate field: it costs nothing + per reading, and two nodes can never report the same quantity in different + units. Where one measurand spans ranges no single scale serves, each range is its + own quantity chosen to suit the sensor - a supply rail in VOLTAGE_MV against an + electrochemical cell's output in VOLTAGE_UV - and a sensor reports under the one + that matches what it measures. Values are 1..127 so a key with ordinal 0 fits in a + single byte. + + Every quantity names a fixed-point scale, so a value is always an integer and + never a float. `_CENTI` means hundredths of the named unit: 23.50 C is 2350 under + TEMPERATURE_C_CENTI. A quantity that needs no fraction, like CO2_PPM, is a plain + integer. This is deliberate - a float is always four bytes on the wire where a + scaled varint is one to three, spends its precision on significant digits no + sensor has, and costs software floating point on an FPU-less MCU. If a quantity + ever needs finer resolution, its enum value gets a finer scale; the encoding + never changes per reading. + + Fields of measurement (AIR, WATER, SOIL, and more) are prefixes to the metric + to indicate the field of application. This is important to distinguish between different + fields and explicitly express what each quantity refers to. + + Where one quantity is measured by several sensors on one node - air temperature + from two BME280s at different points on a mast - use one quantity and separate + them by ordinal, naming each in `sensors` where it matters. + + A reading is a different quantity only when it measures a different thing, not + when a different part produced it. The temperature a CO2 or PM sensor reports for + its own compensation is one of those: it describes the inside of an enclosure + rather than the air, so it is SENSOR_TEMPERATURE_C_CENTI and not an ordinal of + AIR_TEMPERATURE_C_CENTI. Two ordinary sensors disagreeing about the same air are + not. """ - @property - def environment_metrics(self) -> global___EnvironmentMetrics: + QUANTITY_UNSET: SensorReadings.Quantity.ValueType # 0 + """Not set; never valid in a key""" + AIR_TEMPERATURE_C_CENTI: SensorReadings.Quantity.ValueType # 1 + """--- Atmosphere --- + + Air temperature, centi-degrees Celsius (2350 = 23.50 C) + """ + AIR_HUMIDITY_PCT_CENTI: SensorReadings.Quantity.ValueType # 2 + """Relative humidity, centi-percent (6550 = 65.50 %)""" + AIR_PRESSURE_PA: SensorReadings.Quantity.ValueType # 3 + """Barometric pressure, pascals (101325)""" + WIND_DIRECTION_DEG: SensorReadings.Quantity.ValueType # 4 + """Wind direction, degrees true, 0..359""" + WIND_SPEED_CMS: SensorReadings.Quantity.ValueType # 5 + """Wind speed, centimetres per second""" + WIND_GUST_CMS: SensorReadings.Quantity.ValueType # 6 + """Wind gust, centimetres per second""" + WIND_LULL_CMS: SensorReadings.Quantity.ValueType # 7 + """Wind lull, centimetres per second""" + RAINFALL_1H_MM: SensorReadings.Quantity.ValueType # 8 + """Rainfall in the last hour, millimetres""" + RAINFALL_24H_MM: SensorReadings.Quantity.ValueType # 9 + """Rainfall in the last 24 hours, millimetres""" + RADIATION_URH: SensorReadings.Quantity.ValueType # 10 + """Ionising radiation, microroentgen per hour""" + LIGHTNING_STRIKES_1H: SensorReadings.Quantity.ValueType # 11 + """Lightning strikes detected in the last hour""" + LIGHTNING_DISTANCE_KM: SensorReadings.Quantity.ValueType # 12 + """Distance to the leading edge of the storm, kilometres""" + ILLUMINANCE_LUX_DECI: SensorReadings.Quantity.ValueType # 13 + """--- Light --- + + + Ambient illuminance, deci-lux (12345 = 1234.5 lx). + + Deci and not centi: the best ambient light sensors in use resolve about + 0.004 lx at maximum gain and most resolve 1 lx, while readings run to six + figures in daylight. A hundredth of a lux is finer than any of them and + multiplies every delta by ten for it, which costs a byte per sample on a + column that moves at all. + """ + ILLUMINANCE_WHITE_LUX_DECI: SensorReadings.Quantity.ValueType # 14 + """White-channel illuminance, deci-lux""" + ILLUMINANCE_IR_LUX_DECI: SensorReadings.Quantity.ValueType # 15 + """Infrared illuminance, deci-lux""" + ILLUMINANCE_UV_LUX_DECI: SensorReadings.Quantity.ValueType # 16 + """Ultraviolet illuminance, deci-lux""" + SOLAR_IRRADIANCE_WM2: SensorReadings.Quantity.ValueType # 17 + """Solar irradiance, watts per square metre""" + VOLTAGE_MV: SensorReadings.Quantity.ValueType # 18 + """--- Electrical --- + + Voltage, millivolts. Ordinal selects the channel. + """ + CURRENT_MA: SensorReadings.Quantity.ValueType # 19 + """Current, milliamps, negative when discharging. Ordinal selects the channel.""" + VOLTAGE_UV: SensorReadings.Quantity.ValueType # 20 + """ + Voltage, microvolts. For electrochemical sensor outputs, whose signal sits in + the microvolt range. Supply rails and battery voltages use VOLTAGE_MV: a rail + carried here is four bytes absolute and inflates every delta a thousandfold. + Ordinal selects the channel. + """ + DISTANCE_MM: SensorReadings.Quantity.ValueType # 21 + """--- Distance and mass --- + + Distance, millimetres + """ + WEIGHT_G: SensorReadings.Quantity.ValueType # 22 + """Weight, grams""" + SOIL_TEMPERATURE_C_CENTI: SensorReadings.Quantity.ValueType # 23 + """--- Soil --- + + Soil temperature, centi-degrees Celsius + """ + SOIL_MOISTURE_PCT: SensorReadings.Quantity.ValueType # 24 + """Soil moisture, percent""" + SOIL_PH_CENTI: SensorReadings.Quantity.ValueType # 25 + """Soil pH, centi-pH (725 = pH 7.25)""" + SOIL_CONDUCTIVITY_USCM: SensorReadings.Quantity.ValueType # 26 + """Electrical conductivity, microsiemens per centimetre""" + SOIL_NITROGEN_MGKG: SensorReadings.Quantity.ValueType # 27 + """Nitrogen, milligrams per kilogram""" + SOIL_PHOSPHORUS_MGKG: SensorReadings.Quantity.ValueType # 28 + """Phosphorus, milligrams per kilogram""" + SOIL_POTASSIUM_MGKG: SensorReadings.Quantity.ValueType # 29 + """Potassium, milligrams per kilogram""" + WATER_PH_CENTI: SensorReadings.Quantity.ValueType # 30 + """--- Water --- + + pH of water or solution, centi-pH + """ + WATER_CONDUCTIVITY_USCM: SensorReadings.Quantity.ValueType # 31 + """Electrical conductivity, microsiemens per centimetre""" + WATER_SALINITY_MGL: SensorReadings.Quantity.ValueType # 32 + """Salinity, milligrams per litre""" + WATER_DISSOLVED_OXYGEN_MGL_CENTI: SensorReadings.Quantity.ValueType # 33 + """Dissolved oxygen, centi-milligrams per litre""" + WATER_ORP_MV: SensorReadings.Quantity.ValueType # 34 + """Oxidation-reduction potential, millivolts, may be negative""" + WATER_COD_MGL: SensorReadings.Quantity.ValueType # 35 + """Chemical oxygen demand, milligrams per litre""" + WATER_BOD_MGL: SensorReadings.Quantity.ValueType # 36 + """Biochemical oxygen demand, milligrams per litre""" + WATER_TURBIDITY_NTU_CENTI: SensorReadings.Quantity.ValueType # 37 + """Turbidity, centi-NTU""" + WATER_NITRATE_PPM_CENTI: SensorReadings.Quantity.ValueType # 38 + """Nitrate, centi-ppm""" + WATER_AMMONIUM_PPM_CENTI: SensorReadings.Quantity.ValueType # 39 + """Ammonium, centi-ppm""" + PM1_0_STD_UGM3_DECI: SensorReadings.Quantity.ValueType # 40 + """--- Air Quality --- + + PM1.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3) + """ + PM2_5_STD_UGM3_DECI: SensorReadings.Quantity.ValueType # 41 + """PM2.5, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM4_0_STD_UGM3_DECI: SensorReadings.Quantity.ValueType # 42 + """PM4.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM10_0_STD_UGM3_DECI: SensorReadings.Quantity.ValueType # 43 + """PM10.0, standard conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM1_0_ENV_UGM3_DECI: SensorReadings.Quantity.ValueType # 44 + """PM1.0, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM2_5_ENV_UGM3_DECI: SensorReadings.Quantity.ValueType # 45 + """PM2.5, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PM10_0_ENV_UGM3_DECI: SensorReadings.Quantity.ValueType # 46 + """PM10.0, ambient conditions deci-ug/m3 (235 = 23.5 ug/m3)""" + PARTICLES_0_3UM: SensorReadings.Quantity.ValueType # 47 + """Particles at least 0.3 um (#/0.1l)""" + PARTICLES_0_5UM: SensorReadings.Quantity.ValueType # 48 + """Particles at least 0.5 um (#/0.1l)""" + PARTICLES_1_0UM: SensorReadings.Quantity.ValueType # 49 + """Particles at least 1.0 um (#/0.1l)""" + PARTICLES_2_5UM: SensorReadings.Quantity.ValueType # 50 + """Particles at least 2.5 um (#/0.1l)""" + PARTICLES_4_0UM: SensorReadings.Quantity.ValueType # 51 + """Particles at least 4.0 um (#/0.1l)""" + PARTICLES_5_0UM: SensorReadings.Quantity.ValueType # 52 + """Particles at least 5.0 um (#/0.1l)""" + PARTICLES_10_0UM: SensorReadings.Quantity.ValueType # 53 + """Particles at least 10.0 um (#/0.1l)""" + PARTICLE_SIZE_UM_CENTI: SensorReadings.Quantity.ValueType # 54 + """Typical particle size, centi-micrometres (235 = 2.35 um)""" + CO2_PPM: SensorReadings.Quantity.ValueType # 55 + """Carbon dioxide, parts per million""" + HCHO_PPB: SensorReadings.Quantity.ValueType # 56 + """Formaldehyde, parts per billion""" + VOC_INDEX: SensorReadings.Quantity.ValueType # 57 + """VOC index""" + NOX_INDEX: SensorReadings.Quantity.ValueType # 58 + """NOx index""" + IAQ_INDEX: SensorReadings.Quantity.ValueType # 59 + """Indoor air quality index, 0..500""" + SENSOR_GAS_RESISTANCE_KOHM: SensorReadings.Quantity.ValueType # 60 + """Metal Oxyde Sensor Gas resistance, kilo-ohms""" + PM_STATUS_FLAGS: SensorReadings.Quantity.ValueType # 61 + """ + Raw PM sensor status/error register, as defined by the sensor's own datasheet. + A bitmask rather than a measurement; see the sensor named in `sensors`. + """ + SENSOR_TEMPERATURE_C_CENTI: SensorReadings.Quantity.ValueType # 62 + """--- Compensation channels --- + + A gas or particulate sensor reports its own temperature and humidity so a + reading can be corrected for them. These are NOT ambient conditions: the part + sits in an enclosure and self-heats, so the value runs warm and averaging it + with AIR_TEMPERATURE_C_CENTI corrupts both. They are separate quantities for + that reason and not per sensor family: what makes them distinct is being a + compensation channel, so name the part in `sensors` and use the ordinal to + separate two of the same kind. + + Sensor-internal temperature, centi-degrees Celsius (2350 = 23.50 C) + """ + SENSOR_HUMIDITY_PCT_CENTI: SensorReadings.Quantity.ValueType # 63 + """Sensor-internal humidity, centi-percent (6550 = 65.50 %)""" + BODY_HEART_RATE_BPM: SensorReadings.Quantity.ValueType # 64 + """--- Body --- + + Heart rate, beats per minute + """ + BODY_SPO2_PCT: SensorReadings.Quantity.ValueType # 65 + """Blood oxygen saturation, percent""" + BODY_TEMPERATURE_C_CENTI: SensorReadings.Quantity.ValueType # 66 + """Body temperature, centi-degrees Celsius""" + + KEYS_FIELD_NUMBER: _builtins.int + VALUES_FIELD_NUMBER: _builtins.int + TIME_DELTAS_FIELD_NUMBER: _builtins.int + PRESENT_FIELD_NUMBER: _builtins.int + SENSORS_FIELD_NUMBER: _builtins.int + @_builtins.property + def keys(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - Weather station or other environmental metrics + The quantities this message carries, written once for the whole message rather + than once per reading: `(ordinal << 8) | (constant << 7) | quantity` each. + + The ordinal distinguishes several sensors reporting the same quantity on one + node and is 0 for the first or only one, so an ordinary quantity is a single + byte. A second sensor of the same quantity pushes its key to two. + + `constant` says the column never changes across the batch, so it contributes + exactly one entry to `values` instead of one per sample. A batch that carries + rainfall, lightning counts or a status word usually carries several columns + that never move, and each of them otherwise spends a byte per sample saying + nothing. Setting the bit costs one byte on the key - it pushes the key above + 127, which an ordinal of 1 or more does anyway - and saves one byte for every + sample after the first, so it pays from three samples up. + + A single-sample message never sets it: there is nothing to collapse. """ - @property - def air_quality_metrics(self) -> global___AirQualityMetrics: + @_builtins.property + def values(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - Air quality metrics + The readings, quantity-major and delta coded. + + Laid out one column per entry in `keys`, in that order. A column holds the + samples that actually carry its quantity, oldest first: the first entry is the + absolute value, and every entry after it is the difference from the previous + entry *in the same column*. A column whose key sets the constant bit holds one + entry and no deltas. + + Column-major and not sample-major because consecutive numbers are then one + sensor moving over time rather than unrelated quantities side by side, and a + sensor moves slowly. Air temperature drifting 0.3 C between samples is one byte + as a delta against two or three absolute. On a captured 21-hour corpus this is + where nearly all of the batching win comes from. + + A message holding one sample has one entry per column and no deltas arise, so a + live broadcast reads as plain values. Deltas only appear once a message carries + a batch, which is the case that is already being reconstructed from + `time_deltas` and `present`. + + keys = [TEMPERATURE_C_CENTI, PRESSURE_PA] + samples = 3 + temperature = 1582, 1548, 1514 -> 1582, -34, -34 + pressure = 98801, 98814, 98857 -> 98801, 13, 43 + values = [1582, -34, -34, 98801, 13, 43] """ - @property - def power_metrics(self) -> global___PowerMetrics: + @_builtins.property + def time_deltas(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - Power Metrics + Sample times, one entry per sample after the first, differenced twice. + + `Telemetry.time` is the first sample's time. Entry 0 is the interval from the + first sample to the second. Every entry after that is the change in interval: + the gap before this sample minus the gap before the previous one. + + A node reporting on a fixed cadence therefore emits one interval and then zeros, + one byte each, however far back the batch reaches and whatever the cadence is. + Differencing once would spend two bytes per sample restating the same interval; + not differencing at all would spend three once the batch spans more than a few + hours. + + Absent means the message holds a single sample, taken at `Telemetry.time`. That + is the live case and costs nothing. + + Telemetry.time = 1000, samples at 1000, 4600, 8200, 11800 (hourly) + intervals = 3600, 3600, 3600 + time_deltas = [3600, 0, 0] + + the same node late by 40 s on the last sample: + intervals = 3600, 3600, 3640 + time_deltas = [3600, 0, 40] + + Reconstruct by running both sums: interval += entry, time += interval. """ - @property - def local_stats(self) -> global___LocalStats: + @_builtins.property + def present(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - Local device mesh statistics + One bitmap per sample, oldest first: bit k set when that sample carries keys[k]. + + It is what tells a reader how long each column in `values` is, and which samples + a column's deltas step between - a column skips absent samples rather than + holding a gap, so "the previous entry in the column" is the previous sample that + carried the quantity, not simply the sample before. + + Absent means every sample carries every key, which is the common case: a node's + sensor set rarely changes between samples. Then every non-constant column is one + entry per sample. + + The sample count is never derived from `values`. It is `time_deltas` length plus + one, or one when `time_deltas` is absent, which stays true whatever mix of + constant, ragged and ordinary columns the message holds. """ - @property - def health_metrics(self) -> global___HealthMetrics: + @_builtins.property + def sensors(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - Health telemetry metrics + Optional, one per key rather than per reading: the TelemetrySensorType behind + that quantity. Provenance belongs to the quantity and ordinal, not to each + sample, so it is written once however many samples the message holds. + + Omit unless it matters - telling two temperature sensors apart, or attributing a + calibration or a status register. Costs nothing when absent. """ - @property - def host_metrics(self) -> global___HostMetrics: + def __init__( + self, + *, + keys: _abc.Iterable[_builtins.int] | None = ..., + values: _abc.Iterable[_builtins.int] | None = ..., + time_deltas: _abc.Iterable[_builtins.int] | None = ..., + present: _abc.Iterable[_builtins.int] | None = ..., + sensors: _abc.Iterable[_builtins.int] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["keys", b"keys", "present", b"present", "sensors", b"sensors", "time_deltas", b"time_deltas", "values", b"values"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SensorReadings: _TypeAlias = SensorReadings # noqa: Y015 + +@_typing.final +class Telemetry(_message.Message): + """ + Types of Measurements the telemetry module is equipped to handle + """ + + DESCRIPTOR: _descriptor.Descriptor + + TIME_FIELD_NUMBER: _builtins.int + DEVICE_METRICS_FIELD_NUMBER: _builtins.int + SENSOR_READINGS_FIELD_NUMBER: _builtins.int + LOCAL_STATS_FIELD_NUMBER: _builtins.int + HOST_METRICS_FIELD_NUMBER: _builtins.int + TRAFFIC_MANAGEMENT_STATS_FIELD_NUMBER: _builtins.int + time: _builtins.int + """ + Seconds since 1970 - or 0 for unknown/unset + """ + @_builtins.property + def device_metrics(self) -> Global___DeviceMetrics: """ - Linux host metrics + Key native device metrics such as battery level """ - @property - def traffic_management_stats(self) -> global___TrafficManagementStats: + @_builtins.property + def sensor_readings(self) -> Global___SensorReadings: """ - Traffic management statistics + Sensor readings: environment, air quality, power and health, as a list rather + than four messages of fixed typed fields. + """ + + @_builtins.property + def local_stats(self) -> Global___LocalStats: + """ + Local device mesh statistics """ - @property - def soil_water_metrics(self) -> global___SoilWaterMetrics: + @_builtins.property + def host_metrics(self) -> Global___HostMetrics: """ - Soil and water probe metrics + Linux host metrics + """ + + @_builtins.property + def traffic_management_stats(self) -> Global___TrafficManagementStats: + """ + Traffic management statistics """ def __init__( self, *, - time: builtins.int = ..., - device_metrics: global___DeviceMetrics | None = ..., - environment_metrics: global___EnvironmentMetrics | None = ..., - air_quality_metrics: global___AirQualityMetrics | None = ..., - power_metrics: global___PowerMetrics | None = ..., - local_stats: global___LocalStats | None = ..., - health_metrics: global___HealthMetrics | None = ..., - host_metrics: global___HostMetrics | None = ..., - traffic_management_stats: global___TrafficManagementStats | None = ..., - soil_water_metrics: global___SoilWaterMetrics | None = ..., + time: _builtins.int = ..., + device_metrics: Global___DeviceMetrics | None = ..., + sensor_readings: Global___SensorReadings | None = ..., + local_stats: Global___LocalStats | None = ..., + host_metrics: Global___HostMetrics | None = ..., + traffic_management_stats: Global___TrafficManagementStats | 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", "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: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["device_metrics", b"device_metrics", "host_metrics", b"host_metrics", "local_stats", b"local_stats", "sensor_readings", b"sensor_readings", "traffic_management_stats", b"traffic_management_stats", "variant", b"variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_metrics", b"device_metrics", "host_metrics", b"host_metrics", "local_stats", b"local_stats", "sensor_readings", b"sensor_readings", "time", b"time", "traffic_management_stats", b"traffic_management_stats", "variant", b"variant"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_variant: _TypeAlias = _typing.Literal["device_metrics", "sensor_readings", "local_stats", "host_metrics", "traffic_management_stats"] # noqa: Y015 + _WhichOneofArgType_variant: _TypeAlias = _typing.Literal["variant", b"variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_variant) -> _WhichOneofReturnType_variant | None: ... -global___Telemetry = Telemetry +Global___Telemetry: _TypeAlias = Telemetry # noqa: Y015 -@typing.final -class Nau7802Config(google.protobuf.message.Message): +@_typing.final +class Nau7802Config(_message.Message): """ NAU7802 Telemetry configuration, for saving to flash """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - ZEROOFFSET_FIELD_NUMBER: builtins.int - CALIBRATIONFACTOR_FIELD_NUMBER: builtins.int - zeroOffset: builtins.int + ZEROOFFSET_FIELD_NUMBER: _builtins.int + CALIBRATIONFACTOR_FIELD_NUMBER: _builtins.int + zeroOffset: _builtins.int """ - The offset setting for the NAU7802 + The offset setting for the NAU7802. + + sint32 because a tare against a 24-bit ADC is routinely negative, and a + negative plain int32 costs ten bytes whatever its magnitude. """ - calibrationFactor: builtins.float + calibrationFactor: _builtins.float """ The calibration factor for the NAU7802 """ def __init__( self, *, - zeroOffset: builtins.int = ..., - calibrationFactor: builtins.float = ..., + zeroOffset: _builtins.int = ..., + calibrationFactor: _builtins.float = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["calibrationFactor", b"calibrationFactor", "zeroOffset", b"zeroOffset"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["calibrationFactor", b"calibrationFactor", "zeroOffset", b"zeroOffset"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___Nau7802Config = Nau7802Config +Global___Nau7802Config: _TypeAlias = Nau7802Config # noqa: Y015 -@typing.final -class AS3935State(google.protobuf.message.Message): +@_typing.final +class AS3935State(_message.Message): """ AS3935 lightning sensor state, for saving to flash """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _descriptor.Descriptor - TUNING_CAP_PF_FIELD_NUMBER: builtins.int - tuning_cap_pf: builtins.int + 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. @@ -1841,126 +1564,146 @@ class AS3935State(google.protobuf.message.Message): def __init__( self, *, - tuning_cap_pf: builtins.int = ..., + tuning_cap_pf: _builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["tuning_cap_pf", b"tuning_cap_pf"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["tuning_cap_pf", b"tuning_cap_pf"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___AS3935State = AS3935State +Global___AS3935State: _TypeAlias = AS3935State # noqa: Y015 -@typing.final -class SEN5XState(google.protobuf.message.Message): +@_typing.final +class SEN5XState(_message.Message): """ SEN5X State, for saving to flash (to be merged with SEN6XState) """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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_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 SEN5X """ - last_cleaning_valid: builtins.bool + last_cleaning_valid: _builtins.bool """ Last cleaning time for SEN5X - valid flag """ - one_shot_mode: builtins.bool + one_shot_mode: _builtins.bool """ Config flag for one-shot mode (see admin.proto) """ - voc_state_time: builtins.int + voc_state_time: _builtins.int """ Last VOC state time for SEN55 """ - voc_state_valid: builtins.bool + voc_state_valid: _builtins.bool """ Last VOC state validity flag for SEN55 """ - voc_state_array: builtins.int + voc_state_array: _builtins.int """ VOC state array (8x uint8t) for SEN55 """ 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 = ..., + 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___SEN5XState = SEN5XState - -@typing.final -class SEN6XState(google.protobuf.message.Message): + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__voc_state_array: _TypeAlias = _typing.Literal["voc_state_array"] # noqa: Y015 + _WhichOneofArgType__voc_state_array: _TypeAlias = _typing.Literal["_voc_state_array", b"_voc_state_array"] # noqa: Y015 + _WhichOneofReturnType__voc_state_time: _TypeAlias = _typing.Literal["voc_state_time"] # noqa: Y015 + _WhichOneofArgType__voc_state_time: _TypeAlias = _typing.Literal["_voc_state_time", b"_voc_state_time"] # noqa: Y015 + _WhichOneofReturnType__voc_state_valid: _TypeAlias = _typing.Literal["voc_state_valid"] # noqa: Y015 + _WhichOneofArgType__voc_state_valid: _TypeAlias = _typing.Literal["_voc_state_valid", b"_voc_state_valid"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_array) -> _WhichOneofReturnType__voc_state_array | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_time) -> _WhichOneofReturnType__voc_state_time | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_valid) -> _WhichOneofReturnType__voc_state_valid | None: ... + +Global___SEN5XState: _TypeAlias = SEN5XState # noqa: Y015 + +@_typing.final +class SEN6XState(_message.Message): """ SEN6X State, for saving to flash """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor + DESCRIPTOR: _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_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_valid: _builtins.bool """ Last cleaning time for SEN6X - valid flag """ - one_shot_mode: builtins.bool + one_shot_mode: _builtins.bool """ Config flag for one-shot mode (see admin.proto) """ - voc_state_time: builtins.int + voc_state_time: _builtins.int """ Last VOC state time, for models with a VOC sensor (SEN65, SEN66, SEN68, SEN69C) """ - voc_state_valid: builtins.bool + 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: _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 = ..., + 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 + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__voc_state_array: _TypeAlias = _typing.Literal["voc_state_array"] # noqa: Y015 + _WhichOneofArgType__voc_state_array: _TypeAlias = _typing.Literal["_voc_state_array", b"_voc_state_array"] # noqa: Y015 + _WhichOneofReturnType__voc_state_time: _TypeAlias = _typing.Literal["voc_state_time"] # noqa: Y015 + _WhichOneofArgType__voc_state_time: _TypeAlias = _typing.Literal["_voc_state_time", b"_voc_state_time"] # noqa: Y015 + _WhichOneofReturnType__voc_state_valid: _TypeAlias = _typing.Literal["voc_state_valid"] # noqa: Y015 + _WhichOneofArgType__voc_state_valid: _TypeAlias = _typing.Literal["_voc_state_valid", b"_voc_state_valid"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_array) -> _WhichOneofReturnType__voc_state_array | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_time) -> _WhichOneofReturnType__voc_state_time | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__voc_state_valid) -> _WhichOneofReturnType__voc_state_valid | None: ... + +Global___SEN6XState: _TypeAlias = SEN6XState # noqa: Y015 diff --git a/meshtastic/protobuf/wire_pb2.py b/meshtastic/protobuf/wire_pb2.py new file mode 100644 index 000000000..ec3b77359 --- /dev/null +++ b/meshtastic/protobuf/wire_pb2.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/wire.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import portnums_pb2 as meshtastic_dot_protobuf_dot_portnums__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xf4\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x13\n\x0bis_licensed\x18\x04 \x01(\x08\x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\x07 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\x0bratchet_key\x18\x08 \x01(\x0c\x42\x05\x92?\x02\x08 B\x12\n\x10_is_unmessagable\"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"\x9a\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\x1b\n\x0cneighbor_ids\x18\x04 \x03(\x07\x42\x05\x92?\x02\x10\n\x12\x1d\n\x0cneighbor_snr\x18\x05 \x03(\x11\x42\x07\x92?\x04\x10\n8\x08\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"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.wire_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_POSITION'].fields_by_name['precision_bits']._options = None + _globals['_POSITION'].fields_by_name['precision_bits']._serialized_options = b'\222?\0028\010' + _globals['_POSITION'].fields_by_name['sats_in_view']._options = None + _globals['_POSITION'].fields_by_name['sats_in_view']._serialized_options = b'\222?\0028\010' + _globals['_POSITION'].fields_by_name['fix_quality']._options = None + _globals['_POSITION'].fields_by_name['fix_quality']._serialized_options = b'\222?\0028\010' + _globals['_POSITION'].fields_by_name['fix_type']._options = None + _globals['_POSITION'].fields_by_name['fix_type']._serialized_options = b'\222?\0028\010' + _globals['_POSITION'].fields_by_name['sensor_id']._options = None + _globals['_POSITION'].fields_by_name['sensor_id']._serialized_options = b'\222?\0028\010' + _globals['_USER'].fields_by_name['long_name']._options = None + _globals['_USER'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _globals['_USER'].fields_by_name['short_name']._options = None + _globals['_USER'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_USER'].fields_by_name['public_key']._options = None + _globals['_USER'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _globals['_USER'].fields_by_name['ratchet_key']._options = None + _globals['_USER'].fields_by_name['ratchet_key']._serialized_options = b'\222?\002\010 ' + _globals['_ROUTING'].fields_by_name['ack_proof']._options = None + _globals['_ROUTING'].fields_by_name['ack_proof']._serialized_options = b'\222?\002\010\010' + _globals['_DATA'].fields_by_name['payload']._options = None + _globals['_DATA'].fields_by_name['payload']._serialized_options = b'\222?\003\010\200\002' + _globals['_DATA'].fields_by_name['bitfield']._options = None + _globals['_DATA'].fields_by_name['bitfield']._serialized_options = b'\222?\0028\010' + _globals['_DATA'].fields_by_name['xeddsa_signature']._options = None + _globals['_DATA'].fields_by_name['xeddsa_signature']._serialized_options = b'\222?\002\010@' + _globals['_KEYVERIFICATION'].fields_by_name['hash1']._options = None + _globals['_KEYVERIFICATION'].fields_by_name['hash1']._serialized_options = b'\222?\002\010 ' + _globals['_KEYVERIFICATION'].fields_by_name['hash2']._options = None + _globals['_KEYVERIFICATION'].fields_by_name['hash2']._serialized_options = b'\222?\002\010 ' + _globals['_HEADEROPTIONS'].fields_by_name['hop_flags']._options = None + _globals['_HEADEROPTIONS'].fields_by_name['hop_flags']._serialized_options = b'\222?\0028\010' + _globals['_HEADEROPTIONS'].fields_by_name['scope_code']._options = None + _globals['_HEADEROPTIONS'].fields_by_name['scope_code']._serialized_options = b'\222?\0028\020' + _globals['_REMOTESHELL'].fields_by_name['op']._options = None + _globals['_REMOTESHELL'].fields_by_name['op']._serialized_options = b'\222?\0028\010' + _globals['_REMOTESHELL'].fields_by_name['payload']._options = None + _globals['_REMOTESHELL'].fields_by_name['payload']._serialized_options = b'\222?\003\010\310\001' + _globals['_REMOTESHELL'].fields_by_name['cols']._options = None + _globals['_REMOTESHELL'].fields_by_name['cols']._serialized_options = b'\222?\0028\020' + _globals['_REMOTESHELL'].fields_by_name['rows']._options = None + _globals['_REMOTESHELL'].fields_by_name['rows']._serialized_options = b'\222?\0028\020' + _globals['_REMOTESHELL'].fields_by_name['flags']._options = None + _globals['_REMOTESHELL'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_WAYPOINT'].fields_by_name['id']._options = None + _globals['_WAYPOINT'].fields_by_name['id']._serialized_options = b'\222?\002\010\020' + _globals['_WAYPOINT'].fields_by_name['name']._options = None + _globals['_WAYPOINT'].fields_by_name['name']._serialized_options = b'\222?\002\010\036' + _globals['_WAYPOINT'].fields_by_name['description']._options = None + _globals['_WAYPOINT'].fields_by_name['description']._serialized_options = b'\222?\002\010d' + _globals['_WAYPOINT'].fields_by_name['notify_flags']._options = None + _globals['_WAYPOINT'].fields_by_name['notify_flags']._serialized_options = b'\222?\0028\010' + _globals['_STATUSMESSAGE'].fields_by_name['status']._options = None + _globals['_STATUSMESSAGE'].fields_by_name['status']._serialized_options = b'\222?\002\010P' + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['topic']._options = None + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['topic']._serialized_options = b'\222?\002\010<' + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['data']._options = None + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['data']._serialized_options = b'\222?\003\010\263\003' + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['text']._options = None + _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['text']._serialized_options = b'\222?\003\010\263\003' + _globals['_INJECTEDFRAME'].fields_by_name['data']._options = None + _globals['_INJECTEDFRAME'].fields_by_name['data']._serialized_options = b'\222?\003\010\200\002' + _globals['_NEIGHBORINFO'].fields_by_name['neighbor_ids']._options = None + _globals['_NEIGHBORINFO'].fields_by_name['neighbor_ids']._serialized_options = b'\222?\002\020\n' + _globals['_NEIGHBORINFO'].fields_by_name['neighbor_snr']._options = None + _globals['_NEIGHBORINFO'].fields_by_name['neighbor_snr']._serialized_options = b'\222?\004\020\n8\010' + _globals['_POSITION']._serialized_start=160 + _globals['_POSITION']._serialized_end=864 + _globals['_USER']._serialized_start=867 + _globals['_USER']._serialized_end=1111 + _globals['_ROUTING']._serialized_start=1114 + _globals['_ROUTING']._serialized_end=1582 + _globals['_ROUTING_ERROR']._serialized_start=1212 + _globals['_ROUTING_ERROR']._serialized_end=1571 + _globals['_DATA']._serialized_start=1585 + _globals['_DATA']._serialized_end=1876 + _globals['_DATA_BITFIELD']._serialized_start=1781 + _globals['_DATA_BITFIELD']._serialized_end=1863 + _globals['_KEYVERIFICATION']._serialized_start=1878 + _globals['_KEYVERIFICATION']._serialized_end=1954 + _globals['_HEADEROPTIONS']._serialized_start=1957 + _globals['_HEADEROPTIONS']._serialized_end=2119 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=2045 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2119 + _globals['_REMOTESHELL']._serialized_start=2122 + _globals['_REMOTESHELL']._serialized_end=2591 + _globals['_REMOTESHELL_OPCODE']._serialized_start=2379 + _globals['_REMOTESHELL_OPCODE']._serialized_end=2522 + _globals['_REMOTESHELL_FLAGS']._serialized_start=2524 + _globals['_REMOTESHELL_FLAGS']._serialized_end=2591 + _globals['_BOUNDINGBOX']._serialized_start=2593 + _globals['_BOUNDINGBOX']._serialized_end=2710 + _globals['_WAYPOINT']._serialized_start=2713 + _globals['_WAYPOINT']._serialized_end=3154 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=3008 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3106 + _globals['_STATUSMESSAGE']._serialized_start=3156 + _globals['_STATUSMESSAGE']._serialized_end=3194 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3197 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3328 + _globals['_INJECTEDFRAME']._serialized_start=3330 + _globals['_INJECTEDFRAME']._serialized_end=3414 + _globals['_NEIGHBORINFO']._serialized_start=3417 + _globals['_NEIGHBORINFO']._serialized_end=3571 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi new file mode 100644 index 000000000..bc5e2fba1 --- /dev/null +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -0,0 +1,1376 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from . import common_pb2 as _common_pb2 +from . import portnums_pb2 as _portnums_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class Position(_message.Message): + """ + A GPS Position + """ + + DESCRIPTOR: _descriptor.Descriptor + + LATITUDE_SCALED_FIELD_NUMBER: _builtins.int + LATITUDE_FIELD_NUMBER: _builtins.int + LONGITUDE_SCALED_FIELD_NUMBER: _builtins.int + LONGITUDE_FIELD_NUMBER: _builtins.int + PRECISION_BITS_FIELD_NUMBER: _builtins.int + TIME_FIELD_NUMBER: _builtins.int + ALTITUDE_FIELD_NUMBER: _builtins.int + LOCATION_SOURCE_FIELD_NUMBER: _builtins.int + GROUND_SPEED_FIELD_NUMBER: _builtins.int + GROUND_TRACK_FIELD_NUMBER: _builtins.int + SATS_IN_VIEW_FIELD_NUMBER: _builtins.int + PDOP_FIELD_NUMBER: _builtins.int + ALTITUDE_HAE_FIELD_NUMBER: _builtins.int + ALTITUDE_GEOIDAL_SEPARATION_FIELD_NUMBER: _builtins.int + SEQ_NUMBER_FIELD_NUMBER: _builtins.int + FIX_QUALITY_FIELD_NUMBER: _builtins.int + FIX_TYPE_FIELD_NUMBER: _builtins.int + HDOP_FIELD_NUMBER: _builtins.int + VDOP_FIELD_NUMBER: _builtins.int + GPS_ACCURACY_FIELD_NUMBER: _builtins.int + SENSOR_ID_FIELD_NUMBER: _builtins.int + NEXT_UPDATE_FIELD_NUMBER: _builtins.int + latitude_scaled: _builtins.int + """ + Scaled: latitude_i >> (32 - precision_bits). Reconstruct with + latitude_i = latitude_scaled << (32 - precision_bits). + """ + latitude: _builtins.int + """ + Full precision, multiply by 1e-7 to get degrees. + """ + longitude_scaled: _builtins.int + """ + Scaled: longitude_i >> (32 - precision_bits). + """ + longitude: _builtins.int + """ + Full precision, multiply by 1e-7 to get degrees. + """ + precision_bits: _builtins.int + """ + Bits of precision retained, 1 to 32. + Required with the scaled form: it cannot be reconstructed without this. + """ + time: _builtins.int + """ + Epoch seconds of this position: the time of the GPS solution where a GPS supplied + the fix, otherwise when the position was recorded, and 0 when the sender has no + trustworthy clock. A receiver uses it to set its own clock only when + location_source is LOC_INTERNAL or LOC_EXTERNAL. + """ + altitude: _builtins.int + """ + Altitude above mean sea level, in meters. + + altitude, altitude_hae and altitude_geoidal_separation are three values of which + any two give the third: HAE = MSL + separation. A position carries at most two of + them, as the GPS reports them, and which ones are present tells the receiver what + it has. + """ + location_source: _common_pb2.LocSource.ValueType + """ + How the location was acquired: manual, onboard GPS, external (EUD) GPS + """ + ground_speed: _builtins.int + """ + Ground speed in km/h. + Clarification of terms: + - "track" is the direction of motion (measured in horizontal plane) + - "heading" is where the fuselage points (measured in horizontal plane) + - "yaw" indicates a relative rotation about the vertical axis + """ + ground_track: _builtins.int + """ + True North TRACK in 1/100 degrees + """ + sats_in_view: _builtins.int + """ + GPS "Satellites in View" number + """ + PDOP: _builtins.int + """ + Position Dilution of Precision, in 1/100 units. + + A position carries dilution of precision in one of two forms, or not at all, and + which one depends on what the GPS chip reports: PDOP alone, or HDOP and VDOP. It + is never both, since PDOP = sqrt(HDOP^2 + VDOP^2). A real DOP is at least 1.00, so + 0 in any of the three means it was not sent. + """ + altitude_hae: _builtins.int + """ + Altitude above the WGS84 ellipsoid (HAE), in meters. See altitude for which of the + three altitude values travel together. + """ + altitude_geoidal_separation: _builtins.int + """ + Geoidal separation in meters, HAE minus MSL. See altitude. + """ + seq_number: _builtins.int + """ + A sequence number, incremented with each Position message to help + detect lost updates if needed + """ + fix_quality: _builtins.int + """Fields 16+ use 2-byte protobuf tags; less-critical fields go here + + + GPS fix quality (from NMEA GxGGA statement or similar) + """ + fix_type: _builtins.int + """ + GPS fix type 2D/3D (from NMEA GxGSA statement) + """ + HDOP: _builtins.int + """ + Horizontal Dilution of Precision, in 1/100 units. Sent with VDOP, never with PDOP. + """ + VDOP: _builtins.int + """ + Vertical Dilution of Precision, in 1/100 units. Sent with HDOP, never with PDOP. + """ + gps_accuracy: _builtins.int + """ + GPS accuracy (a hardware specific constant) in mm + multiplied with DOP to calculate positional accuracy + Default: "'bout three meters-ish" :) + """ + sensor_id: _builtins.int + """ + Sensor ID - in case multiple positioning sensors are being used + """ + next_update: _builtins.int + """ + Estimated/expected time (in seconds) until next update: + - if we update at fixed intervals of X seconds, use X + - if we update at dynamic intervals (based on relative movement etc), + but "AT LEAST every Y seconds", use Y + """ + def __init__( + self, + *, + latitude_scaled: _builtins.int = ..., + latitude: _builtins.int = ..., + longitude_scaled: _builtins.int = ..., + longitude: _builtins.int = ..., + precision_bits: _builtins.int = ..., + time: _builtins.int = ..., + altitude: _builtins.int | None = ..., + location_source: _common_pb2.LocSource.ValueType = ..., + ground_speed: _builtins.int | None = ..., + ground_track: _builtins.int | None = ..., + sats_in_view: _builtins.int = ..., + PDOP: _builtins.int = ..., + altitude_hae: _builtins.int | None = ..., + altitude_geoidal_separation: _builtins.int | None = ..., + seq_number: _builtins.int = ..., + fix_quality: _builtins.int = ..., + fix_type: _builtins.int = ..., + HDOP: _builtins.int = ..., + VDOP: _builtins.int = ..., + gps_accuracy: _builtins.int = ..., + sensor_id: _builtins.int = ..., + next_update: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_altitude", b"_altitude", "_altitude_geoidal_separation", b"_altitude_geoidal_separation", "_altitude_hae", b"_altitude_hae", "_ground_speed", b"_ground_speed", "_ground_track", b"_ground_track", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude", b"latitude", "latitude_scaled", b"latitude_scaled", "latitude_variant", b"latitude_variant", "longitude", b"longitude", "longitude_scaled", b"longitude_scaled", "longitude_variant", b"longitude_variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["HDOP", b"HDOP", "PDOP", b"PDOP", "VDOP", b"VDOP", "_altitude", b"_altitude", "_altitude_geoidal_separation", b"_altitude_geoidal_separation", "_altitude_hae", b"_altitude_hae", "_ground_speed", b"_ground_speed", "_ground_track", b"_ground_track", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "fix_quality", b"fix_quality", "fix_type", b"fix_type", "gps_accuracy", b"gps_accuracy", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude", b"latitude", "latitude_scaled", b"latitude_scaled", "latitude_variant", b"latitude_variant", "location_source", b"location_source", "longitude", b"longitude", "longitude_scaled", b"longitude_scaled", "longitude_variant", b"longitude_variant", "next_update", b"next_update", "precision_bits", b"precision_bits", "sats_in_view", b"sats_in_view", "sensor_id", b"sensor_id", "seq_number", b"seq_number", "time", b"time"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__altitude: _TypeAlias = _typing.Literal["altitude"] # noqa: Y015 + _WhichOneofArgType__altitude: _TypeAlias = _typing.Literal["_altitude", b"_altitude"] # noqa: Y015 + _WhichOneofReturnType__altitude_geoidal_separation: _TypeAlias = _typing.Literal["altitude_geoidal_separation"] # noqa: Y015 + _WhichOneofArgType__altitude_geoidal_separation: _TypeAlias = _typing.Literal["_altitude_geoidal_separation", b"_altitude_geoidal_separation"] # noqa: Y015 + _WhichOneofReturnType__altitude_hae: _TypeAlias = _typing.Literal["altitude_hae"] # noqa: Y015 + _WhichOneofArgType__altitude_hae: _TypeAlias = _typing.Literal["_altitude_hae", b"_altitude_hae"] # noqa: Y015 + _WhichOneofReturnType__ground_speed: _TypeAlias = _typing.Literal["ground_speed"] # noqa: Y015 + _WhichOneofArgType__ground_speed: _TypeAlias = _typing.Literal["_ground_speed", b"_ground_speed"] # noqa: Y015 + _WhichOneofReturnType__ground_track: _TypeAlias = _typing.Literal["ground_track"] # noqa: Y015 + _WhichOneofArgType__ground_track: _TypeAlias = _typing.Literal["_ground_track", b"_ground_track"] # noqa: Y015 + _WhichOneofReturnType_latitude_variant: _TypeAlias = _typing.Literal["latitude_scaled", "latitude"] # noqa: Y015 + _WhichOneofArgType_latitude_variant: _TypeAlias = _typing.Literal["latitude_variant", b"latitude_variant"] # noqa: Y015 + _WhichOneofReturnType_longitude_variant: _TypeAlias = _typing.Literal["longitude_scaled", "longitude"] # noqa: Y015 + _WhichOneofArgType_longitude_variant: _TypeAlias = _typing.Literal["longitude_variant", b"longitude_variant"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__altitude) -> _WhichOneofReturnType__altitude | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__altitude_geoidal_separation) -> _WhichOneofReturnType__altitude_geoidal_separation | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__altitude_hae) -> _WhichOneofReturnType__altitude_hae | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__ground_speed) -> _WhichOneofReturnType__ground_speed | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__ground_track) -> _WhichOneofReturnType__ground_track | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_latitude_variant) -> _WhichOneofReturnType_latitude_variant | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_longitude_variant) -> _WhichOneofReturnType_longitude_variant | None: ... + +Global___Position: _TypeAlias = Position # noqa: Y015 + +@_typing.final +class User(_message.Message): + """ + A node's user details: names, hardware, role and key. + Sent from the phone over bluetooth to set the owner of this node. + Also sent from nodes to each other when a new node signs on (so all clients can have this info). + Carries no node identifier: the NodeNum of the node it describes is the packet's + `from`, or the num of the record that holds it. + """ + + DESCRIPTOR: _descriptor.Descriptor + + LONG_NAME_FIELD_NUMBER: _builtins.int + SHORT_NAME_FIELD_NUMBER: _builtins.int + HW_MODEL_FIELD_NUMBER: _builtins.int + IS_LICENSED_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + PUBLIC_KEY_FIELD_NUMBER: _builtins.int + IS_UNMESSAGABLE_FIELD_NUMBER: _builtins.int + RATCHET_KEY_FIELD_NUMBER: _builtins.int + long_name: _builtins.str + """ + A full name for this user, i.e. "Kevin Hester" + Limited to 24 bytes of UTF-8. Clients should enforce that in their UI; a + device truncates anything longer before storing or rebroadcasting, with + sanitizeUtf8 cleaning up a partial multi-byte sequence at the boundary. + """ + short_name: _builtins.str + """ + A VERY short name, ideally two characters. + Suitable for a tiny OLED screen + """ + hw_model: _builtins.int + """ + Hardware model, packed as (vendor_id << 8 | device_id). + Names live in the hardware registry, not in this schema. + """ + is_licensed: _builtins.bool + """ + In some regions Ham radio operators have different bandwidth limitations than others. + If this user is a licensed operator, set this flag. + Also, "long_name" should be their licence number. + """ + role: _common_pb2.Role.ValueType + """ + Indicates that the user's role in the mesh. + The top-level Role enum from common.proto, so an air-layer message does not depend on + the configuration tree. + """ + public_key: _builtins.bytes + """ + The public key of the user's device. + This is sent out to other nodes on the mesh to allow them to compute a shared secret key. + """ + is_unmessagable: _builtins.bool + """ + Whether or not the node can be messaged + """ + ratchet_key: _builtins.bytes + """ + Current X25519 ratchet public key, present only while this node has forward secrecy + for direct messages enabled (SecurityConfig.ratchet_flags). Rotated every + ratchet_interval_secs. A receiver keeps the newest key it has seen for this node and + discards it once it is older than the sender's retention window, after which it falls + back to the static derivation. Authenticated by the XEdDSA signature on the NodeInfo + that carries it: an unsigned NodeInfo's ratchet key is ignored. + """ + def __init__( + self, + *, + long_name: _builtins.str = ..., + short_name: _builtins.str = ..., + hw_model: _builtins.int = ..., + is_licensed: _builtins.bool = ..., + role: _common_pb2.Role.ValueType = ..., + public_key: _builtins.bytes = ..., + is_unmessagable: _builtins.bool | None = ..., + ratchet_key: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "public_key", b"public_key", "ratchet_key", b"ratchet_key", "role", b"role", "short_name", b"short_name"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__is_unmessagable: _TypeAlias = _typing.Literal["is_unmessagable"] # noqa: Y015 + _WhichOneofArgType__is_unmessagable: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__is_unmessagable) -> _WhichOneofReturnType__is_unmessagable | None: ... + +Global___User: _TypeAlias = User # noqa: Y015 + +@_typing.final +class Routing(_message.Message): + """ + A Routing control Data packet handled by the routing module + + An ack to an anycast request comes from the member that delivered it, so its header + `from` is that member's NodeNum and not the group the request was addressed to; + `request_id` is what ties the two together. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Error: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _ErrorEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Routing._Error.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + NONE: Routing._Error.ValueType # 0 + """ + This message is not a failure + """ + NO_ROUTE: Routing._Error.ValueType # 1 + """ + Our node doesn't have a route to the requested destination anymore. + """ + GOT_NAK: Routing._Error.ValueType # 2 + """ + We received a nak while trying to forward on your behalf + """ + TIMEOUT: Routing._Error.ValueType # 3 + """ + Timeout waiting for response + """ + NO_INTERFACE: Routing._Error.ValueType # 4 + """ + No suitable interface could be found for delivering this packet + """ + MAX_RETRANSMIT: Routing._Error.ValueType # 5 + """ + We reached the max retransmission count (typically for naive flood routing) + """ + NO_CHANNEL: Routing._Error.ValueType # 6 + """ + No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) + """ + TOO_LARGE: Routing._Error.ValueType # 7 + """ + The packet was too big for sending (exceeds interface MTU after encoding) + """ + NO_RESPONSE: Routing._Error.ValueType # 8 + """ + The request had the WANT_RESPONSE bit set, the request reached the destination node, but no service on that node wants to send a response + (possibly due to bad channel permissions) + """ + DUTY_CYCLE_LIMIT: Routing._Error.ValueType # 9 + """ + Cannot send currently because duty cycle regulations will be violated. + """ + BAD_REQUEST: Routing._Error.ValueType # 32 + """ + The application layer service on the remote node received your request, but considered your request somehow invalid + """ + NOT_AUTHORIZED: Routing._Error.ValueType # 33 + """ + The application layer service on the remote node received your request, but considered your request not authorized + (i.e you did not send the request on the required bound channel) + """ + PKI_FAILED: Routing._Error.ValueType # 34 + """ + The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) + """ + PKI_UNKNOWN_PUBKEY: Routing._Error.ValueType # 35 + """ + The receiving node does not have a Public Key to decode with + """ + ADMIN_BAD_SESSION_KEY: Routing._Error.ValueType # 36 + """ + Admin packet otherwise checks out, but uses a bogus or expired session key + """ + ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing._Error.ValueType # 37 + """ + Admin packet sent using PKC, but not from a public key on the admin key list + """ + RATE_LIMIT_EXCEEDED: Routing._Error.ValueType # 38 + """ + Airtime fairness rate limit exceeded for a packet. + This is typically enforced per portnum and is used to prevent a single node from monopolizing airtime. + """ + PKI_SEND_FAIL_PUBLIC_KEY: Routing._Error.ValueType # 39 + """ + PKI encryption failed, due to no public key for the remote node. + This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet. + """ + + class Error(_Error, metaclass=_ErrorEnumTypeWrapper): + """ + A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide + details on the type of failure). + """ + + NONE: Routing.Error.ValueType # 0 + """ + This message is not a failure + """ + NO_ROUTE: Routing.Error.ValueType # 1 + """ + Our node doesn't have a route to the requested destination anymore. + """ + GOT_NAK: Routing.Error.ValueType # 2 + """ + We received a nak while trying to forward on your behalf + """ + TIMEOUT: Routing.Error.ValueType # 3 + """ + Timeout waiting for response + """ + NO_INTERFACE: Routing.Error.ValueType # 4 + """ + No suitable interface could be found for delivering this packet + """ + MAX_RETRANSMIT: Routing.Error.ValueType # 5 + """ + We reached the max retransmission count (typically for naive flood routing) + """ + NO_CHANNEL: Routing.Error.ValueType # 6 + """ + No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) + """ + TOO_LARGE: Routing.Error.ValueType # 7 + """ + The packet was too big for sending (exceeds interface MTU after encoding) + """ + NO_RESPONSE: Routing.Error.ValueType # 8 + """ + The request had the WANT_RESPONSE bit set, the request reached the destination node, but no service on that node wants to send a response + (possibly due to bad channel permissions) + """ + DUTY_CYCLE_LIMIT: Routing.Error.ValueType # 9 + """ + Cannot send currently because duty cycle regulations will be violated. + """ + BAD_REQUEST: Routing.Error.ValueType # 32 + """ + The application layer service on the remote node received your request, but considered your request somehow invalid + """ + NOT_AUTHORIZED: Routing.Error.ValueType # 33 + """ + The application layer service on the remote node received your request, but considered your request not authorized + (i.e you did not send the request on the required bound channel) + """ + PKI_FAILED: Routing.Error.ValueType # 34 + """ + The client specified a PKI transport, but the node was unable to send the packet using PKI (and did not send the message at all) + """ + PKI_UNKNOWN_PUBKEY: Routing.Error.ValueType # 35 + """ + The receiving node does not have a Public Key to decode with + """ + ADMIN_BAD_SESSION_KEY: Routing.Error.ValueType # 36 + """ + Admin packet otherwise checks out, but uses a bogus or expired session key + """ + ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing.Error.ValueType # 37 + """ + Admin packet sent using PKC, but not from a public key on the admin key list + """ + RATE_LIMIT_EXCEEDED: Routing.Error.ValueType # 38 + """ + Airtime fairness rate limit exceeded for a packet. + This is typically enforced per portnum and is used to prevent a single node from monopolizing airtime. + """ + PKI_SEND_FAIL_PUBLIC_KEY: Routing.Error.ValueType # 39 + """ + PKI encryption failed, due to no public key for the remote node. + This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet. + """ + + 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 or nak was produced by the node that actually received the + packet named by Data.request_id, rather than by anyone holding the channel key. + + An explicit ack usually travels on the channel, and a channel frame is encrypted but not + authenticated, so any listener holding the PSK can forge one. When the acknowledged + packet was PKI encrypted the two endpoints already share a Curve25519 secret, so the + receiver proves receipt with a MAC rather than a signature: + + ack_proof = HMAC-SHA256(shared_key, + "ack" | LE32(from) | LE32(to) | LE32(request_id) | routing)[0..8) + + where shared_key is the SHA256(X25519(sender_private, receiver_public)) that PKI packet + encryption uses, and `routing` is this encoded Routing message without this field. + + Every input earns its place. 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, since an ack and a nak for one packet share every other input. 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, which includes the PKI_UNKNOWN_PUBKEY and + NO_CHANNEL naks, emitted precisely because the packet could not be decrypted. A receiver + that does not understand the field ignores it. It does not replace + Data.xeddsa_signature, which remains the only option for traffic with no pairwise key + and the only proof a third party can check. + """ + def __init__( + self, + *, + error_reason: Global___Routing.Error.ValueType = ..., + ack_proof: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["error_reason", b"error_reason", "variant", b"variant"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ack_proof", b"ack_proof", "error_reason", b"error_reason", "variant", b"variant"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_variant: _TypeAlias = _typing.Literal["error_reason"] # noqa: Y015 + _WhichOneofArgType_variant: _TypeAlias = _typing.Literal["variant", b"variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_variant) -> _WhichOneofReturnType_variant | None: ... + +Global___Routing: _TypeAlias = Routing # noqa: Y015 + +@_typing.final +class Data(_message.Message): + """ + The payload portion of a packet, this is the actual bytes that are sent + inside a radio packet (because from/to are broken out by the comms library) + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _Bitfield: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _BitfieldEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Data._Bitfield.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + BITFIELD_NONE: Data._Bitfield.ValueType # 0 + """No flags set""" + BITFIELD_OK_TO_MQTT: Data._Bitfield.ValueType # 1 + """The sender approves this packet being uploaded to MQTT""" + BITFIELD_WANT_RESPONSE: Data._Bitfield.ValueType # 2 + """ + The sender wants a response to this packet: a recipient answers in kind, so a + position request comes back as a position. Set on a broadcast it invites a reply + from every recipient. + """ + + class Bitfield(_Bitfield, metaclass=_BitfieldEnumTypeWrapper): + """ + Extra per-payload flags: a bitwise OR of Bitfield values. + Values match BITFIELD_* in the firmware's src/mesh/Router.h. + """ + + BITFIELD_NONE: Data.Bitfield.ValueType # 0 + """No flags set""" + BITFIELD_OK_TO_MQTT: Data.Bitfield.ValueType # 1 + """The sender approves this packet being uploaded to MQTT""" + BITFIELD_WANT_RESPONSE: Data.Bitfield.ValueType # 2 + """ + The sender wants a response to this packet: a recipient answers in kind, so a + position request comes back as a position. Set on a broadcast it invites a reply + from every recipient. + """ + + PORTNUM_FIELD_NUMBER: _builtins.int + PAYLOAD_FIELD_NUMBER: _builtins.int + REQUEST_ID_FIELD_NUMBER: _builtins.int + REPLY_ID_FIELD_NUMBER: _builtins.int + EMOJI_FIELD_NUMBER: _builtins.int + BITFIELD_FIELD_NUMBER: _builtins.int + XEDDSA_SIGNATURE_FIELD_NUMBER: _builtins.int + portnum: _portnums_pb2.PortNum.ValueType + """ + Which application this payload belongs to. A receiver dispatches on it, and a payload + whose port it does not know is passed on untouched. + """ + payload: _builtins.bytes + """ + The payload data + """ + request_id: _builtins.int + """ + The id of the packet this one answers, on a response or a routing ack. A sender + matches an ack or a nak against it, and cancels a retransmission with it. + """ + reply_id: _builtins.int + """ + If set, this message replies to the message with that id: threading a text message + for the people reading it, which store and forward preserves. Distinct from + request_id, which pairs a protocol response with the request it answers. + """ + emoji: _builtins.int + """ + Defaults to zero. If nonzero, then what is in the payload should be treated as an emoji like giving + a message a heart or poop emoji. + Wire encoding: uint32 (W4 fix, was fixed32) + """ + bitfield: _builtins.int + """ + Bitwise OR of Bitfield values. + """ + xeddsa_signature: _builtins.bytes + """ + XEdDSA signature for the payload + """ + def __init__( + self, + *, + portnum: _portnums_pb2.PortNum.ValueType = ..., + payload: _builtins.bytes = ..., + request_id: _builtins.int = ..., + reply_id: _builtins.int = ..., + emoji: _builtins.int = ..., + bitfield: _builtins.int | None = ..., + xeddsa_signature: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_bitfield", b"_bitfield", "bitfield", b"bitfield"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_bitfield", b"_bitfield", "bitfield", b"bitfield", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "xeddsa_signature", b"xeddsa_signature"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__bitfield: _TypeAlias = _typing.Literal["bitfield"] # noqa: Y015 + _WhichOneofArgType__bitfield: _TypeAlias = _typing.Literal["_bitfield", b"_bitfield"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType__bitfield) -> _WhichOneofReturnType__bitfield | None: ... + +Global___Data: _TypeAlias = Data # noqa: Y015 + +@_typing.final +class KeyVerification(_message.Message): + """ + The actual over-the-mesh message doing KeyVerification + """ + + DESCRIPTOR: _descriptor.Descriptor + + NONCE_FIELD_NUMBER: _builtins.int + HASH1_FIELD_NUMBER: _builtins.int + HASH2_FIELD_NUMBER: _builtins.int + nonce: _builtins.int + """ + Random value selected by the requesting node + """ + hash1: _builtins.bytes + """ + The final authoritative hash, only to be sent by NodeA at the end of the handshake + """ + hash2: _builtins.bytes + """ + The intermediary hash (actually derived from hash1), + sent from NodeB to NodeA in response to the initial message. + """ + def __init__( + self, + *, + nonce: _builtins.int = ..., + hash1: _builtins.bytes = ..., + hash2: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["hash1", b"hash1", "hash2", b"hash2", "nonce", b"nonce"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___KeyVerification: _TypeAlias = KeyVerification # noqa: Y015 + +@_typing.final +class HeaderOptions(_message.Message): + """ + The immutable options block of the v3 on-air header. + + The header is split by mutability rather than by meaning: a fixed core that relays + rewrite at known offsets, this block which no relay may touch, and an append-only + path at the frame tail. A relay never decodes this message - it copies the bytes + verbatim - so it cannot strip a field it does not understand. That is the property + a schema-driven format without tags cannot offer, and it is why the header stays + protobuf. + + The whole encoded block is covered by the AEAD AAD and by the XEdDSA signature, so + an attacker cannot add, drop or reorder fields without failing the tag even though + every relay on the route forwards them unverified. + + Field numbering is load-bearing: + 1-15 one-byte protobuf key. Hop-by-hop. A relay MAY read these; on an unknown + tag it forwards verbatim and acts on nothing. + 16+ two-byte key. End-to-end. Relays never look. + + Never decode and re-encode this message in transit. nanopb drops unknown fields on + decode, so a re-encode silently strips exactly the forward compatibility this + design exists to provide. + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _HopFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _HopFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[HeaderOptions._HopFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + HOP_NONE: HeaderOptions._HopFlags.ValueType # 0 + """Nothing set""" + HOP_NO_LEARN: HeaderOptions._HopFlags.ValueType # 1 + """ + Do not learn a route from this frame. Relays and the destination must not update + next_hop caches from `relay` or the path tail. For unicast that is expected to + move - trackers, ATAK - where a learned route goes stale before it is used. + Steering a reply from the tail is still permitted. + """ + HOP_STORE: HeaderOptions._HopFlags.ValueType # 2 + """ + Retain this frame in store and forward. Set on user-facing traffic: text, + waypoints, alerts. A server stores a flagged frame unconditionally and an + unflagged one only as evictable filler. Never set on position or telemetry. + """ + HOP_ANYCAST: HeaderOptions._HopFlags.ValueType # 4 + """ + `to` is a group identity rather than a node. Any node holding the group's private + key may deliver and acknowledge it. A relay keys its next-hop and dedup tables on + (this bit, to) and otherwise treats the frame as ordinary unicast. Meaningless on + a broadcast, where a relay ignores it. + """ + + class HopFlags(_HopFlags, metaclass=_HopFlagsEnumTypeWrapper): + """ + Hop-by-hop booleans: a bitwise OR of HopFlags values. + + Set by the originator and covered by the AAD, so a relay may read them but cannot + forge or strip them. A relay that does not know a bit forwards the block verbatim + and acts on nothing, which is the rule for every field in this range. + """ + + HOP_NONE: HeaderOptions.HopFlags.ValueType # 0 + """Nothing set""" + HOP_NO_LEARN: HeaderOptions.HopFlags.ValueType # 1 + """ + Do not learn a route from this frame. Relays and the destination must not update + next_hop caches from `relay` or the path tail. For unicast that is expected to + move - trackers, ATAK - where a learned route goes stale before it is used. + Steering a reply from the tail is still permitted. + """ + HOP_STORE: HeaderOptions.HopFlags.ValueType # 2 + """ + Retain this frame in store and forward. Set on user-facing traffic: text, + waypoints, alerts. A server stores a flagged frame unconditionally and an + unflagged one only as evictable filler. Never set on position or telemetry. + """ + HOP_ANYCAST: HeaderOptions.HopFlags.ValueType # 4 + """ + `to` is a group identity rather than a node. Any node holding the group's private + key may deliver and acknowledge it. A relay keys its next-hop and dedup tables on + (this bit, to) and otherwise treats the frame as ordinary unicast. Meaningless on + a broadcast, where a relay ignores it. + """ + + FRAGMENT_FIELD_NUMBER: _builtins.int + HOP_FLAGS_FIELD_NUMBER: _builtins.int + SCOPE_CODE_FIELD_NUMBER: _builtins.int + fragment: _builtins.int + """ + Fragmentation state, packed as msg_id(8) | index(3) | total(3). + + index is 0..7 and total holds the fragment count minus one, so a message is at + most eight fragments, about 1.8 kB. Three bits rather than four because the + fourth buys nothing: fourteen bits is a two-byte varint where fifteen is a + three-byte one, and a sixteen-fragment message arrives whole 19% of the time at + 90% per-packet delivery, against 43% for eight. The limit that matters is + delivery probability, and it binds long before the field width does. + + total travels on every fragment rather than only the last: a receiver that gets + fragment 3 first can size its buffer immediately and knows what is missing, which + an end-marker scheme cannot express when the lost fragment is the final one. + + Reassembly is endpoint-only; relays treat fragments as independent packets and + hold no state. Each fragment is an ordinary packet, so want_ack and ReliableRouter + already provide per-fragment retransmission - there is no separate ARQ. + msg_id is a per-sender counter and wraps after 256 fragmented messages. + """ + hop_flags: _builtins.int + """ + Bitwise OR of HopFlags values. + """ + scope_code: _builtins.int + """ + Region membership code, 16 bits, hop-by-hop. Optional: a frame without one is an + ordinary frame. + + scope_code = trunc16(HMAC-SHA256(scope_key, chan || from || id)) + scope_key = SHA256("%" + region_name)[0:16] + + It binds to this frame's own `from` and `id`, so a code cannot be lifted onto + another frame, and a relay reads it without touching the ciphertext. 0 is never a + valid code: an originator that computes 0 sends 1. + + **Declarative only.** The key comes from a region name people share, so the code + states which region a frame claims to belong to and proves nothing whatsoever. + Nothing may authorise, authenticate or grant anything on it; a relay uses it to keep + foreign traffic off its own infrastructure and for no other purpose. A node that + wants proof of anything uses the AEAD tag or an XEdDSA signature. + + Region traffic still carries a channel (BCAST) or a destination (UCAST): this + filters, it does not address. + """ + def __init__( + self, + *, + fragment: _builtins.int = ..., + hop_flags: _builtins.int = ..., + scope_code: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["fragment", b"fragment", "hop_flags", b"hop_flags", "scope_code", b"scope_code"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___HeaderOptions: _TypeAlias = HeaderOptions # noqa: Y015 + +@_typing.final +class RemoteShell(_message.Message): + """ + The actual over-the-mesh message doing RemoteShell + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _OpCode: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _OpCodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[RemoteShell._OpCode.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + OP_UNSET: RemoteShell._OpCode.ValueType # 0 + OPEN: RemoteShell._OpCode.ValueType # 1 + """Client -> server""" + INPUT: RemoteShell._OpCode.ValueType # 2 + RESIZE: RemoteShell._OpCode.ValueType # 3 + CLOSE: RemoteShell._OpCode.ValueType # 4 + PING: RemoteShell._OpCode.ValueType # 5 + ACK: RemoteShell._OpCode.ValueType # 6 + OPEN_OK: RemoteShell._OpCode.ValueType # 64 + """Server -> client""" + OUTPUT: RemoteShell._OpCode.ValueType # 65 + CLOSED: RemoteShell._OpCode.ValueType # 66 + ERROR: RemoteShell._OpCode.ValueType # 67 + PONG: RemoteShell._OpCode.ValueType # 68 + + class OpCode(_OpCode, metaclass=_OpCodeEnumTypeWrapper): + """ + Frame op code for PTY session control and stream transport. + + Values 1-63 are client->server requests. + Values 64-127 are server->client responses/events. + """ + + OP_UNSET: RemoteShell.OpCode.ValueType # 0 + OPEN: RemoteShell.OpCode.ValueType # 1 + """Client -> server""" + INPUT: RemoteShell.OpCode.ValueType # 2 + RESIZE: RemoteShell.OpCode.ValueType # 3 + CLOSE: RemoteShell.OpCode.ValueType # 4 + PING: RemoteShell.OpCode.ValueType # 5 + ACK: RemoteShell.OpCode.ValueType # 6 + OPEN_OK: RemoteShell.OpCode.ValueType # 64 + """Server -> client""" + OUTPUT: RemoteShell.OpCode.ValueType # 65 + CLOSED: RemoteShell.OpCode.ValueType # 66 + ERROR: RemoteShell.OpCode.ValueType # 67 + PONG: RemoteShell.OpCode.ValueType # 68 + + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[RemoteShell._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + FLAG_NONE: RemoteShell._Flags.ValueType # 0 + """No flags set""" + FLAG_GRANT: RemoteShell._Flags.ValueType # 1 + """Handing the turn to the peer; it may transmit now""" + FLAG_MORE: RemoteShell._Flags.ValueType # 2 + """Yielded under a budget but still has data queued; grant back promptly""" + FLAG_RTS: RemoteShell._Flags.ValueType # 4 + """Has output but no turn; requesting one""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Half-duplex turn-taking control: a bitwise OR of Flags values. + Values match TURN_FLAG_* in the firmware's DMShell module. + """ + + FLAG_NONE: RemoteShell.Flags.ValueType # 0 + """No flags set""" + FLAG_GRANT: RemoteShell.Flags.ValueType # 1 + """Handing the turn to the peer; it may transmit now""" + FLAG_MORE: RemoteShell.Flags.ValueType # 2 + """Yielded under a budget but still has data queued; grant back promptly""" + FLAG_RTS: RemoteShell.Flags.ValueType # 4 + """Has output but no turn; requesting one""" + + OP_FIELD_NUMBER: _builtins.int + SESSION_ID_FIELD_NUMBER: _builtins.int + SEQ_FIELD_NUMBER: _builtins.int + ACK_SEQ_FIELD_NUMBER: _builtins.int + PAYLOAD_FIELD_NUMBER: _builtins.int + COLS_FIELD_NUMBER: _builtins.int + ROWS_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int + LAST_TX_SEQ_FIELD_NUMBER: _builtins.int + LAST_RX_SEQ_FIELD_NUMBER: _builtins.int + op: Global___RemoteShell.OpCode.ValueType + """ + Structured frame operation. + """ + session_id: _builtins.int + """ + Logical PTY session identifier, a random non-zero 31-bit value chosen by + whichever side opens the session. fixed32 because it is random: a varint + would average 5 bytes, and this field is on every frame of an interactive + session. + """ + seq: _builtins.int + """ + Monotonic per-session sequence number for this frame. + Zero on unsequenced control frames (ACK, turn grant, RTS), which costs nothing: + proto3 does not encode a zero scalar, so an unsequenced frame carries no seq field. + A receiver ignores seq on those ops rather than trusting it. + """ + ack_seq: _builtins.int + """ + Cumulative ack: the highest contiguous `seq` received from the peer. + """ + payload: _builtins.bytes + """ + Opaque bytes payload for INPUT/OUTPUT/ERROR and other frame bodies. + """ + cols: _builtins.int + """ + Terminal size columns used for OPEN/RESIZE signaling. + """ + rows: _builtins.int + """ + Terminal size rows used for OPEN/RESIZE signaling. + """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ + last_tx_seq: _builtins.int + """ + Highest `seq` the sender has transmitted so far. Lets the receiver notice + frames lost off the tail of the stream, which a cumulative ack alone cannot + reveal because it never saw them. + """ + last_rx_seq: _builtins.int + """ + Selective resend request: the peer should retransmit from last_rx_seq + 1. + Zero means no resend is being requested. Distinct from ack_seq, which + reports progress; this asks for repair, and takes precedence when set. + """ + def __init__( + self, + *, + op: Global___RemoteShell.OpCode.ValueType = ..., + session_id: _builtins.int = ..., + seq: _builtins.int = ..., + ack_seq: _builtins.int = ..., + payload: _builtins.bytes = ..., + cols: _builtins.int = ..., + rows: _builtins.int = ..., + flags: _builtins.int = ..., + last_tx_seq: _builtins.int = ..., + last_rx_seq: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ack_seq", b"ack_seq", "cols", b"cols", "flags", b"flags", "last_rx_seq", b"last_rx_seq", "last_tx_seq", b"last_tx_seq", "op", b"op", "payload", b"payload", "rows", b"rows", "seq", b"seq", "session_id", b"session_id"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RemoteShell: _TypeAlias = RemoteShell # noqa: Y015 + +@_typing.final +class BoundingBox(_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: _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: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___BoundingBox: _TypeAlias = BoundingBox # noqa: Y015 + +@_typing.final +class Waypoint(_message.Message): + """ + Waypoint message, used to share arbitrary locations across the mesh + """ + + DESCRIPTOR: _descriptor.Descriptor + + class _NotifyFlags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _NotifyFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Waypoint._NotifyFlags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + NOTIFY_NONE: Waypoint._NotifyFlags.ValueType # 0 + """No notifications""" + NOTIFY_ON_ENTER: Waypoint._NotifyFlags.ValueType # 1 + """Raise a notification when a tracked node enters the geofence""" + NOTIFY_ON_EXIT: Waypoint._NotifyFlags.ValueType # 2 + """Raise a notification when a tracked node exits the geofence""" + NOTIFY_FAVORITES_ONLY: Waypoint._NotifyFlags.ValueType # 4 + """ + Only notify for nodes marked as favorites on the receiving device. Applies to + both ON_ENTER and ON_EXIT. Favorite status resolves locally per receiver, so + the same waypoint alerts each node only for its own favorites. + """ + + class NotifyFlags(_NotifyFlags, metaclass=_NotifyFlagsEnumTypeWrapper): + """ + Geofence notification behaviour: a bitwise OR of NotifyFlags values. + The geofence is the circular radius and/or the bounding box. + """ + + NOTIFY_NONE: Waypoint.NotifyFlags.ValueType # 0 + """No notifications""" + NOTIFY_ON_ENTER: Waypoint.NotifyFlags.ValueType # 1 + """Raise a notification when a tracked node enters the geofence""" + NOTIFY_ON_EXIT: Waypoint.NotifyFlags.ValueType # 2 + """Raise a notification when a tracked node exits the geofence""" + NOTIFY_FAVORITES_ONLY: Waypoint.NotifyFlags.ValueType # 4 + """ + Only notify for nodes marked as favorites on the receiving device. Applies to + both ON_ENTER and ON_EXIT. Favorite status resolves locally per receiver, so + the same waypoint alerts each node only for its own favorites. + """ + + ID_FIELD_NUMBER: _builtins.int + LATITUDE_I_FIELD_NUMBER: _builtins.int + LONGITUDE_I_FIELD_NUMBER: _builtins.int + EXPIRE_FIELD_NUMBER: _builtins.int + LOCKED_TO_FIELD_NUMBER: _builtins.int + NAME_FIELD_NUMBER: _builtins.int + DESCRIPTION_FIELD_NUMBER: _builtins.int + ICON_FIELD_NUMBER: _builtins.int + GEOFENCE_RADIUS_FIELD_NUMBER: _builtins.int + BOUNDING_BOX_FIELD_NUMBER: _builtins.int + NOTIFY_FLAGS_FIELD_NUMBER: _builtins.int + id: _builtins.int + """ + Id of the waypoint + """ + latitude_i: _builtins.int + """ + latitude_i + """ + longitude_i: _builtins.int + """ + longitude_i + """ + expire: _builtins.int + """ + Time the waypoint is to expire (epoch) + """ + locked_to: _builtins.int + """ + If greater than zero, treat the value as a nodenum only allowing them to update the waypoint. + If zero, the waypoint is open to be edited by any member of the mesh. + """ + name: _builtins.str + """ + Name of the waypoint, limited to 29 bytes + """ + description: _builtins.str + """ + Description of the waypoint, limited to 99 bytes + """ + icon: _builtins.int + """ + Designator icon for the waypoint in the form of a unicode emoji + Wire encoding: uint32 (W4 fix, was fixed32) + """ + 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_flags: _builtins.int + """ + Bitwise OR of NotifyFlags values. + """ + @_builtins.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, + *, + id: _builtins.int = ..., + latitude_i: _builtins.int | None = ..., + longitude_i: _builtins.int | None = ..., + expire: _builtins.int = ..., + locked_to: _builtins.int = ..., + name: _builtins.str = ..., + description: _builtins.str = ..., + icon: _builtins.int = ..., + geofence_radius: _builtins.int = ..., + bounding_box: Global___BoundingBox | None = ..., + notify_flags: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _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"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _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_flags", b"notify_flags"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__bounding_box: _TypeAlias = _typing.Literal["bounding_box"] # noqa: Y015 + _WhichOneofArgType__bounding_box: _TypeAlias = _typing.Literal["_bounding_box", b"_bounding_box"] # noqa: Y015 + _WhichOneofReturnType__latitude_i: _TypeAlias = _typing.Literal["latitude_i"] # noqa: Y015 + _WhichOneofArgType__latitude_i: _TypeAlias = _typing.Literal["_latitude_i", b"_latitude_i"] # noqa: Y015 + _WhichOneofReturnType__longitude_i: _TypeAlias = _typing.Literal["longitude_i"] # noqa: Y015 + _WhichOneofArgType__longitude_i: _TypeAlias = _typing.Literal["_longitude_i", b"_longitude_i"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__bounding_box) -> _WhichOneofReturnType__bounding_box | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__latitude_i) -> _WhichOneofReturnType__latitude_i | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__longitude_i) -> _WhichOneofReturnType__longitude_i | None: ... + +Global___Waypoint: _TypeAlias = Waypoint # noqa: Y015 + +@_typing.final +class StatusMessage(_message.Message): + """ + Message for node status + """ + + DESCRIPTOR: _descriptor.Descriptor + + STATUS_FIELD_NUMBER: _builtins.int + status: _builtins.str + """ + The status text + """ + def __init__( + self, + *, + status: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["status", b"status"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___StatusMessage: _TypeAlias = StatusMessage # noqa: Y015 + +@_typing.final +class MqttClientProxyMessage(_message.Message): + """ + This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server + """ + + DESCRIPTOR: _descriptor.Descriptor + + TOPIC_FIELD_NUMBER: _builtins.int + DATA_FIELD_NUMBER: _builtins.int + TEXT_FIELD_NUMBER: _builtins.int + RETAINED_FIELD_NUMBER: _builtins.int + topic: _builtins.str + """ + The MQTT topic this message will be sent /received on + """ + data: _builtins.bytes + """ + Bytes + """ + text: _builtins.str + """ + Text + """ + retained: _builtins.bool + """ + Whether the message should be retained (or not) + """ + def __init__( + self, + *, + topic: _builtins.str = ..., + data: _builtins.bytes = ..., + text: _builtins.str = ..., + retained: _builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["data", b"data", "payload_variant", b"payload_variant", "text", b"text"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["data", b"data", "payload_variant", b"payload_variant", "retained", b"retained", "text", b"text", "topic", b"topic"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_payload_variant: _TypeAlias = _typing.Literal["data", "text"] # noqa: Y015 + _WhichOneofArgType_payload_variant: _TypeAlias = _typing.Literal["payload_variant", b"payload_variant"] # noqa: Y015 + def WhichOneof(self, oneof_group: _WhichOneofArgType_payload_variant) -> _WhichOneofReturnType_payload_variant | None: ... + +Global___MqttClientProxyMessage: _TypeAlias = MqttClientProxyMessage # noqa: Y015 + +@_typing.final +class InjectedFrame(_message.Message): + """ + A frame handed to a node as if it had arrived off the radio, used by the simulator + and by frame injection. Named for what it does: nothing here compresses anything. + """ + + DESCRIPTOR: _descriptor.Descriptor + + PORTNUM_FIELD_NUMBER: _builtins.int + DATA_FIELD_NUMBER: _builtins.int + portnum: _portnums_pb2.PortNum.ValueType + """ + The port the payload belongs to, or UNKNOWN_APP when data is verbatim ciphertext + to be decrypted as if it came off the air. + """ + data: _builtins.bytes + """ + The payload for portnum, or the ciphertext when portnum is UNKNOWN_APP. + """ + def __init__( + self, + *, + portnum: _portnums_pb2.PortNum.ValueType = ..., + data: _builtins.bytes = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["data", b"data", "portnum", b"portnum"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___InjectedFrame: _TypeAlias = InjectedFrame # noqa: Y015 + +@_typing.final +class NeighborInfo(_message.Message): + """ + Full info on edges for a single node + """ + + DESCRIPTOR: _descriptor.Descriptor + + NODE_ID_FIELD_NUMBER: _builtins.int + LAST_SENT_BY_ID_FIELD_NUMBER: _builtins.int + NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + NEIGHBOR_IDS_FIELD_NUMBER: _builtins.int + NEIGHBOR_SNR_FIELD_NUMBER: _builtins.int + node_id: _builtins.int + """ + The node ID of the node sending info on its neighbors + """ + last_sent_by_id: _builtins.int + """ + Field to pass neighbor info for the next sending cycle + """ + node_broadcast_interval_secs: _builtins.int + """ + Broadcast interval of the represented node (in seconds) + """ + @_builtins.property + def neighbor_ids(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + The out edges from this node, as two parallel columns: edge N is + (neighbor_ids[N], neighbor_snr[N]), and the two columns MUST stay the same + length. + + Columns rather than one submessage per edge: a submessage costs a tag and a + length byte per neighbour plus a tag on each field inside it, where the + columns pay the field framing once and nothing per edge. That is around a + third of the message at ten neighbours, and roughly twice as many edges in + one frame. + + A node's view of when it last heard a neighbour, and that neighbour's own + broadcast interval, belong to that node's table rather than to a message + about the edge, so neither is a column here. + """ + + @_builtins.property + def neighbor_snr(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + """ + SNR of the last message heard from each neighbour, in dB scaled by 2. + + Half-dB steps because this is the one SNR field that goes on the air, once per + neighbour: the whole practical range of -32 to +31.5 dB is a single zigzag byte, + where the radio's own quarter-dB quantum needs two below -16 dB - exactly the + weak links a neighbour table is about. Rounding a quarter-dB reading to halves + loses nothing a link decision uses. + """ + + def __init__( + self, + *, + node_id: _builtins.int = ..., + last_sent_by_id: _builtins.int = ..., + node_broadcast_interval_secs: _builtins.int = ..., + neighbor_ids: _abc.Iterable[_builtins.int] | None = ..., + neighbor_snr: _abc.Iterable[_builtins.int] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["last_sent_by_id", b"last_sent_by_id", "neighbor_ids", b"neighbor_ids", "neighbor_snr", b"neighbor_snr", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___NeighborInfo: _TypeAlias = NeighborInfo # noqa: Y015 diff --git a/meshtastic/protobuf/xmodem_pb2.py b/meshtastic/protobuf/xmodem_pb2.py index 772b3f4a6..2f93bdfe7 100644 --- a/meshtastic/protobuf/xmodem_pb2.py +++ b/meshtastic/protobuf/xmodem_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: meshtastic/protobuf/xmodem.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -20,14 +21,14 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.xmodem_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _XMODEM.fields_by_name['seq']._options = None - _XMODEM.fields_by_name['seq']._serialized_options = b'\222?\0028\020' - _XMODEM.fields_by_name['crc16']._options = None - _XMODEM.fields_by_name['crc16']._serialized_options = b'\222?\0028\020' - _XMODEM.fields_by_name['buffer']._options = None - _XMODEM.fields_by_name['buffer']._serialized_options = b'\222?\003\010\200\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_XMODEM'].fields_by_name['seq']._options = None + _globals['_XMODEM'].fields_by_name['seq']._serialized_options = b'\222?\0028\020' + _globals['_XMODEM'].fields_by_name['crc16']._options = None + _globals['_XMODEM'].fields_by_name['crc16']._serialized_options = b'\222?\0028\020' + _globals['_XMODEM'].fields_by_name['buffer']._options = None + _globals['_XMODEM'].fields_by_name['buffer']._serialized_options = b'\222?\003\010\200\001' _globals['_XMODEM']._serialized_start=92 _globals['_XMODEM']._serialized_end=305 _globals['_XMODEM_CONTROL']._serialized_start=222 diff --git a/meshtastic/protobuf/xmodem_pb2.pyi b/meshtastic/protobuf/xmodem_pb2.pyi index d362ad0fa..f8b76e372 100644 --- a/meshtastic/protobuf/xmodem_pb2.pyi +++ b/meshtastic/protobuf/xmodem_pb2.pyi @@ -3,65 +3,103 @@ isort:skip_file """ -import builtins -import google.protobuf.descriptor -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +import builtins as _builtins import sys -import typing +import typing as _typing -if sys.version_info >= (3, 10): - import typing as typing_extensions +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never else: - import typing_extensions + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +DESCRIPTOR: _descriptor.FileDescriptor -@typing.final -class XModem(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor +@_typing.final +class XModem(_message.Message): + """ + XModem file transfer protocol message for firmware/file transfers over the mesh + """ + + DESCRIPTOR: _descriptor.Descriptor class _Control: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 - class _ControlEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[XModem._Control.ValueType], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + class _ControlEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[XModem._Control.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor NUL: XModem._Control.ValueType # 0 + """Null / padding byte""" SOH: XModem._Control.ValueType # 1 + """Start of Header (128-byte data block)""" STX: XModem._Control.ValueType # 2 + """ + Start of Text: a 1024-byte block in XMODEM-1K. Handled as SOH, and limited to + the same 128-byte buffer. + """ EOT: XModem._Control.ValueType # 4 + """End of Transmission""" ACK: XModem._Control.ValueType # 6 + """Acknowledge""" NAK: XModem._Control.ValueType # 21 + """Negative Acknowledge""" CAN: XModem._Control.ValueType # 24 + """Cancel transfer""" CTRLZ: XModem._Control.ValueType # 26 + """Ctrl+Z / EOF filler""" + + class Control(_Control, metaclass=_ControlEnumTypeWrapper): + """ + XModem control byte values per the XMODEM protocol specification + """ - class Control(_Control, metaclass=_ControlEnumTypeWrapper): ... NUL: XModem.Control.ValueType # 0 + """Null / padding byte""" SOH: XModem.Control.ValueType # 1 + """Start of Header (128-byte data block)""" STX: XModem.Control.ValueType # 2 + """ + Start of Text: a 1024-byte block in XMODEM-1K. Handled as SOH, and limited to + the same 128-byte buffer. + """ EOT: XModem.Control.ValueType # 4 + """End of Transmission""" ACK: XModem.Control.ValueType # 6 + """Acknowledge""" NAK: XModem.Control.ValueType # 21 + """Negative Acknowledge""" CAN: XModem.Control.ValueType # 24 + """Cancel transfer""" CTRLZ: XModem.Control.ValueType # 26 + """Ctrl+Z / EOF filler""" - CONTROL_FIELD_NUMBER: builtins.int - SEQ_FIELD_NUMBER: builtins.int - CRC16_FIELD_NUMBER: builtins.int - BUFFER_FIELD_NUMBER: builtins.int - control: global___XModem.Control.ValueType - seq: builtins.int - crc16: builtins.int - buffer: builtins.bytes + CONTROL_FIELD_NUMBER: _builtins.int + SEQ_FIELD_NUMBER: _builtins.int + CRC16_FIELD_NUMBER: _builtins.int + BUFFER_FIELD_NUMBER: _builtins.int + control: Global___XModem.Control.ValueType + """The XModem control byte for this packet""" + seq: _builtins.int + """Sequence number of this data block""" + crc16: _builtins.int + """CRC-16 checksum of the data block""" + buffer: _builtins.bytes + """The data block payload""" def __init__( self, *, - control: global___XModem.Control.ValueType = ..., - seq: builtins.int = ..., - crc16: builtins.int = ..., - buffer: builtins.bytes = ..., + control: Global___XModem.Control.ValueType = ..., + seq: _builtins.int = ..., + crc16: _builtins.int = ..., + buffer: _builtins.bytes = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["buffer", b"buffer", "control", b"control", "crc16", b"crc16", "seq", b"seq"]) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["buffer", b"buffer", "control", b"control", "crc16", b"crc16", "seq", b"seq"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... -global___XModem = XModem +Global___XModem: _TypeAlias = XModem # noqa: Y015 diff --git a/meshtastic/tests/conftest.py b/meshtastic/tests/conftest.py index c863888a7..adbe7457e 100644 --- a/meshtastic/tests/conftest.py +++ b/meshtastic/tests/conftest.py @@ -110,8 +110,7 @@ def iface_with_nodes(): "id": "!9388f81c", "longName": "Unknown f81c", "shortName": "?1C", - "macaddr": "RBeTiPgc", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, "position": {}, "lastHeard": 1640204888, @@ -125,8 +124,7 @@ def iface_with_nodes(): "id": "!9388f81c", "longName": "Unknown f81c", "shortName": "?1C", - "macaddr": "RBeTiPgc", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, "position": {"time": 1640206266}, "lastHeard": 1640206266, diff --git a/meshtastic/tests/firmware_harness.py b/meshtastic/tests/firmware_harness.py index 6d224d284..ab3132eb9 100644 --- a/meshtastic/tests/firmware_harness.py +++ b/meshtastic/tests/firmware_harness.py @@ -21,7 +21,8 @@ from pubsub import pub # type: ignore[import-untyped] -from meshtastic import BROADCAST_NUM, mesh_pb2, portnums_pb2 +from meshtastic import BROADCAST_NUM, api_pb2, packet_pb2, portnums_pb2, wire_pb2 +from meshtastic.mesh_interface import DATA_PAYLOAD_MAX from meshtastic.tcp_interface import TCPInterface logger = logging.getLogger(__name__) @@ -29,7 +30,7 @@ HW_ID_OFFSET = 16 DEFAULT_BASE_PORT = 4404 DEFAULT_RSSI = -50 -DEFAULT_SNR = 10.0 +DEFAULT_SNR = 20 # 10 dB, in the half-dB steps MeshPacket.rx_snr carries BOOT_TIMEOUT = 30 CONNECT_TIMEOUT = 30 @@ -222,11 +223,10 @@ def _trigger_convergence(self) -> None: iface = node.iface if iface is None: continue - user = mesh_pb2.User() - user.id = f"!{node.node_num:08x}" + user = wire_pb2.User() user.long_name = f"Node {node.node_id}" user.short_name = f"{node.node_id:04d}"[:4] - user.hw_model = mesh_pb2.HardwareModel.PORTDUINO + user.hw_model = 0x0025 # PORTDUINO in the hardware registry try: iface.sendData( user, @@ -303,7 +303,7 @@ def _on_sim_packet(self, interface, packet) -> None: if hasattr(data, "SerializeToString"): data = data.SerializeToString() - if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN: + if len(data) > DATA_PAYLOAD_MAX: logger.warning("Simulator payload too big (%d bytes), dropping", len(data)) return @@ -315,7 +315,7 @@ def _on_sim_packet(self, interface, packet) -> None: continue mesh_packet.rx_rssi = DEFAULT_RSSI mesh_packet.rx_snr = DEFAULT_SNR - to_radio = mesh_pb2.ToRadio() + to_radio = api_pb2.ToRadio() to_radio.packet.CopyFrom(mesh_packet) try: rx_iface._sendToRadio(to_radio) @@ -330,28 +330,19 @@ def __exit__(self, *exc): self.stop() -def _build_mesh_packet(packet: dict, data: bytes) -> mesh_pb2.MeshPacket: +def _build_mesh_packet(packet: dict, data: bytes) -> packet_pb2.MeshPacket: """Reconstruct a MeshPacket for SIMULATOR_APP injection.""" - mp = mesh_pb2.MeshPacket() + raw = packet["raw"] + mp = packet_pb2.MeshPacket() mp.decoded.payload = data mp.decoded.portnum = portnums_pb2.PortNum.SIMULATOR_APP - mp.to = packet.get("to", BROADCAST_NUM) - setattr(mp, "from", packet.get("from", 0)) - mp.id = packet.get("id", 0) - mp.want_ack = packet.get("wantAck", False) - mp.hop_limit = packet.get("hopLimit", 0) - mp.hop_start = packet.get("hopStart", 0) - mp.via_mqtt = packet.get("viaMQTT", False) - mp.relay_node = packet.get("relayNode", 0) - mp.next_hop = packet.get("nextHop", 0) - mp.channel = int(packet.get("channel", 0)) - - decoded = packet.get("decoded", {}) - if "requestId" in decoded: - mp.decoded.request_id = decoded["requestId"] - if "wantResponse" in decoded: - mp.decoded.want_response = decoded["wantResponse"] - if "bitfield" in decoded: - mp.decoded.bitfield = decoded["bitfield"] + mp.to = raw.to if raw.to else BROADCAST_NUM + setattr(mp, "from", getattr(raw, "from")) + for field in ("id", "flags", "hop_limit", "hop_start", "relay_node", "next_hop", "channel", + "channel_hash", "header_options", "path"): + setattr(mp, field, getattr(raw, field)) + mp.decoded.request_id = raw.decoded.request_id + if raw.decoded.HasField("bitfield"): + mp.decoded.bitfield = raw.decoded.bitfield return mp diff --git a/meshtastic/tests/fw_helpers.py b/meshtastic/tests/fw_helpers.py index 2bc29884b..6c97daf60 100644 --- a/meshtastic/tests/fw_helpers.py +++ b/meshtastic/tests/fw_helpers.py @@ -262,14 +262,6 @@ def texts(self) -> List[str]: if p.get("decoded", {}).get("portnum") == "TEXT_MESSAGE_APP" ] - @property - def traceroutes(self) -> List[dict]: - """Return TRACEROUTE_APP packets.""" - return [ - p for p in self.packets - if p.get("decoded", {}).get("portnum") == "TRACEROUTE_APP" - ] - @property def telemetries(self) -> List[dict]: """Return TELEMETRY_APP packets.""" @@ -315,11 +307,6 @@ def subscribe_texts(iface: TCPInterface) -> PacketCollector: return _subscribe_topic(iface, "meshtastic.receive.text") -def subscribe_traceroutes(iface: TCPInterface) -> PacketCollector: - """Subscribe to ``meshtastic.receive.traceroute`` filtered to *iface*.""" - return _subscribe_topic(iface, "meshtastic.receive.traceroute") - - def subscribe_telemetries(iface: TCPInterface) -> PacketCollector: """Subscribe to ``meshtastic.receive.telemetry`` filtered to *iface*.""" return _subscribe_topic(iface, "meshtastic.receive.telemetry") @@ -368,7 +355,6 @@ def unsubscribe_all(topic: str) -> None: "subscribe_positions", "subscribe_telemetries", "subscribe_texts", - "subscribe_traceroutes", "unsubscribe_all", "verify_state", ] diff --git a/meshtastic/tests/test_inject_nanopb_options.py b/meshtastic/tests/test_inject_nanopb_options.py index 1174a7a26..56bcf504d 100644 --- a/meshtastic/tests/test_inject_nanopb_options.py +++ b/meshtastic/tests/test_inject_nanopb_options.py @@ -19,13 +19,14 @@ from meshtastic.protobuf import ( atak_pb2, + common_pb2, config_pb2, field_metadata_pb2, interdevice_pb2, - mesh_pb2, mqtt_pb2, nanopb_pb2, - telemetry_pb2, + packet_pb2, + wire_pb2, ) # --------------------------------------------------------------------------- @@ -764,63 +765,60 @@ def _field_opts(descriptor, *path): @pytest.mark.unit def test_descriptor_user_long_name(): - """User.long_name has max_size = 40 from mesh.options.""" - opts = _field_opts(mesh_pb2.DESCRIPTOR.message_types_by_name["User"], "long_name") - assert opts.max_size == 40 + """User.long_name has max_size = 25 from wire.options.""" + opts = _field_opts(wire_pb2.DESCRIPTOR.message_types_by_name["User"], "long_name") + assert opts.max_size == 25 @pytest.mark.unit def test_descriptor_user_short_name(): - """User.short_name has max_size = 5 from mesh.options.""" - opts = _field_opts(mesh_pb2.DESCRIPTOR.message_types_by_name["User"], "short_name") + """User.short_name has max_size = 5 from wire.options.""" + opts = _field_opts(wire_pb2.DESCRIPTOR.message_types_by_name["User"], "short_name") assert opts.max_size == 5 @pytest.mark.unit -def test_descriptor_wildcard_macaddr(): - """Wildcard option from mesh.options applied to User.macaddr.""" - opts = _field_opts(mesh_pb2.DESCRIPTOR.message_types_by_name["User"], "macaddr") - assert opts.max_size == 6 - assert opts.fixed_length is True +def test_descriptor_wildcard_public_key(): + """Wildcard option from wire.options applied to User.public_key.""" + opts = _field_opts(wire_pb2.DESCRIPTOR.message_types_by_name["User"], "public_key") + assert opts.max_size == 32 @pytest.mark.unit def test_descriptor_meshpacket_hop_limit(): - """MeshPacket.hop_limit has int_size = IS_8 from mesh.options.""" - opts = _field_opts(mesh_pb2.DESCRIPTOR.message_types_by_name["MeshPacket"], "hop_limit") + """MeshPacket.hop_limit has int_size = IS_8 from packet.options.""" + opts = _field_opts(packet_pb2.DESCRIPTOR.message_types_by_name["MeshPacket"], "hop_limit") assert opts.int_size == nanopb_pb2.IS_8 @pytest.mark.unit -def test_descriptor_routediscovery_snr_towards(): - """RouteDiscovery.snr_towards has max_count = 8 and int_size = IS_8 from mesh.options.""" +def test_descriptor_neighborinfo_neighbor_snr(): + """NeighborInfo.neighbor_snr has max_count = 10 and int_size = IS_8 from wire.options.""" opts = _field_opts( - mesh_pb2.DESCRIPTOR.message_types_by_name["RouteDiscovery"], "snr_towards" + wire_pb2.DESCRIPTOR.message_types_by_name["NeighborInfo"], "neighbor_snr" ) - assert opts.max_count == 8 + assert opts.max_count == 10 assert opts.int_size == nanopb_pb2.IS_8 @pytest.mark.unit def test_descriptor_data_payload(): - """Data.payload has max_size = 233 from mesh.options.""" - opts = _field_opts(mesh_pb2.DESCRIPTOR.message_types_by_name["Data"], "payload") - assert opts.max_size == 233 + """Data.payload has max_size = 256 from wire.options.""" + opts = _field_opts(wire_pb2.DESCRIPTOR.message_types_by_name["Data"], "payload") + assert opts.max_size == 256 @pytest.mark.unit def test_descriptor_nested_deviceconfig_tzdef(): - """Config.DeviceConfig.tzdef — option on a field inside a nested message.""" - config = config_pb2.DESCRIPTOR.message_types_by_name["Config"] - opts = _field_opts(config, "DeviceConfig", "tzdef") + """DeviceConfig.tzdef — option on a field of a top-level config section.""" + opts = _field_opts(config_pb2.DESCRIPTOR.message_types_by_name["DeviceConfig"], "tzdef") assert opts.max_size == 65 @pytest.mark.unit def test_descriptor_nested_securityconfig_admin_key(): - """Config.SecurityConfig.admin_key — two options merged from two .options lines.""" - config = config_pb2.DESCRIPTOR.message_types_by_name["Config"] - opts = _field_opts(config, "SecurityConfig", "admin_key") + """SecurityConfig.admin_key — two options merged from two .options lines.""" + opts = _field_opts(config_pb2.DESCRIPTOR.message_types_by_name["SecurityConfig"], "admin_key") assert opts.max_size == 32 assert opts.max_count == 3 @@ -833,14 +831,6 @@ def test_descriptor_multilevel_nested_route_link_uid(): assert opts.max_size == 48 -@pytest.mark.unit -def test_descriptor_telemetry_environment_one_wire_temperature(): - """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.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.""" @@ -853,9 +843,8 @@ def test_descriptor_mqtt_service_envelope_pointer_fields(): 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") + device = config_pb2.DESCRIPTOR.message_types_by_name["DeviceConfig"] + opts = _field_opts(device, "tzdef") assert opts.max_size == 65 meta = device.fields_by_name["tzdef"].GetOptions().Extensions[ field_metadata_pb2.field_metadata @@ -867,9 +856,8 @@ def test_descriptor_deviceconfig_tzdef_metadata_preserved(): 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 + device = config_pb2.DESCRIPTOR.message_types_by_name["DeviceConfig"] + assert _field_opts(device, "buzzer_mode").int_size == nanopb_pb2.IS_8 meta = device.fields_by_name["buzzer_mode"].GetOptions().Extensions[ field_metadata_pb2.field_metadata ] @@ -898,8 +886,7 @@ def test_descriptor_interdevice_trailing_comment_fields(): 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"] + role = common_pb2.DESCRIPTOR.enum_types_by_name["Role"] meta = role.values_by_name["CLIENT"].GetOptions().Extensions[ field_metadata_pb2.enum_value_metadata ] diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index e0d65f60f..114216cc3 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -17,6 +17,7 @@ from meshtastic.__main__ import ( export_config, export_profile, + getPref, initParser, main, onConnection, @@ -28,9 +29,10 @@ _profile_from_yaml, ) from meshtastic import mt_config +from meshtastic.util import find_bit from ..protobuf.channel_pb2 import Channel # pylint: disable=E0611 -from ..protobuf.config_pb2 import Config # pylint: disable=E0611 +from ..protobuf.config_pb2 import ConfigPayload as Config # pylint: disable=E0611 from ..protobuf.clientonly_pb2 import DeviceProfile # pylint: disable=E0611 from ..protobuf.localonly_pb2 import LocalConfig, LocalModuleConfig # pylint: disable=E0611 @@ -1851,7 +1853,7 @@ def test_main_onReceive_with_text_replies_on_target_channel(caplog, capsys): "id": 334776977, "hop_limit": 3, "want_ack": True, - "rxSnr": 6.0, + "rxSnr": 6, "hopLimit": 3, "raw": "faked", "fromId": "!28b5465c", @@ -1868,7 +1870,7 @@ def test_main_onReceive_with_text_replies_on_target_channel(caplog, capsys): out, err = capsys.readouterr() assert re.search(r"Sending reply", out, re.MULTILINE) iface.sendText.assert_called_once_with( - "got msg 'faked' with rxSnr: 6.0 and hopLimit: 3", channelIndex=0 + "got msg 'faked' with rxSnr: 3.0 and hopLimit: 3", channelIndex=0 ) assert err == "" @@ -1885,7 +1887,7 @@ def test_main_onReceive_with_text_ignores_non_target_channel(caplog, capsys): "id": 334776977, "hop_limit": 3, "want_ack": True, - "rxSnr": 6.0, + "rxSnr": 6, "hopLimit": 3, "raw": "faked", "fromId": "!28b5465c", @@ -1920,7 +1922,7 @@ def test_main_onReceive_with_text_replies_on_explicit_matching_channel(caplog, c "id": 334776977, "hop_limit": 3, "want_ack": True, - "rxSnr": 6.0, + "rxSnr": 6, "hopLimit": 3, "raw": "faked", "fromId": "!28b5465c", @@ -1937,12 +1939,12 @@ def test_main_onReceive_with_text_replies_on_explicit_matching_channel(caplog, c assert re.search(r"in onReceive", caplog.text, re.MULTILINE) out, err = capsys.readouterr() assert re.search( - r"Received channel 2\. Sending reply: got msg 'faked' with rxSnr: 6.0 and hopLimit: 3", + r"Received channel 2\. Sending reply: got msg 'faked' with rxSnr: 3.0 and hopLimit: 3", out, re.MULTILINE, ) iface.sendText.assert_called_once_with( - "got msg 'faked' with rxSnr: 6.0 and hopLimit: 3", channelIndex=2 + "got msg 'faked' with rxSnr: 3.0 and hopLimit: 3", channelIndex=2 ) assert err == "" @@ -2044,8 +2046,8 @@ def test_export_profile_serializes_deviceprofile(): assert profile.canned_messages == "Hi|Bye" assert profile.ringtone == "24:d=32,o=5" assert profile.HasField("fixed_position") - assert profile.fixed_position.latitude_i == 358888800 - assert profile.fixed_position.longitude_i == -938888800 + assert profile.fixed_position.latitude == 358888800 + assert profile.fixed_position.longitude == -938888800 assert profile.fixed_position.altitude == 304 @@ -2120,8 +2122,8 @@ def test_export_profile_converts_precisely(): profile = DeviceProfile() profile.ParseFromString(raw) - assert profile.fixed_position.latitude_i == -498220700 - assert profile.fixed_position.longitude_i == 0 + assert profile.fixed_position.latitude == -498220700 + assert profile.fixed_position.longitude == 0 @pytest.mark.unit @@ -2146,8 +2148,8 @@ def test_profile_from_yaml_maps_all_fields(): assert profile.canned_messages == "Hi|Bye" assert profile.ringtone == "24:d=32,o=5" assert profile.HasField("fixed_position") - assert profile.fixed_position.latitude_i == 358888800 - assert profile.fixed_position.longitude_i == -938888800 + assert profile.fixed_position.latitude == 358888800 + assert profile.fixed_position.longitude == -938888800 assert profile.fixed_position.altitude == 304 assert profile.HasField("config") assert profile.config.bluetooth.enabled is True @@ -2182,8 +2184,8 @@ def test_profile_from_yaml_converts_precisely(): } profile = _profile_from_yaml(configuration) - assert profile.fixed_position.latitude_i == -498220700 - assert profile.fixed_position.longitude_i == 0 + assert profile.fixed_position.latitude == -498220700 + assert profile.fixed_position.longitude == 0 @pytest.mark.unit @@ -2359,8 +2361,8 @@ def test_main_export_config_binary_round_trip(tmp_path, capsys): assert profile.long_name == "Round Trip" assert profile.short_name == "RT" assert profile.HasField("fixed_position") - assert profile.fixed_position.latitude_i == int(1.0 * 1e7) - assert profile.fixed_position.longitude_i == int(2.0 * 1e7) + assert profile.fixed_position.latitude == int(1.0 * 1e7) + assert profile.fixed_position.longitude == int(2.0 * 1e7) assert profile.fixed_position.altitude == 3 # Re-import the file we just wrote @@ -2557,18 +2559,34 @@ def test_main_configure_rejects_remote_node(tmp_path, capsys): ] _MOD_TRUE_DEFAULTS = [ - "mqtt.encryption_enabled", + "mqtt.encryption", ] +def _get_bool(msg, name): + """A bool field, or a named bit of one of the message's packed bitfields.""" + if name in msg.DESCRIPTOR.fields_by_name: + return getattr(msg, name) + field, mask = find_bit(msg.DESCRIPTOR, name) + return bool(getattr(msg, field) & mask) + + +def _set_bool(msg, name, value): + if name in msg.DESCRIPTOR.fields_by_name: + setattr(msg, name, value) + return + field, mask = find_bit(msg.DESCRIPTOR, name) + setattr(msg, field, getattr(msg, field) | mask if value else getattr(msg, field) & ~mask) + + def _set_config_bool(lc, path, value): section, field = path.split(".") - setattr(getattr(lc, section), field, value) + _set_bool(getattr(lc, section), field, value) def _assert_config_bool(profile, path, expected): section, field = path.split(".") - assert getattr(getattr(profile.config, section), field) is expected + assert _get_bool(getattr(profile.config, section), field) is expected @pytest.mark.unit @@ -2607,7 +2625,7 @@ def test_round_trip_preserves_config_true_defaults(fmt, value): _assert_config_bool(profile, path, value) for path in _MOD_TRUE_DEFAULTS: section, field = path.split(".") - assert getattr(getattr(profile.module_config, section), field) is value + assert _get_bool(getattr(profile.module_config, section), field) is value @pytest.mark.unit @@ -2627,14 +2645,14 @@ def test_binary_and_yaml_export_consistent(): lc = iface.localNode.localConfig lc.bluetooth.enabled = True lc.bluetooth.fixed_pin = 123456 - lc.lora.sx126x_rx_boosted_gain = False - lc.lora.tx_enabled = True - lc.lora.use_preset = True + _set_bool(lc.lora, "sx126x_rx_boosted_gain", False) + _set_bool(lc.lora, "tx_enabled", True) + _set_bool(lc.lora, "use_preset", True) lc.position.position_broadcast_smart_enabled = False - lc.security.serial_enabled = True + _set_bool(lc.security, "serial_enabled", True) lc_mod = iface.localNode.moduleConfig - lc_mod.mqtt.encryption_enabled = True + _set_bool(lc_mod.mqtt, "encryption", True) # Binary path raw = export_profile(iface) @@ -2653,12 +2671,10 @@ def test_binary_and_yaml_export_consistent(): # Compare individual field values assert binary_profile.config.bluetooth.enabled == yaml_profile.config.bluetooth.enabled assert binary_profile.config.bluetooth.fixed_pin == yaml_profile.config.bluetooth.fixed_pin - assert binary_profile.config.lora.sx126x_rx_boosted_gain == yaml_profile.config.lora.sx126x_rx_boosted_gain - assert binary_profile.config.lora.tx_enabled == yaml_profile.config.lora.tx_enabled - assert binary_profile.config.lora.use_preset == yaml_profile.config.lora.use_preset + assert binary_profile.config.lora.flags == yaml_profile.config.lora.flags assert binary_profile.config.position.position_broadcast_smart_enabled == yaml_profile.config.position.position_broadcast_smart_enabled - assert binary_profile.config.security.serial_enabled == yaml_profile.config.security.serial_enabled - assert binary_profile.module_config.mqtt.encryption_enabled == yaml_profile.module_config.mqtt.encryption_enabled + assert binary_profile.config.security.flags == yaml_profile.config.security.flags + assert binary_profile.module_config.mqtt.flags == yaml_profile.module_config.mqtt.flags # Owner fields also match assert binary_profile.long_name == yaml_profile.long_name @@ -2726,7 +2742,7 @@ def test_main_gpio_rd_no_dest(capsys): sys.argv = ["", "--gpio-rd", "0x2000"] mt_config.args = sys.argv - channel = Channel(index=2, role=2) + channel = Channel(index=2) channel.settings.psk = b"\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84" channel.settings.name = "gpio" @@ -3839,3 +3855,27 @@ def test_main_setPref_bitfield_invalid_name(capsys): assert "Unknown flag 'TCP'" in out assert "NO_BROADCAST" in out assert "UDP_BROADCAST" in out + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_setPref_and_getPref_bitfield_bit(capsys): + """A named bit of a packed bitfield sets and reads as if it were a bool field.""" + config = LocalConfig() + config.lora.flags = config.lora.LORA_USE_PRESET + assert setPref(config, "lora.tx_enabled", "true") is True + assert config.lora.flags == config.lora.LORA_USE_PRESET | config.lora.LORA_TX_ENABLED + assert setPref(config, "lora.usePreset", "false") is True + assert config.lora.flags == config.lora.LORA_TX_ENABLED + out, _ = capsys.readouterr() + assert "Set lora.tx_enabled to true" in out + + node = MagicMock() + node.localConfig = config + node.moduleConfig = LocalModuleConfig() + assert getPref(node, "lora.tx_enabled") is True + assert getPref(node, "lora") is True + out, _ = capsys.readouterr() + assert "lora.tx_enabled: True" in out + assert "lora.use_preset: False" in out + assert "lora.flags" not in out diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 7f0a9f5b1..55eba594e 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -7,7 +7,7 @@ import pytest from hypothesis import given, strategies as st -from ..protobuf import mesh_pb2, config_pb2 +from ..protobuf import config_pb2, packet_pb2 from .. import BROADCAST_ADDR, LOCAL_ADDR from ..mesh_interface import MeshInterface, _timeago from ..node import Node @@ -37,8 +37,7 @@ def test_MeshInterface(capsys): "id": NODE_ID, "longName": "Unknown f81c", "shortName": "?1C", - "macaddr": "RBeTiPgc", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, "position": {}, "lastHeard": 1640204888, @@ -51,7 +50,7 @@ def test_MeshInterface(capsys): myInfo = MagicMock() iface.myInfo = myInfo - iface.localNode.localConfig.lora.CopyFrom(config_pb2.Config.LoRaConfig()) + iface.localNode.localConfig.lora.CopyFrom(config_pb2.LoRaConfig()) # Also get some coverage of the structured logging/power meter stuff by turning it on as well log_set = LogSet(iface, None, SimPowerSupply()) @@ -107,7 +106,7 @@ def test_getShortName(iface_with_nodes): def test_handlePacketFromRadio_no_from(capsys): """Test _handlePacketFromRadio with no 'from' in the mesh packet.""" iface = MeshInterface(noProto=True) - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._handlePacketFromRadio(meshPacket) out, err = capsys.readouterr() assert re.search(r"Device returned a packet we sent, ignoring", out, re.MULTILINE) @@ -122,7 +121,7 @@ def test_handlePacketFromRadio_with_a_portnum(caplog): Had to implement a hack just to be able to test some code. """ iface = MeshInterface(noProto=True) - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() meshPacket.decoded.payload = b"" meshPacket.decoded.portnum = 1 with caplog.at_level(logging.WARNING): @@ -135,7 +134,7 @@ def test_handlePacketFromRadio_with_a_portnum(caplog): def test_handlePacketFromRadio_no_portnum(caplog): """Test _handlePacketFromRadio without a portnum""" iface = MeshInterface(noProto=True) - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() meshPacket.decoded.payload = b"" with caplog.at_level(logging.WARNING): iface._handlePacketFromRadio(meshPacket, hack=True) @@ -403,8 +402,8 @@ def test_sendPosition_with_a_position(caplog): iface = MeshInterface(noProto=True) with caplog.at_level(logging.DEBUG): iface.sendPosition(latitude=40.8, longitude=-111.86, altitude=201) - assert re.search(r"p.latitude_i:408", caplog.text, re.MULTILINE) - assert re.search(r"p.longitude_i:-11186", caplog.text, re.MULTILINE) + assert re.search(r"p.latitude:408", caplog.text, re.MULTILINE) + assert re.search(r"p.longitude:-11186", caplog.text, re.MULTILINE) assert re.search(r"p.altitude:201", caplog.text, re.MULTILINE) @@ -428,7 +427,7 @@ def test_sendPacket_with_destination_as_int(caplog): """Test _sendPacket() with int as a destination""" iface = MeshInterface(noProto=True) with caplog.at_level(logging.DEBUG): - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._sendPacket(meshPacket, destinationId=123) assert re.search(r"Not sending packet", caplog.text, re.MULTILINE) @@ -439,7 +438,7 @@ def test_sendPacket_with_destination_starting_with_a_bang(caplog): """Test _sendPacket() with int as a destination""" iface = MeshInterface(noProto=True) with caplog.at_level(logging.DEBUG): - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._sendPacket(meshPacket, destinationId="!1234") assert re.search(r"Not sending packet", caplog.text, re.MULTILINE) @@ -450,7 +449,7 @@ def test_sendPacket_with_destination_as_BROADCAST_ADDR(caplog): """Test _sendPacket() with BROADCAST_ADDR as a destination""" iface = MeshInterface(noProto=True) with caplog.at_level(logging.DEBUG): - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._sendPacket(meshPacket, destinationId=BROADCAST_ADDR) assert re.search(r"Not sending packet", caplog.text, re.MULTILINE) @@ -461,7 +460,7 @@ def test_sendPacket_with_destination_as_LOCAL_ADDR_no_myInfo(capsys): """Test _sendPacket() with LOCAL_ADDR as a destination with no myInfo""" iface = MeshInterface(noProto=True) with pytest.raises(SystemExit) as pytest_wrapped_e: - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._sendPacket(meshPacket, destinationId=LOCAL_ADDR) out, err = capsys.readouterr() assert re.search(r"Warning: No myInfo", out, re.MULTILINE) @@ -479,7 +478,7 @@ def test_sendPacket_with_destination_as_LOCAL_ADDR_with_myInfo(caplog): iface.myInfo = myInfo iface.myInfo.my_node_num = 1 with caplog.at_level(logging.DEBUG): - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() iface._sendPacket(meshPacket, destinationId=LOCAL_ADDR) assert re.search(r"Not sending packet", caplog.text, re.MULTILINE) @@ -489,7 +488,7 @@ def test_sendPacket_with_destination_as_LOCAL_ADDR_with_myInfo(caplog): def test_sendPacket_with_destination_is_blank_with_nodes(capsys, iface_with_nodes): """Test _sendPacket() with '' as a destination with myInfo""" iface = iface_with_nodes - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() with pytest.raises(SystemExit) as pytest_wrapped_e: iface._sendPacket(meshPacket, destinationId="") assert pytest_wrapped_e.type == SystemExit @@ -505,7 +504,7 @@ def test_sendPacket_with_destination_is_blank_without_nodes(caplog, iface_with_n """Test _sendPacket() with '' as a destination with myInfo""" iface = iface_with_nodes iface.nodes = None - meshPacket = mesh_pb2.MeshPacket() + meshPacket = packet_pb2.MeshPacket() with caplog.at_level(logging.WARNING): iface._sendPacket(meshPacket, destinationId="") assert re.search(r"Warning: There were no self.nodes.", caplog.text, re.MULTILINE) @@ -637,7 +636,7 @@ def test_getOrCreateByNum_minimal(iface_with_nodes): iface = iface_with_nodes iface.myInfo.my_node_num = 2475227164 tmp = iface._getOrCreateByNum(123) - assert tmp == {"num": 123, "user": {"hwModel": "UNSET", "id": "!0000007b", "shortName": "007b", "longName": "Meshtastic 007b"}} + assert tmp == {"num": 123, "user": {"hwModel": 0, "id": "!0000007b", "shortName": "007b", "longName": "Meshtastic 007b"}} @pytest.mark.unit @@ -797,3 +796,49 @@ def test_onResponseTraceRoute_routing_none(capsys): assert iface._acknowledgment.receivedTraceRoute is True out, _ = capsys.readouterr() assert "Traceroute failed" not in out + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_fixupPosition_full_and_scaled(): + """A client-link position (full latitude) and an over-the-air one (scaled by + precision_bits) both become latitudeI and degrees; a second pass changes nothing.""" + iface = MeshInterface(noProto=True) + full = iface._fixupPosition({"latitude": 515000000, "longitude": -1200000}) + assert full["latitudeI"] == 515000000 and full["latitude"] == 51.5 + assert full["longitudeI"] == -1200000 and full["longitude"] == -0.12 + assert iface._fixupPosition(dict(full)) == full + + scaled = iface._fixupPosition({"latitudeScaled": 515000000 >> 11, "longitudeScaled": -1200000 >> 11, + "precisionBits": 21}) + assert scaled["latitudeI"] == (515000000 >> 11) << 11 + assert scaled["longitudeI"] == (-1200000 >> 11) << 11 + assert abs(scaled["latitude"] - 51.5) < 1e-3 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_onResponseTraceRoute_prints_recorded_path(capsys): + """The reply's path tail is the route back: from, each recorded relay, the last relay, us. + A suffix names a node when exactly one known node ends in it.""" + iface = MeshInterface(noProto=True) + iface.nodesByNum = {0x11111122: {}, 0x33333344: {}, 0x55555544: {}} + raw = packet_pb2.MeshPacket(to=0x0a0b0c0d, hop_start=5, hop_limit=2, relay_node=0x22, + flags=packet_pb2.MeshPacket.PACKET_RECORD_PATH, path=bytes([0x44, 0x66]), rx_snr=-7) + setattr(raw, "from", 0x12345678) + iface.onResponseTraceRoute({"from": 0x12345678, "to": 0x0a0b0c0d, "decoded": {"portnum": "TELEMETRY_APP"}, "raw": raw}) + out, _ = capsys.readouterr() + assert "!12345678 --> !??????44 --> !??????66 --> !11111122 --> !0a0b0c0d (-3.5dB)" in out + assert iface._acknowledgment.receivedTraceRoute is True + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_onResponseTraceRoute_without_recorded_path(capsys): + """A reply that did not record its path still reports how many hops it took.""" + iface = MeshInterface(noProto=True) + iface.nodesByNum = {} + raw = packet_pb2.MeshPacket(hop_start=3, hop_limit=1) + iface.onResponseTraceRoute({"from": 1, "to": 2, "decoded": {"portnum": "TELEMETRY_APP"}, "raw": raw}) + out, _ = capsys.readouterr() + assert "!00000001 --> (2 hops, path not recorded) --> !00000002" in out diff --git a/meshtastic/tests/test_mesh_interface_traffic_management.py b/meshtastic/tests/test_mesh_interface_traffic_management.py index c8bb907fc..79a60ff0d 100644 --- a/meshtastic/tests/test_mesh_interface_traffic_management.py +++ b/meshtastic/tests/test_mesh_interface_traffic_management.py @@ -3,7 +3,7 @@ import pytest from ..mesh_interface import MeshInterface -from ..protobuf import mesh_pb2 +from ..protobuf import api_pb2 @pytest.mark.unit @@ -11,9 +11,9 @@ 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.position_min_interval_secs = 30 - from_radio.moduleConfig.traffic_management.rate_limit_window_secs = 60 + from_radio = api_pb2.FromRadio() + from_radio.module_config.traffic_management.position_min_interval_secs = 30 + from_radio.module_config.traffic_management.rate_limit_window_secs = 60 iface._handleFromRadio(from_radio.SerializeToString()) diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 425350628..26eacd920 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -9,9 +9,9 @@ import pytest from hypothesis import given, strategies as st -from ..protobuf import admin_pb2, localonly_pb2, config_pb2, mesh_pb2, nanopb_pb2 +from ..protobuf import admin_pb2, common_pb2, config_pb2, localonly_pb2, nanopb_pb2, wire_pb2 from ..protobuf.channel_pb2 import Channel # pylint: disable=E0611 -from ..node import Node +from ..node import MAX_CHANNELS, Node, channel_role from ..serial_interface import SerialInterface from ..mesh_interface import MeshInterface from ..util import to_node_num @@ -25,7 +25,7 @@ # Extract nanopb max_size constraints from the User protobuf descriptor _USER_NANOPB = { field.name: field.GetOptions().Extensions[nanopb_pb2.nanopb] - for field in mesh_pb2.User.DESCRIPTOR.fields + for field in wire_pb2.User.DESCRIPTOR.fields } @pytest.mark.unit @@ -38,7 +38,7 @@ def test_node(capsys): anode = Node(mo, "bar", noProto=True) lc = localonly_pb2.LocalConfig() anode.localConfig = lc - lc.lora.CopyFrom(config_pb2.Config.LoRaConfig()) + lc.lora.CopyFrom(config_pb2.LoRaConfig()) anode.moduleConfig = localonly_pb2.LocalModuleConfig() anode.showInfo() out, err = capsys.readouterr() @@ -354,11 +354,9 @@ def test_setURL_valid_URL_but_no_settings(capsys): { "num": 2198819370, "user": { - "id": "!830f522a", "longName": "Roadrunner Ridge", "shortName": "RKSN", - "macaddr": "AAAAAAAAAAA=", - "hwModel": "RAK4631", + "hwModel": 9, # RAK4631 "role": "ROUTER", "publicKey": "Rx8XD96uBAiFGoFusdqwti3eBT4DLyGuG7g5Wcg9Bw==", "isLicensed": True, @@ -374,11 +372,9 @@ def test_setURL_valid_URL_but_no_settings(capsys): { "num": 305419896, "user": { - "id": "!12345678", "longName": "Test Node", "shortName": "TN", - "macaddr": "QkVTVEVWRVI=", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, }, False, @@ -390,11 +386,9 @@ def test_setURL_valid_URL_but_no_settings(capsys): { "num": 305419896, "user": { - "id": "!12345678", "longName": "Another Node", "shortName": "AN", - "macaddr": "QkVTVEVWRVI=", - "hwModel": "HELTEC_V3", + "hwModel": 43, # HELTEC_V3 "role": "CLIENT", "publicKey": "AAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", "isLicensed": False, @@ -409,11 +403,9 @@ def test_setURL_valid_URL_but_no_settings(capsys): { "num": 3735928559, "user": { - "id": "!deadbeef", "longName": "Minimal Contact", "shortName": "MC", - "macaddr": "BQYHCAkKCw==", - "hwModel": "UNSET", + "hwModel": 0, "role": "CLIENT_MUTE", }, }, @@ -426,11 +418,9 @@ def test_setURL_valid_URL_but_no_settings(capsys): { "num": 439041101, "user": { - "id": "!1a2b3c4d", "longName": "Licensed Node", "shortName": "LN", - "macaddr": "DA0ODxAREg==", - "hwModel": "NANO_G1", + "hwModel": 14, # NANO_G1 "isLicensed": True, "isUnmessagable": True, }, @@ -464,15 +454,11 @@ def capture_send(p, *_args, **_kwargs): u = node_data["user"] assert contact.node_num == node_num - assert contact.user.id == u["id"] assert contact.user.long_name == u["longName"] assert contact.user.short_name == u["shortName"] - assert contact.user.macaddr == base64.b64decode(u["macaddr"]) - - if u.get("hwModel") and u["hwModel"] != "UNSET": - assert contact.user.hw_model == mesh_pb2.HardwareModel.Value(u["hwModel"]) + assert contact.user.hw_model == u["hwModel"] if u.get("role"): - assert contact.user.role == config_pb2.Config.DeviceConfig.Role.Value(u["role"]) + assert contact.user.role == common_pb2.Role.Value(u["role"]) if u.get("publicKey"): assert contact.user.public_key == base64.b64decode(u["publicKey"]) if u.get("isLicensed"): @@ -491,12 +477,10 @@ def contact_url_roundtrip_params(draw): manually_verified = draw(st.booleans()) node_num = draw(st.integers(min_value=6, max_value=2**32 - 2)) - node_id = f"!{node_num:08x}" - - hw_model = draw(st.sampled_from(list(mesh_pb2.HardwareModel.keys()))) + hw_model = draw(st.integers(min_value=0, max_value=0x3FFF)) # (vendor_id << 8) | device_id role = draw(st.one_of( st.none(), - st.sampled_from(list(config_pb2.Config.DeviceConfig.Role.keys())), + st.sampled_from(list(common_pb2.Role.keys())), )) long_name = draw(st.text( @@ -506,12 +490,6 @@ def contact_url_roundtrip_params(draw): min_size=1, max_size=_USER_NANOPB['short_name'].max_size )) - macaddr_bytes = draw(st.binary( - min_size=_USER_NANOPB['macaddr'].max_size, - max_size=_USER_NANOPB['macaddr'].max_size, - )) - macaddr_b64 = base64.b64encode(macaddr_bytes).decode("ascii") - has_public_key = draw(st.booleans()) public_key_b64 = None if has_public_key: @@ -527,10 +505,8 @@ def contact_url_roundtrip_params(draw): node_data = { "num": node_num, "user": { - "id": node_id, "longName": long_name, "shortName": short_name, - "macaddr": macaddr_b64, "hwModel": hw_model, "isLicensed": is_licensed, "isUnmessagable": is_unmessagable, @@ -573,14 +549,12 @@ def capture_send(p, *_args, **_kwargs): u = node_data["user"] assert contact.node_num == node_num - assert contact.user.id == u["id"] assert contact.user.long_name == u["longName"] assert contact.user.short_name == u["shortName"] - assert contact.user.macaddr == base64.b64decode(u["macaddr"]) - assert contact.user.hw_model == mesh_pb2.HardwareModel.Value(u["hwModel"]) + assert contact.user.hw_model == u["hwModel"] if "role" in u: - assert contact.user.role == config_pb2.Config.DeviceConfig.Role.Value(u["role"]) + assert contact.user.role == common_pb2.Role.Value(u["role"]) if "publicKey" in u: assert contact.user.public_key == base64.b64decode(u["publicKey"]) assert contact.user.is_licensed == u["isLicensed"] @@ -599,20 +573,20 @@ def capture_send(p, *_args, **_kwargs): # # role: 0=Disabled, 1=Primary, 2=Secondary # # modem_config: 0-5 # # role: 0=Disabled, 1=Primary, 2=Secondary -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'testing' # -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -636,14 +610,14 @@ def test_getChannelByChannelIndex(): """Test getChannelByChannelIndex()""" anode = Node("foo", "bar") - channel1 = Channel(index=1, role=1) # primary channel - channel2 = Channel(index=2, role=2) # secondary channel - channel3 = Channel(index=3, role=0) - channel4 = Channel(index=4, role=0) - channel5 = Channel(index=5, role=0) - channel6 = Channel(index=6, role=0) - channel7 = Channel(index=7, role=0) - channel8 = Channel(index=8, role=0) + channel1 = Channel(index=1) # primary channel + channel2 = Channel(index=2) # secondary channel + channel3 = Channel(index=3) + channel4 = Channel(index=4) + channel5 = Channel(index=5) + channel6 = Channel(index=6) + channel7 = Channel(index=7) + channel8 = Channel(index=8) channels = [ channel1, @@ -670,23 +644,19 @@ def test_getChannelByChannelIndex(): def _build_channels(highest_secondary_index: int): - """Build an 8-slot channel table with contiguous active channels. + """Build a full channel table with contiguous active channels. Slot 0 is PRIMARY. Slots 1..highest_secondary_index are SECONDARY. - Remaining slots are DISABLED. + Remaining slots are DISABLED: no settings. """ channels = [] - for idx in range(8): + for idx in range(MAX_CHANNELS): ch = Channel() ch.index = idx if idx == 0: - ch.role = Channel.Role.PRIMARY ch.settings.name = "primary" elif idx <= highest_secondary_index: - ch.role = Channel.Role.SECONDARY ch.settings.name = f"ch{idx}" - else: - ch.role = Channel.Role.DISABLED channels.append(ch) return channels @@ -747,18 +717,18 @@ def test_delete_channel_rejects_primary(): # """Try to delete primary channel.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # # # no secondary channels -# channel2 = Channel(index=2, role=0) -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel2 = Channel(index=2) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -777,20 +747,20 @@ def test_delete_channel_rejects_primary(): # def test_deleteChannel_secondary(): # """Try to delete a secondary channel.""" # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'testing' # -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -830,22 +800,22 @@ def test_delete_channel_rejects_primary(): # def test_deleteChannel_secondary_with_admin_channel_after_testing(): # """Try to delete a secondary channel where there is an admin channel.""" # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'testing' # -# channel3 = Channel(index=3, role=2) +# channel3 = Channel(index=3) # channel3.settings.name = 'admin' # -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -890,22 +860,22 @@ def test_delete_channel_rejects_primary(): # def test_deleteChannel_secondary_with_admin_channel_before_testing(): # """Try to delete a secondary channel where there is an admin channel.""" # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'admin' # -# channel3 = Channel(index=3, role=2) +# channel3 = Channel(index=3) # channel3.settings.name = 'testing' # -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -945,20 +915,20 @@ def test_delete_channel_rejects_primary(): # """Get a channel by the name.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'admin' # -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -973,20 +943,20 @@ def test_delete_channel_rejects_primary(): # """Get a channel by the name but one that is not present.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'admin' # -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1000,23 +970,23 @@ def test_delete_channel_rejects_primary(): # """Get the first disabled channel.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'testingA' # -# channel3 = Channel(index=3, role=2) +# channel3 = Channel(index=3) # channel3.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel3.settings.name = 'testingB' # -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1031,17 +1001,17 @@ def test_delete_channel_rejects_primary(): # """Get the first disabled channel.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) -# channel3 = Channel(index=3, role=2) -# channel4 = Channel(index=4, role=2) -# channel5 = Channel(index=5, role=2) -# channel6 = Channel(index=6, role=2) -# channel7 = Channel(index=7, role=2) -# channel8 = Channel(index=8, role=2) +# channel2 = Channel(index=2) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1056,20 +1026,20 @@ def test_delete_channel_rejects_primary(): # """Get the 'admin' channel index.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=2) +# channel2 = Channel(index=2) # channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' # channel2.settings.name = 'admin' # -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1084,17 +1054,17 @@ def test_delete_channel_rejects_primary(): # """Get the 'admin' channel when there is not one.""" # anode = Node('foo', 'bar') # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # -# channel2 = Channel(index=2, role=0) -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel2 = Channel(index=2) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1110,18 +1080,18 @@ def test_delete_channel_rejects_primary(): # """Turn off encryption when there is a psk.""" # anode = Node('foo', 'bar', noProto=True) # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # # value from using "--ch-set psk 0x1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b " # channel1.settings.psk = b'\x1a\x1a\x1a\x1a++++\x1a\x1a\x1a\x1a++++\x1a\x1a\x1a\x1a++++\x1a\x1a\x1a\x1a++++' # -# channel2 = Channel(index=2, role=0) -# channel3 = Channel(index=3, role=0) -# channel4 = Channel(index=4, role=0) -# channel5 = Channel(index=5, role=0) -# channel6 = Channel(index=6, role=0) -# channel7 = Channel(index=7, role=0) -# channel8 = Channel(index=8, role=0) +# channel2 = Channel(index=2) +# channel3 = Channel(index=3) +# channel4 = Channel(index=4) +# channel5 = Channel(index=5) +# channel6 = Channel(index=6) +# channel7 = Channel(index=7) +# channel8 = Channel(index=8) # # channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] # @@ -1599,7 +1569,7 @@ def test_requestChannels_non_localNode_starting_index(caplog): # def test_onResponseRequestChannel(caplog): # """Test onResponseRequestChannel()""" # -# channel1 = Channel(index=1, role=1) +# channel1 = Channel(index=1) # channel1.settings.modem_config = 3 # channel1.settings.psk = b'\x01' # @@ -1607,7 +1577,7 @@ def test_requestChannels_non_localNode_starting_index(caplog): # msg1.get_channel_response = channel1 # # msg2 = MagicMock(autospec=AdminMessage) -# channel2 = Channel(index=2, role=0) # disabled +# channel2 = Channel(index=2) # disabled # msg2.get_channel_response = channel2 # # # default primary channel @@ -1972,3 +1942,13 @@ def test_start_ota_remote_node_raises_error(): # anode._timeout = Timeout(0.01) # result = anode.waitForConfig() # assert not result + + +@pytest.mark.unit +def test_channel_role(): + """3.0 channels have no role field: index 0 is primary, settings make a channel secondary.""" + assert channel_role(Channel(index=0)) == "PRIMARY" + assert channel_role(Channel(index=3)) == "DISABLED" + ch = Channel(index=3) + ch.settings.name = "x" + assert channel_role(ch) == "SECONDARY" diff --git a/meshtastic/tests/test_serial_interface.py b/meshtastic/tests/test_serial_interface.py index cb5b3e23c..35f1fed01 100644 --- a/meshtastic/tests/test_serial_interface.py +++ b/meshtastic/tests/test_serial_interface.py @@ -21,7 +21,7 @@ def test_SerialInterface_single_port( ): """Test that we can instantiate a SerialInterface with a single port""" iface = SerialInterface(noProto=True) - iface.localNode.localConfig.lora.CopyFrom(config_pb2.Config.LoRaConfig()) + iface.localNode.localConfig.lora.CopyFrom(config_pb2.LoRaConfig()) iface.showInfo() iface.localNode.showInfo() iface.close() diff --git a/meshtastic/tests/test_showNodes_favorite.py b/meshtastic/tests/test_showNodes_favorite.py index 3c8f7ee44..1ba790a07 100644 --- a/meshtastic/tests/test_showNodes_favorite.py +++ b/meshtastic/tests/test_showNodes_favorite.py @@ -17,8 +17,7 @@ def _iface_with_favorite_nodes(): "id": "!9388f81c", "longName": "Favorite Node", "shortName": "FAV1", - "macaddr": "RBeTiPgc", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, "position": {}, "lastHeard": 1640204888, @@ -30,8 +29,7 @@ def _iface_with_favorite_nodes(): "id": "!12345678", "longName": "Regular Node", "shortName": "REG1", - "macaddr": "ABCDEFGH", - "hwModel": "TLORA_V2", + "hwModel": 1, # TLORA_V2 }, "position": {}, "lastHeard": 1640204999, @@ -43,8 +41,7 @@ def _iface_with_favorite_nodes(): "id": "!abcdef00", "longName": "Legacy Node", "shortName": "LEG1", - "macaddr": "XYZABC00", - "hwModel": "HELTEC_V3", + "hwModel": 43, # HELTEC_V3 }, "position": {}, "lastHeard": 1640205000, @@ -59,8 +56,7 @@ def _iface_with_favorite_nodes(): "id": "!9388f81c", "longName": "Favorite Node", "shortName": "FAV1", - "macaddr": "RBeTiPgc", - "hwModel": "TBEAM", + "hwModel": 4, # TBEAM }, "position": {"time": 1640206266}, "lastHeard": 1640206266, @@ -72,8 +68,7 @@ def _iface_with_favorite_nodes(): "id": "!12345678", "longName": "Regular Node", "shortName": "REG1", - "macaddr": "ABCDEFGH", - "hwModel": "TLORA_V2", + "hwModel": 1, # TLORA_V2 }, "position": {"time": 1640206200}, "lastHeard": 1640206200, @@ -85,8 +80,7 @@ def _iface_with_favorite_nodes(): "id": "!abcdef00", "longName": "Legacy Node", "shortName": "LEG1", - "macaddr": "XYZABC00", - "hwModel": "HELTEC_V3", + "hwModel": 43, # HELTEC_V3 }, "position": {"time": 1640206100}, "lastHeard": 1640206100, diff --git a/meshtastic/tests/test_smoke1.py b/meshtastic/tests/test_smoke1.py index 6a5709e6c..e3dcc3a4a 100644 --- a/meshtastic/tests/test_smoke1.py +++ b/meshtastic/tests/test_smoke1.py @@ -243,12 +243,10 @@ def test_smoke1_ch_set_modem_config(): @pytest.mark.smoke1 def test_smoke1_ch_values(): - """Test --ch-vlongslow --ch-longslow, --ch-longfast, --ch-mediumslow, --ch-mediumsfast, + """Test --ch-longfast, --ch-mediumslow, --ch-mediumsfast, --ch-shortslow, and --ch-shortfast arguments """ exp = { - "--ch-vlongslow": '{ "psk": "AQ==" }', - "--ch-longslow": "LongSlow", "--ch-longfast": "LongFast", "--ch-medslow": "MedSlow", "--ch-medfast": "MedFast", diff --git a/meshtastic/tests/test_smokemesh.py b/meshtastic/tests/test_smokemesh.py index e71da642b..5bad84dff 100644 --- a/meshtastic/tests/test_smokemesh.py +++ b/meshtastic/tests/test_smokemesh.py @@ -9,10 +9,12 @@ import pytest +from meshtastic.protobuf import packet_pb2 + from .fw_helpers import ( RECEIVE_TIMEOUT, subscribe_texts, - subscribe_traceroutes, + subscribe_telemetries, unsubscribe_all, ) @@ -101,11 +103,9 @@ def test_smokemesh_show_nodes(firmware_mesh): @pytest.mark.smokemesh def test_smokemesh_traceroute_across_relay(firmware_mesh): - """Traceroute from A to C should show route via B in both directions.""" - col_a = subscribe_traceroutes(firmware_mesh.get_iface(0)) - col_c = subscribe_traceroutes(firmware_mesh.get_iface(2)) + """A traceroute from A to C: the reply records its way back, through B.""" + col_a = subscribe_telemetries(firmware_mesh.get_iface(0)) try: - src_a = firmware_mesh.get_node(0).node_num dest_c = firmware_mesh.get_node(2).node_num node_b = firmware_mesh.get_node(1).node_num @@ -113,16 +113,11 @@ def test_smokemesh_traceroute_across_relay(firmware_mesh): time.sleep(2) - assert len(col_a.traceroutes) >= 1, "A did not receive traceroute response" - a_resp = col_a.traceroutes[0] - assert a_resp["from"] == dest_c, "response source should be C" - - route = a_resp["decoded"]["traceroute"] - assert route.get("route") == [node_b], "forward route should be A→B→C" - assert route.get("routeBack") == [node_b], "return route should be C→B→A" - - assert len(col_c.traceroutes) >= 1, "C did not receive traceroute request" - c_req = col_c.traceroutes[0] - assert c_req["from"] == src_a, "request source should be A" + replies = [p for p in col_a.telemetries if p["from"] == dest_c] + assert replies, "A did not receive the reply from C" + raw = replies[0]["raw"] + assert raw.flags & packet_pb2.MeshPacket.PACKET_RECORD_PATH, "the reply should record its path" + assert raw.hop_start - raw.hop_limit == 1, "the reply should take one relay hop" + assert raw.relay_node == (node_b & 0xFF or 1), "the reply should be relayed by B" finally: - unsubscribe_all("meshtastic.receive.traceroute") + unsubscribe_all("meshtastic.receive.telemetry") diff --git a/meshtastic/tests/test_smokevirt.py b/meshtastic/tests/test_smokevirt.py index 833a0eb6d..35778dbb5 100644 --- a/meshtastic/tests/test_smokevirt.py +++ b/meshtastic/tests/test_smokevirt.py @@ -25,7 +25,8 @@ import pytest -from meshtastic.protobuf import channel_pb2, config_pb2 +from meshtastic.node import channel_role +from meshtastic.protobuf import common_pb2, config_pb2 from .fw_helpers import ( PAUSE_AFTER_CLI, @@ -235,10 +236,7 @@ def _channel(iface, idx): def _assert_channel_role(iface, idx, expected_role): ch = _channel(iface, idx) assert ch is not None, f"channel {idx} missing" - assert ch.role == expected_role, ( - f"channel {idx} role: {channel_pb2.Channel.Role.Name(ch.role)} " - f"!= {channel_pb2.Channel.Role.Name(expected_role)}" - ) + assert channel_role(ch) == expected_role, f"channel {idx} role: {channel_role(ch)} != {expected_role}" def _set_and_verify(port, args, verifier, expect_rc=0): @@ -262,14 +260,14 @@ def check(iface): _CH_PRESETS = [ - ("--ch-longmod", config_pb2.Config.LoRaConfig.ModemPreset.LONG_MODERATE), - ("--ch-longfast", config_pb2.Config.LoRaConfig.ModemPreset.LONG_FAST), - ("--ch-longturbo", config_pb2.Config.LoRaConfig.ModemPreset.LONG_TURBO), - ("--ch-medslow", config_pb2.Config.LoRaConfig.ModemPreset.MEDIUM_SLOW), - ("--ch-medfast", config_pb2.Config.LoRaConfig.ModemPreset.MEDIUM_FAST), - ("--ch-shortslow", config_pb2.Config.LoRaConfig.ModemPreset.SHORT_SLOW), - ("--ch-shortfast", config_pb2.Config.LoRaConfig.ModemPreset.SHORT_FAST), - ("--ch-shortturbo", config_pb2.Config.LoRaConfig.ModemPreset.SHORT_TURBO), + ("--ch-longmod", common_pb2.ModemPreset.MODEM_LONG_MODERATE), + ("--ch-longfast", common_pb2.ModemPreset.MODEM_LONG_FAST), + ("--ch-longturbo", common_pb2.ModemPreset.MODEM_LONG_TURBO), + ("--ch-medslow", common_pb2.ModemPreset.MODEM_MEDIUM_SLOW), + ("--ch-medfast", common_pb2.ModemPreset.MODEM_MEDIUM_FAST), + ("--ch-shortslow", common_pb2.ModemPreset.MODEM_SHORT_SLOW), + ("--ch-shortfast", common_pb2.ModemPreset.MODEM_SHORT_FAST), + ("--ch-shortturbo", common_pb2.ModemPreset.MODEM_SHORT_TURBO), ] @@ -280,8 +278,8 @@ def test_smokevirt_ch_preset(firmware_node, flag, expected_preset): def check(iface): actual = iface.localNode.localConfig.lora.modem_preset assert actual == expected_preset, ( - f"modem_preset: {config_pb2.Config.LoRaConfig.ModemPreset.Name(actual)} " - f"!= {config_pb2.Config.LoRaConfig.ModemPreset.Name(expected_preset)}" + f"modem_preset: {common_pb2.ModemPreset.Name(actual)} " + f"!= {common_pb2.ModemPreset.Name(expected_preset)}" ) cli_then_verify(firmware_node.port, [flag], check) @@ -333,7 +331,7 @@ def test_smokevirt_ch_add_then_del(firmware_node): def check_added(iface): ch = _channel(iface, 1) assert ch is not None, "secondary channel missing after --ch-add" - assert ch.role == channel_pb2.Channel.Role.SECONDARY, ch + assert channel_role(ch) == "SECONDARY", ch assert ch.settings.name == "testing", ch cli_then_verify( @@ -344,8 +342,8 @@ def check_added(iface): def check_deleted(iface): ch = _channel(iface, 1) - assert ch is None or ch.role == channel_pb2.Channel.Role.DISABLED, ( - f"channel 1 still present after --ch-del: role={ch.role}" + assert ch is None or channel_role(ch) == "DISABLED", ( + f"channel 1 still present after --ch-del: role={channel_role(ch)}" ) cli_then_verify( @@ -365,7 +363,7 @@ def test_smokevirt_ch_enable_disable(firmware_node): time.sleep(PAUSE_AFTER_REBOOT) def check_disabled(iface): - _assert_channel_role(iface, 1, channel_pb2.Channel.Role.DISABLED) + _assert_channel_role(iface, 1, "DISABLED") cli_then_verify( firmware_node.port, @@ -374,7 +372,7 @@ def check_disabled(iface): ) def check_enabled(iface): - _assert_channel_role(iface, 1, channel_pb2.Channel.Role.SECONDARY) + _assert_channel_role(iface, 1, "SECONDARY") cli_then_verify( firmware_node.port, @@ -549,7 +547,7 @@ def test_smokevirt_pos_fields(firmware_node): """--pos-fields should mount the requested bit flags in the position config.""" def check(iface): flags = iface.localNode.localConfig.position.position_flags - PosFlags = config_pb2.Config.PositionConfig.PositionFlags + PosFlags = config_pb2.PositionConfig.PositionFlags for name in _POS_FIELDS_INPUT: assert flags & int(PosFlags.Value(name)), ( f"{name} bit not set in position_flags={flags:#x}" diff --git a/meshtastic/tests/test_tcp_interface.py b/meshtastic/tests/test_tcp_interface.py index f9e03d565..5a780b5cb 100644 --- a/meshtastic/tests/test_tcp_interface.py +++ b/meshtastic/tests/test_tcp_interface.py @@ -15,7 +15,7 @@ def test_TCPInterface(capsys): """Test that we can instantiate a TCPInterface""" with patch("socket.socket") as mock_socket: iface = TCPInterface(hostname="localhost", noProto=True) - iface.localNode.localConfig.lora.CopyFrom(config_pb2.Config.LoRaConfig()) + iface.localNode.localConfig.lora.CopyFrom(config_pb2.LoRaConfig()) iface.myConnect() iface.showInfo() iface.localNode.showInfo() diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index 830311a2e..c1213ec52 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -11,7 +11,7 @@ from hypothesis import given, strategies as st from meshtastic.supported_device import SupportedDevice -from meshtastic.protobuf import mesh_pb2, config_pb2 +from meshtastic.protobuf import api_pb2, common_pb2, config_pb2, packet_pb2, telemetry_pb2, wire_pb2 from meshtastic.util import ( DEFAULT_KEY, Timeout, @@ -21,6 +21,7 @@ channel_hash, convert_mac_addr, eliminate_duplicate_port, + find_bit, findPorts, flags_from_list, flags_to_list, @@ -30,6 +31,7 @@ generate_channel_hash, genPSK256, hexstr, + hw_model_name, ipstr, is_windows11, our_exit, @@ -40,7 +42,9 @@ snake_to_camel, stripnl, support_info, + message_to_dict, message_to_json, + sensor_readings_to_list, to_node_num, Acknowledgment ) @@ -661,8 +665,9 @@ def test_active_ports_on_supported_devices_mac_duplicates_check(mock_platform, m @pytest.mark.unit def test_message_to_json_shows_all(): """Test that message_to_json prints fields that aren't included in data passed in""" - actual = json.loads(message_to_json(mesh_pb2.MyNodeInfo())) - expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0, "deviceId": "", "pioEnv": "", 'firmwareEdition': 'VANILLA', 'nodedbCount': 0 } + actual = json.loads(message_to_json(api_pb2.MyNodeInfo())) + expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0, "deviceId": "", "pioEnv": "", + 'firmwareEdition': 'EDITION_VANILLA', 'nodedbCount': 0 } assert actual == expected @pytest.mark.unit @@ -879,34 +884,29 @@ def test_to_node_num_hypothesis_roundtrip(n): assert to_node_num(str(n)) == n -_EXCLUDED_MODULES = mesh_pb2.ExcludedModules -_POSITION_FLAGS = config_pb2.Config.PositionConfig.PositionFlags -_NETWORK_PROTOCOLS = config_pb2.Config.NetworkConfig.ProtocolFlags +_CAPABILITIES = common_pb2.DeviceMetadata.Capabilities +_POSITION_FLAGS = config_pb2.PositionConfig.PositionFlags +_NETWORK_PROTOCOLS = config_pb2.NetworkConfig.ProtocolFlags @pytest.mark.unit @pytest.mark.parametrize("flag_type,flags,expected", [ - (_EXCLUDED_MODULES, 0, []), - (_EXCLUDED_MODULES, 1, ["MQTT_CONFIG"]), - (_EXCLUDED_MODULES, 3, ["MQTT_CONFIG", "SERIAL_CONFIG"]), - (_EXCLUDED_MODULES, 0x7FFF, [ - "MQTT_CONFIG", "SERIAL_CONFIG", "EXTNOTIF_CONFIG", "STOREFORWARD_CONFIG", - "RANGETEST_CONFIG", "TELEMETRY_CONFIG", "CANNEDMSG_CONFIG", "AUDIO_CONFIG", - "REMOTEHARDWARE_CONFIG", "NEIGHBORINFO_CONFIG", "AMBIENTLIGHTING_CONFIG", - "DETECTIONSENSOR_CONFIG", "PAXCOUNTER_CONFIG", "BLUETOOTH_CONFIG", - "NETWORK_CONFIG", + (_CAPABILITIES, 0, []), + (_CAPABILITIES, 1, ["CAPABILITY_CAN_SHUTDOWN"]), + (_CAPABILITIES, 0x22, ["CAPABILITY_HAS_WIFI", "CAPABILITY_HAS_PKC"]), + (_CAPABILITIES, 0x7F, [ + "CAPABILITY_CAN_SHUTDOWN", "CAPABILITY_HAS_WIFI", "CAPABILITY_HAS_BLUETOOTH", + "CAPABILITY_HAS_ETHERNET", "CAPABILITY_HAS_REMOTE_HARDWARE", "CAPABILITY_HAS_PKC", + "CAPABILITY_HAS_XEDDSA", ]), - (_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)"]), + # bit 7 is beyond every currently-defined Capabilities value, so it + # exercises the unknown-remainder path + (_CAPABILITIES, 0x80, ["UNKNOWN_ADDITIONAL_FLAGS(128)"]), + (_CAPABILITIES, 0x81, ["CAPABILITY_CAN_SHUTDOWN", "UNKNOWN_ADDITIONAL_FLAGS(128)"]), (_POSITION_FLAGS, 0, []), (_POSITION_FLAGS, 0x09, ["ALTITUDE", "DOP"]), - (_POSITION_FLAGS, 0x1FF, [ - "ALTITUDE", "ALTITUDE_MSL", "GEOIDAL_SEPARATION", "DOP", "HVDOP", - "SATINVIEW", "SEQ_NO", "TIMESTAMP", "HEADING", + (_POSITION_FLAGS, 0x36D, [ + "ALTITUDE", "GEOIDAL_SEPARATION", "DOP", "SATINVIEW", "SEQ_NO", "HEADING", "SPEED", ]), ]) def test_flags_to_list(flag_type, flags, expected): @@ -922,11 +922,11 @@ def test_flags_to_list_conservation(flags): Every known bit that is set must appear as a name, and the leftover reported in UNKNOWN_ADDITIONAL_FLAGS(...) must together with the named bits reconstruct the input. """ - for flag_type in (_EXCLUDED_MODULES, _POSITION_FLAGS): + for flag_type in (_CAPABILITIES, _POSITION_FLAGS): known_union = 0 for key in flag_type.keys(): value = flag_type.Value(key) - if key != "EXCLUDED_NONE" and value: + if value: known_union |= value result = flags_to_list(flag_type, flags) @@ -974,3 +974,65 @@ def test_flags_from_list_roundtrip(flags): # but for combinations of known non-zero flags it should return the same set of names. nonzero_flags = {f for f in flags if _POSITION_FLAGS.Value(f)} assert set(decoded) == nonzero_flags + + +@pytest.mark.unit +def test_sensor_readings_to_list(): + """A SensorReadings batch decodes per SCHEMA.md §5: delta-coded columns, a constant column, + a present bitmap that a column's deltas step over, a second sensor's ordinal, and the + twice-differenced sample times.""" + q = telemetry_pb2.SensorReadings + readings = q( + keys=[q.AIR_TEMPERATURE_C_CENTI, q.AIR_PRESSURE_PA | 0x80, (1 << 8) | q.AIR_TEMPERATURE_C_CENTI], + values=[1582, -34, 98801, 2000, 10], + time_deltas=[3600, 40], + present=[0b111, 0b011, 0b100], + ) + assert sensor_readings_to_list(readings, 1000) == [ + {"time": 1000, "AIR_TEMPERATURE_C_CENTI": 15.82, "AIR_PRESSURE_PA": 98801, "AIR_TEMPERATURE_C_CENTI#1": 20.0}, + {"time": 4600, "AIR_TEMPERATURE_C_CENTI": 15.48, "AIR_PRESSURE_PA": 98801}, + {"time": 8240, "AIR_TEMPERATURE_C_CENTI#1": 20.1}, + ] + + +@pytest.mark.unit +def test_sensor_readings_unknown_quantity_is_stepped_over(): + """A quantity this build does not know still consumes its column, so the rest decode.""" + q = telemetry_pb2.SensorReadings + readings = q(keys=[127, q.AIR_PRESSURE_PA], values=[5, 6, 100, 1], time_deltas=[60]) + assert sensor_readings_to_list(readings) == [ + {"time": 0, "QUANTITY_127": 5, "AIR_PRESSURE_PA": 100}, + {"time": 60, "QUANTITY_127": 11, "AIR_PRESSURE_PA": 101}, + ] + + +@pytest.mark.unit +def test_message_to_dict_expands_bitfields(): + """Packed bitfields read as one bool per named bit, nested messages included; only + the set bits unless all_bits.""" + p = packet_pb2.MeshPacket(flags=packet_pb2.MeshPacket.PACKET_WANT_ACK | packet_pb2.MeshPacket.PACKET_PKI_ENCRYPTED) + p.decoded.bitfield = wire_pb2.Data.BITFIELD_WANT_RESPONSE + d = message_to_dict(p) + assert "flags" not in d and d["wantAck"] is True and d["pkiEncrypted"] is True and "viaMqtt" not in d + assert d["decoded"]["wantResponse"] is True and "bitfield" not in d["decoded"] + d = message_to_dict(p, all_bits=True) + assert d["viaMqtt"] is False and d["decoded"]["okToMqtt"] is False + + +@pytest.mark.unit +def test_find_bit_ignores_case_and_underscores(): + """A bit is found by its snake_case name, a camelCase spelling, or one that lost an underscore.""" + lora = config_pb2.LoRaConfig.DESCRIPTOR + flag = ("flags", config_pb2.LoRaConfig.LORA_TX_ENABLED) + assert find_bit(lora, "tx_enabled") == flag + assert find_bit(lora, "txEnabled") == flag + assert find_bit(config_pb2.DisplayConfig.DESCRIPTOR, "use12_h_clock") == ("flags", config_pb2.DisplayConfig.DISPLAY_USE_12H_CLOCK) + assert find_bit(lora, "hop_limit") is None + + +@pytest.mark.unit +def test_hw_model_name(): + """Hardware names come from the bundled registry: (vendor_id << 8) | device_id.""" + assert hw_model_name(0) == "UNSET" + assert hw_model_name(9) == "RAK4631" + assert hw_model_name(0x3FFE) == "0x3ffe" diff --git a/meshtastic/util.py b/meshtastic/util.py index 7faa2d6c0..fed240fcb 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -1,6 +1,8 @@ """Utility functions. """ import base64 +import functools +import json import logging import os import platform @@ -13,7 +15,7 @@ from queue import Queue from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, Union -from google.protobuf.json_format import MessageToJson +from google.protobuf.json_format import MessageToDict, MessageToJson from google.protobuf.message import Message import packaging.version as pkg_version @@ -21,6 +23,8 @@ import serial # type: ignore[import-untyped] import serial.tools.list_ports # type: ignore[import-untyped] +from meshtastic.protobuf import telemetry_pb2 +from meshtastic.protobuf.bitfields import BITFIELDS from meshtastic.supported_device import supported_devices from meshtastic.version import get_active_version @@ -714,10 +718,10 @@ def check_if_newer_version() -> Optional[str]: def message_to_json(message: Message, multiline: bool=False) -> str: """Return protobuf message as JSON. Always print all fields, even when not present in data.""" try: - json = MessageToJson(message, always_print_fields_with_no_presence=True) + text = MessageToJson(message, always_print_fields_with_no_presence=True) except TypeError: - json = MessageToJson(message, including_default_value_fields=True) # type: ignore[call-arg] # pylint: disable=E1123 - return stripnl(json) if not multiline else json + text = MessageToJson(message, including_default_value_fields=True) # type: ignore[call-arg] # pylint: disable=E1123 + return stripnl(text) if not multiline else text def to_node_num(node_id: Union[int, str]) -> int: @@ -775,3 +779,89 @@ def flags_from_list(flag_type, flags: List[str]) -> int: ) result |= flag_type.Value(flag_name) return result + + +def bitfield_bits(desc) -> Dict[str, Tuple[str, int]]: + """The named bits of a message type's packed bitfields: {bit name: (field, mask)}.""" + return BITFIELDS.get(desc.full_name[len(desc.file.package) + 1:], {}) + + +def find_bit(desc, name: str) -> Optional[Tuple[str, int]]: + """Find a named bit of a message type's bitfields, ignoring case and underscores + (so a snake_case or camelCase spelling both match). Returns (field, mask) or None.""" + key = name.replace("_", "").lower() + for bit, where in bitfield_bits(desc).items(): + if bit.replace("_", "").lower() == key: + return where + return None + + +def message_to_dict(message: Message, all_bits: bool=False) -> Dict[str, Any]: + """MessageToDict, with every packed bitfield replaced by one bool per named bit. + Only the bits that are set appear, as MessageToDict leaves out default values, + unless all_bits is True.""" + d = MessageToDict(message) + _expand_bitfields(message, d, all_bits) + return d + + +def _expand_bitfields(message: Message, d: Dict[str, Any], all_bits: bool) -> None: + desc = message.DESCRIPTOR + for bit, (field, mask) in bitfield_bits(desc).items(): + word = getattr(message, field) + d.pop(desc.fields_by_name[field].json_name, None) + if all_bits or word & mask: + d[snake_to_camel(bit)] = bool(word & mask) + for fd, value in message.ListFields(): + sub = d.get(fd.json_name) + if fd.message_type is None or sub is None: + continue + if isinstance(sub, list): + for m, s in zip(value, sub): + _expand_bitfields(m, s, all_bits) + elif isinstance(sub, dict) and isinstance(value, Message): + _expand_bitfields(value, sub, all_bits) + + +@functools.lru_cache(maxsize=None) +def _hw_models() -> Dict[int, str]: + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "protobuf", "hw_devices.json") + with open(path, encoding="utf-8") as f: + return {(d["vendor_id"] << 8) | d["device_id"]: d["slug"] for d in json.load(f)["devices"]} + + +def hw_model_name(hw_model: int) -> str: + """Name a packed hardware model (vendor_id << 8 | device_id) from the hardware registry.""" + if not hw_model: + return "UNSET" + return _hw_models().get(hw_model, f"0x{hw_model:04x}") + + +def sensor_readings_to_list(readings: telemetry_pb2.SensorReadings, time0: int=0) -> List[Dict[str, Any]]: + """Decode a SensorReadings batch into one dict per sample, {"time": t, quantity: value}, + with each value in its quantity's unit. A second sensor of the same quantity is QUANTITY#1.""" + times = [time0] + interval = 0 + for delta in readings.time_deltas: + interval += delta + times.append(times[-1] + interval) + samples: List[Dict[str, Any]] = [{"time": t} for t in times] + values = iter(readings.values) + quantity = telemetry_pb2.SensorReadings.Quantity + for k, key in enumerate(readings.keys): + q = key & 0x7F + name = quantity.Name(q) if q in quantity.values() else f"QUANTITY_{q}" # type: ignore[arg-type] + scale = 100 if name.endswith("_CENTI") else 10 if name.endswith("_DECI") else 1 + if key >> 8: + name += f"#{key >> 8}" + rows = [i for i in range(len(samples)) if not readings.present or readings.present[i] >> k & 1] + if key & 0x80: # constant across the batch: one entry + v = next(values) + for i in rows: + samples[i][name] = v / scale if scale > 1 else v + continue + acc = 0 + for i in rows: + acc += next(values) # the first entry is absolute, the rest are deltas + samples[i][name] = acc / scale if scale > 1 else acc + return samples diff --git a/protobufs b/protobufs index 8017acbb0..3a81613a9 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 8017acbb0828703e980323bee3dd605fb7366058 +Subproject commit 3a81613a9ef0ec8074a9216d16ef61de847e9a0e From b9394c6ff61e8f90615f1de3f313fc9c3cfdc61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 14:22:07 +0200 Subject: [PATCH 02/24] Add hw_model_number; pass MessageToDict options through message_to_dict message_to_dict names bits in snake_case when preserving_proto_field_name is set. --- meshtastic/tests/test_util.py | 5 +++++ meshtastic/util.py | 26 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index c1213ec52..df995bb4f 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -32,6 +32,7 @@ genPSK256, hexstr, hw_model_name, + hw_model_number, ipstr, is_windows11, our_exit, @@ -1017,6 +1018,8 @@ def test_message_to_dict_expands_bitfields(): assert d["decoded"]["wantResponse"] is True and "bitfield" not in d["decoded"] d = message_to_dict(p, all_bits=True) assert d["viaMqtt"] is False and d["decoded"]["okToMqtt"] is False + d = message_to_dict(p, preserving_proto_field_name=True) + assert d["want_ack"] is True and d["decoded"]["want_response"] is True and "flags" not in d @pytest.mark.unit @@ -1036,3 +1039,5 @@ def test_hw_model_name(): assert hw_model_name(0) == "UNSET" assert hw_model_name(9) == "RAK4631" assert hw_model_name(0x3FFE) == "0x3ffe" + assert hw_model_number("RAK4631") == 9 + assert hw_model_number("NOT_A_BOARD") == 0 diff --git a/meshtastic/util.py b/meshtastic/util.py index fed240fcb..590bc5153 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -796,31 +796,32 @@ def find_bit(desc, name: str) -> Optional[Tuple[str, int]]: return None -def message_to_dict(message: Message, all_bits: bool=False) -> Dict[str, Any]: +def message_to_dict(message: Message, all_bits: bool=False, **kwargs: Any) -> Dict[str, Any]: """MessageToDict, with every packed bitfield replaced by one bool per named bit. Only the bits that are set appear, as MessageToDict leaves out default values, - unless all_bits is True.""" - d = MessageToDict(message) - _expand_bitfields(message, d, all_bits) + unless all_bits is True. Other keyword arguments go to MessageToDict; with + preserving_proto_field_name the bits are named in snake_case too.""" + d = MessageToDict(message, **kwargs) + _expand_bitfields(message, d, all_bits, kwargs.get("preserving_proto_field_name", False)) return d -def _expand_bitfields(message: Message, d: Dict[str, Any], all_bits: bool) -> None: +def _expand_bitfields(message: Message, d: Dict[str, Any], all_bits: bool, snake: bool) -> None: desc = message.DESCRIPTOR for bit, (field, mask) in bitfield_bits(desc).items(): word = getattr(message, field) - d.pop(desc.fields_by_name[field].json_name, None) + d.pop(field if snake else desc.fields_by_name[field].json_name, None) if all_bits or word & mask: - d[snake_to_camel(bit)] = bool(word & mask) + d[bit if snake else snake_to_camel(bit)] = bool(word & mask) for fd, value in message.ListFields(): - sub = d.get(fd.json_name) + sub = d.get(fd.name if snake else fd.json_name) if fd.message_type is None or sub is None: continue if isinstance(sub, list): for m, s in zip(value, sub): - _expand_bitfields(m, s, all_bits) + _expand_bitfields(m, s, all_bits, snake) elif isinstance(sub, dict) and isinstance(value, Message): - _expand_bitfields(value, sub, all_bits) + _expand_bitfields(value, sub, all_bits, snake) @functools.lru_cache(maxsize=None) @@ -837,6 +838,11 @@ def hw_model_name(hw_model: int) -> str: return _hw_models().get(hw_model, f"0x{hw_model:04x}") +def hw_model_number(name: str) -> int: + """The packed hardware model a registry slug names (e.g. "HELTEC_V3"), or 0 when unknown.""" + return next((n for n, slug in _hw_models().items() if slug == name), 0) + + def sensor_readings_to_list(readings: telemetry_pb2.SensorReadings, time0: int=0) -> List[Dict[str, Any]]: """Decode a SensorReadings batch into one dict per sample, {"time": t, quantity: value}, with each value in its quantity's unit. A second sensor of the same quantity is QUANTITY#1.""" From a320423470a68f8196bcfe4dd694ac52f78bbf4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 14:59:20 +0200 Subject: [PATCH 03/24] Restore --reboot-ota on the 3.0 ota_request 3.0 dropped reboot_ota_seconds; the node reboots into its OTA loader on ota_request with the firmware SHA-256. --reboot-ota now takes the firmware file and asks for the BLE loader; Node.rebootOTA takes the hash and works for local and remote nodes. --- meshtastic/__main__.py | 22 ++++++++++++++++++---- meshtastic/node.py | 20 ++++++++++++++++++++ meshtastic/tests/test_main.py | 31 +++++++++++++++++++++++++++++++ meshtastic/tests/test_node.py | 19 +++++++++++++++++++ 4 files changed, 88 insertions(+), 4 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 8ea016b15..f933ffd42 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -499,6 +499,12 @@ def onConnected(interface): waitForAckNak = True interface.getNode(args.dest, False, **getNode_kwargs).reboot() + if args.reboot_ota: + closeNow = True + waitForAckNak = True + ota_hash = meshtastic.ota._file_sha256(args.reboot_ota).digest() # pylint: disable=W0212 + interface.getNode(args.dest, False, **getNode_kwargs).rebootOTA(ota_hash) + if args.ota_update: closeNow = True waitForAckNak = True @@ -1591,14 +1597,14 @@ def common(): meshtastic.util.our_exit("ERROR: Ham radio callsign cannot be empty or contain only whitespace characters") # Early validation for OTA firmware file before attempting device connection - if hasattr(args, 'ota_update') and args.ota_update is not None: - if not os.path.isfile(args.ota_update): - meshtastic.util.our_exit(f"Error: OTA firmware file not found: {args.ota_update}", 1) + for ota_file in (getattr(args, "ota_update", None), getattr(args, "reboot_ota", None)): + if ota_file is not None and not os.path.isfile(ota_file): + meshtastic.util.our_exit(f"Error: OTA firmware file not found: {ota_file}", 1) # OTA (WiFi/BLE) only needs the local node to send the admin request and then # streams the firmware directly; it never reads the node DB. Skip fetching it so a # large node DB dump can't stall/close the connection before the OTA request lands. - if getattr(args, "ota_update", None): + if getattr(args, "ota_update", None) or getattr(args, "reboot_ota", None): args.no_nodes = True if have_powermon: @@ -2292,6 +2298,14 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars "--reboot", help="Tell the destination node to reboot", action="store_true" ) + group.add_argument( + "--reboot-ota", + help="Tell the destination node to reboot into its BLE OTA loader, ready for the given " + "firmware file (ESP32). The node checks the update against the file's SHA-256.", + metavar="FIRMWARE_FILE", + action="store", + ) + group.add_argument( "--ota-update", help="Perform an OTA update on the local node (ESP32, firmware version >=2.7.18, WiFi/TCP only for now). " diff --git a/meshtastic/node.py b/meshtastic/node.py index b99e6561f..8a2494d62 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -684,6 +684,26 @@ def commitSettingsTransaction(self): onResponse = self.onAckNak return self._sendAdmin(p, onResponse=onResponse) + def rebootOTA( + self, + ota_file_hash: bytes, + ota_mode: admin_pb2.OTAMode.ValueType = admin_pb2.OTAMode.OTA_BLE, + ): + """Tell the node to reboot into its OTA loader, ready for the firmware with this + SHA-256 (ESP32). BLE by default; the node refuses a request without the hash.""" + self.ensureSessionKey() + p = admin_pb2.AdminMessage() + p.ota_request.reboot_ota_mode = ota_mode + p.ota_request.ota_hash = ota_file_hash + logger.info(f"Telling node to reboot into {admin_pb2.OTAMode.Name(ota_mode)} mode") + + # If sending to a remote node, wait for ACK/NAK + if self == self.iface.localNode: + onResponse = None + else: + onResponse = self.onAckNak + return self._sendAdmin(p, onResponse=onResponse) + def startOTA( self, ota_mode: admin_pb2.OTAMode.ValueType, diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 114216cc3..fc38d6ea3 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -1,6 +1,7 @@ """Meshtastic unit tests for __main__.py""" # pylint: disable=C0302,W0613,R0917 +import hashlib import logging import os import platform @@ -3745,6 +3746,36 @@ def test_main_set_ham_empty_string(capsys): # OTA-related tests +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_reboot_ota_sends_firmware_hash(tmp_path): + """--reboot-ota FILE asks the node for its BLE OTA loader with the file's SHA-256""" + firmware = tmp_path / "firmware.bin" + firmware.write_bytes(b"firmware image") + sys.argv = ["", "--reboot-ota", str(firmware)] + mt_config.args = sys.argv + + mocked_node = MagicMock(autospec=Node) + iface = MagicMock(autospec=SerialInterface) + iface.getNode.return_value = mocked_node + with patch("meshtastic.serial_interface.SerialInterface", return_value=iface): + main() + mocked_node.rebootOTA.assert_called_once_with(hashlib.sha256(b"firmware image").digest()) + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_reboot_ota_file_not_found(capsys): + """--reboot-ota refuses a firmware file that does not exist before connecting""" + sys.argv = ["", "--reboot-ota", "/nonexistent/firmware.bin"] + mt_config.args = sys.argv + with pytest.raises(SystemExit) as pytest_wrapped_e: + main() + assert pytest_wrapped_e.value.code == 1 + out, _ = capsys.readouterr() + assert "OTA firmware file not found" in out + + @pytest.mark.unit @pytest.mark.usefixtures("reset_mt_config") def test_main_ota_update_file_not_found(capsys): diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 26eacd920..308d31386 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1917,6 +1917,25 @@ def test_start_ota_local_node(): mock_send_admin.assert_called_once_with(amesg) +@pytest.mark.unit +def test_reboot_ota_sends_ota_request(): + """rebootOTA asks for the BLE OTA loader with the firmware hash, to local and remote nodes alike""" + iface = MagicMock(autospec=MeshInterface) + local_node = Node(iface, 1234567890, noProto=True) + remote_node = Node(iface, 9876543210, noProto=True) + iface.localNode = local_node + test_hash = bytes(range(32)) + + for node, on_response in ((local_node, None), (remote_node, remote_node.onAckNak)): + amesg = admin_pb2.AdminMessage() + with patch("meshtastic.admin_pb2.AdminMessage", return_value=amesg): + with patch.object(node, "_sendAdmin") as mock_send_admin: + node.rebootOTA(test_hash) + assert amesg.ota_request.reboot_ota_mode == admin_pb2.OTAMode.OTA_BLE + assert amesg.ota_request.ota_hash == test_hash + mock_send_admin.assert_called_once_with(amesg, onResponse=on_response) + + @pytest.mark.unit def test_start_ota_remote_node_raises_error(): """Test startOTA on remote node raises ValueError""" From 8af25a4d7f93311ead5a25358c38225d4275223a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 15:54:20 +0200 Subject: [PATCH 04/24] Update protobufs for the 3.0 region registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - protobufs bf6f310: registry in hertz, slot plan fields, UA_433 removed and RegionCode renumbered, EU_874 and EU_917 data. - Bundle regions.json and modem_presets.json next to hw_devices.json. Signed-off-by: Thomas Göttgens --- bin/regen-protobufs.sh | 4 +- meshtastic/protobuf/api_pb2.py | 6 +- meshtastic/protobuf/common_pb2.py | 30 +- meshtastic/protobuf/common_pb2.pyi | 96 ++- meshtastic/protobuf/config_pb2.pyi | 6 +- .../protobuf/modem_preset_registry_pb2.py | 10 +- .../protobuf/modem_preset_registry_pb2.pyi | 64 +- meshtastic/protobuf/modem_presets.json | 183 +++++ meshtastic/protobuf/region_registry_pb2.py | 22 +- meshtastic/protobuf/region_registry_pb2.pyi | 133 +++- meshtastic/protobuf/regions.json | 657 ++++++++++++++++++ protobufs | 2 +- 12 files changed, 1074 insertions(+), 139 deletions(-) create mode 100644 meshtastic/protobuf/modem_presets.json create mode 100644 meshtastic/protobuf/regions.json diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh index 4e2f8503b..c7f33fbb1 100755 --- a/bin/regen-protobufs.sh +++ b/bin/regen-protobufs.sh @@ -73,8 +73,8 @@ done ./nanopb-0.4.8/generator-bin/protoc -I=./protobufs --include_source_info "--descriptor_set_out=${TMPDIR}/descriptor.binpb" ./protobufs/meshtastic/*.proto python3 ./bin/gen_bitfields.py "${TMPDIR}/descriptor.binpb" "${OUTDIR}/meshtastic/protobuf/bitfields.py" -# Hardware model names are registry data, not schema -cp ./protobufs/registry/generated/hw_devices.json "${OUTDIR}/meshtastic/protobuf/" +# Hardware model names, regions and modem presets are registry data, not schema +cp ./protobufs/registry/generated/hw_devices.json ./protobufs/registry/generated/regions.json ./protobufs/registry/generated/modem_presets.json "${OUTDIR}/meshtastic/protobuf/" # Change "from meshtastic.protobuf import" to "from . import" $SEDCMD 's/^from meshtastic.protobuf import/from . import/' "${OUTDIR}"/meshtastic/protobuf/*pb2*.py[i] diff --git a/meshtastic/protobuf/api_pb2.py b/meshtastic/protobuf/api_pb2.py index 315ca5d04..c1bc99e7f 100644 --- a/meshtastic/protobuf/api_pb2.py +++ b/meshtastic/protobuf/api_pb2.py @@ -25,7 +25,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/protobuf/api.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a#meshtastic/protobuf/discovery.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a meshtastic/protobuf/packet.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/xmodem.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdf\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x11\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\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38 \x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x34\n\x0brecord_tier\x18\n \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\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\x02 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x03 \x01(\r\x12\x18\n\tdevice_id\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12\x16\n\x07pio_env\x18\x05 \x01(\tB\x05\x92?\x02\x08(\x12\x45\n\x10\x66irmware_edition\x18\x06 \x01(\x0e\x32$.meshtastic.protobuf.FirmwareEditionB\x05\x92?\x02\x38\x08\x12\x1b\n\x0cnodedb_count\x18\x07 \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\"\xe5\x01\n\x0bQueueStatus\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.QueueStatus.Result\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(\x07\"Y\n\x06Result\x12\r\n\tRESULT_OK\x10\x00\x12\x12\n\x0eRESULT_UNKNOWN\x10\x01\x12\x17\n\x13RESULT_NO_INTERFACE\x10\x02\x12\x13\n\x0fRESULT_DISABLED\x10\x03\"\x93\x08\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\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\x41\n\rmodule_config\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\x0cqueue_status\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x34\n\rxmodem_packet\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x32\n\tfile_info\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x46\n\x13\x63lient_notification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12?\n\x10\x64\x65vice_ui_config\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\"\xae\x04\n\x0eLockdownStatus\x12?\n\x05state\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.LockdownStatus.StateB\x05\x92?\x02\x38\x08\x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x04 \x01(\r\"\x86\x03\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x13\n\x0fNEEDS_PROVISION\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\n\n\x06LOCKED\x10\x10\x12\x15\n\x11LOCKED_NEEDS_AUTH\x10\x11\x12\x18\n\x14LOCKED_TOKEN_MISSING\x10\x12\x12\x18\n\x14LOCKED_TOKEN_EXPIRED\x10\x13\x12\x1b\n\x17LOCKED_TOKEN_BOOTS_ZERO\x10\x14\x12\x1a\n\x16LOCKED_TOKEN_HMAC_FAIL\x10\x15\x12\x19\n\x15LOCKED_TOKEN_DEK_FAIL\x10\x16\x12\x1b\n\x17LOCKED_TOKEN_WRONG_SIZE\x10\x17\x12\x1a\n\x16LOCKED_TOKEN_BAD_MAGIC\x10\x18\x12#\n\x1fLOCKED_SESSION_BUDGET_EXHAUSTED\x10\x19\x12\x19\n\x15LOCKED_DISABLE_FAILED\x10\x1a\"\x80\x01\n\x0fLoRaPresetGroup\x12\x15\n\rlegal_presets\x18\x01 \x01(\r\x12?\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"r\n\x13LoRaRegionPresetMap\x12;\n\x06groups\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.LoRaPresetGroupB\x05\x92?\x02\x10\x08\x12\x1e\n\rregion_groups\x18\x02 \x03(\rB\x07\x92?\x04\x10%8\x08\"\xbc\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x02 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x03 \x01(\x08H\x00\x12\x34\n\rxmodem_packet\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x05 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"\xfd\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\x07H\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\x05 \x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\x07 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x08 \x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\t \x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x12\x43\n\x12node_num_collision\x18\n \x01(\x0b\x32%.meshtastic.protobuf.NodeNumCollisionH\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\x19\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\x19\"\x7f\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08\x19\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\"$\n\x10NodeNumCollision\x12\x10\n\x08node_num\x18\x01 \x01(\x07\"9\n\x08\x46ileInfo\x12\x19\n\tfile_name\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x02\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\rB_\n\x14org.meshtastic.protoB\tApiProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/protobuf/api.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a#meshtastic/protobuf/discovery.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a meshtastic/protobuf/packet.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/xmodem.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdf\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x11\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\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38 \x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x34\n\x0brecord_tier\x18\n \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\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\x02 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x03 \x01(\r\x12\x18\n\tdevice_id\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12\x16\n\x07pio_env\x18\x05 \x01(\tB\x05\x92?\x02\x08(\x12\x45\n\x10\x66irmware_edition\x18\x06 \x01(\x0e\x32$.meshtastic.protobuf.FirmwareEditionB\x05\x92?\x02\x38\x08\x12\x1b\n\x0cnodedb_count\x18\x07 \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\"\xe5\x01\n\x0bQueueStatus\x12\x37\n\x06result\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.QueueStatus.Result\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(\x07\"Y\n\x06Result\x12\r\n\tRESULT_OK\x10\x00\x12\x12\n\x0eRESULT_UNKNOWN\x10\x01\x12\x17\n\x13RESULT_NO_INTERFACE\x10\x02\x12\x13\n\x0fRESULT_DISABLED\x10\x03\"\x93\x08\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\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\x41\n\rmodule_config\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\x0cqueue_status\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x34\n\rxmodem_packet\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x32\n\tfile_info\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x46\n\x13\x63lient_notification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12?\n\x10\x64\x65vice_ui_config\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\"\xae\x04\n\x0eLockdownStatus\x12?\n\x05state\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.LockdownStatus.StateB\x05\x92?\x02\x38\x08\x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x04 \x01(\r\"\x86\x03\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x13\n\x0fNEEDS_PROVISION\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\n\n\x06LOCKED\x10\x10\x12\x15\n\x11LOCKED_NEEDS_AUTH\x10\x11\x12\x18\n\x14LOCKED_TOKEN_MISSING\x10\x12\x12\x18\n\x14LOCKED_TOKEN_EXPIRED\x10\x13\x12\x1b\n\x17LOCKED_TOKEN_BOOTS_ZERO\x10\x14\x12\x1a\n\x16LOCKED_TOKEN_HMAC_FAIL\x10\x15\x12\x19\n\x15LOCKED_TOKEN_DEK_FAIL\x10\x16\x12\x1b\n\x17LOCKED_TOKEN_WRONG_SIZE\x10\x17\x12\x1a\n\x16LOCKED_TOKEN_BAD_MAGIC\x10\x18\x12#\n\x1fLOCKED_SESSION_BUDGET_EXHAUSTED\x10\x19\x12\x19\n\x15LOCKED_DISABLE_FAILED\x10\x1a\"\x80\x01\n\x0fLoRaPresetGroup\x12\x15\n\rlegal_presets\x18\x01 \x01(\r\x12?\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"r\n\x13LoRaRegionPresetMap\x12;\n\x06groups\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.LoRaPresetGroupB\x05\x92?\x02\x10\t\x12\x1e\n\rregion_groups\x18\x02 \x03(\rB\x07\x92?\x04\x10$8\x08\"\xbc\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x02 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x03 \x01(\x08H\x00\x12\x34\n\rxmodem_packet\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12P\n\x19mqtt_client_proxy_message\x18\x05 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"\xfd\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\x07H\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\x05 \x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\x07 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x08 \x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\t \x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x12\x43\n\x12node_num_collision\x18\n \x01(\x0b\x32%.meshtastic.protobuf.NodeNumCollisionH\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\x19\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\x19\"\x7f\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08\x19\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\"$\n\x10NodeNumCollision\x12\x10\n\x08node_num\x18\x01 \x01(\x07\"9\n\x08\x46ileInfo\x12\x19\n\tfile_name\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x02\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\rB_\n\x14org.meshtastic.protoB\tApiProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -62,9 +62,9 @@ _globals['_LORAPRESETGROUP'].fields_by_name['default_preset']._options = None _globals['_LORAPRESETGROUP'].fields_by_name['default_preset']._serialized_options = b'\222?\0028\010' _globals['_LORAREGIONPRESETMAP'].fields_by_name['groups']._options = None - _globals['_LORAREGIONPRESETMAP'].fields_by_name['groups']._serialized_options = b'\222?\002\020\010' + _globals['_LORAREGIONPRESETMAP'].fields_by_name['groups']._serialized_options = b'\222?\002\020\t' _globals['_LORAREGIONPRESETMAP'].fields_by_name['region_groups']._options = None - _globals['_LORAREGIONPRESETMAP'].fields_by_name['region_groups']._serialized_options = b'\222?\004\020%8\010' + _globals['_LORAREGIONPRESETMAP'].fields_by_name['region_groups']._serialized_options = b'\222?\004\020$8\010' _globals['_CLIENTNOTIFICATION'].fields_by_name['message']._options = None _globals['_CLIENTNOTIFICATION'].fields_by_name['message']._serialized_options = b'\222?\003\010\220\003' _globals['_KEYVERIFICATIONNUMBERINFORM'].fields_by_name['remote_longname']._options = None diff --git a/meshtastic/protobuf/common_pb2.py b/meshtastic/protobuf/common_pb2.py index 1c4c5445c..5ab6528aa 100644 --- a/meshtastic/protobuf/common_pb2.py +++ b/meshtastic/protobuf/common_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/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf4\t\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xb0\x01\n\x06ROUTER\x10\x02\x1a\xa3\x01\xca\xf3\x18\x9e\x01:\x06RouterB\x93\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12H\n\x07TRACKER\x10\x03\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x04\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x05\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x06\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x89\x01\n\x0eLOST_AND_FOUND\x10\x07\x1au\xca\xf3\x18q:\x0eLost and FoundB_Broadcasts location as message to default channel regularly for to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\x08\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\t\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\x85\x01\n\x0b\x43LIENT_BASE\x10\n\x1at\xca\xf3\x18p:\x0b\x43lient BaseBaUsed for rooftop nodes to distribute messages more widely from multiple nearby client mute nodes.*\xe5\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12\'\n\rREGION_UA_433\x10\x0e\x1a\x14\xca\xf3\x18\x10:\x0eUkraine 433MHz\x12(\n\rREGION_MY_433\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x11\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x14\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x15\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x17\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x18\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x19\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1b\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1e\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1f\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10 \x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10#\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10$\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xa1\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08*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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf4\t\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xb0\x01\n\x06ROUTER\x10\x02\x1a\xa3\x01\xca\xf3\x18\x9e\x01:\x06RouterB\x93\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12H\n\x07TRACKER\x10\x03\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x04\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x05\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x06\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x89\x01\n\x0eLOST_AND_FOUND\x10\x07\x1au\xca\xf3\x18q:\x0eLost and FoundB_Broadcasts location as message to default channel regularly for to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\x08\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\t\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\x85\x01\n\x0b\x43LIENT_BASE\x10\n\x1at\xca\xf3\x18p:\x0b\x43lient BaseBaUsed for rooftop nodes to distribute messages more widely from multiple nearby client mute nodes.*\xbc\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12(\n\rREGION_MY_433\x10\x0e\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x10\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x11\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x14\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x15\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x17\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x18\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x19\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1b\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1e\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10\x1f\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10 \x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10#\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xa1\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08*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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -74,8 +74,6 @@ _globals['_REGIONCODE'].values_by_name["REGION_TH"]._serialized_options = b'\312\363\030\n:\010Thailand' _globals['_REGIONCODE'].values_by_name["REGION_LORA_24"]._options = None _globals['_REGIONCODE'].values_by_name["REGION_LORA_24"]._serialized_options = b'\312\363\030\t:\0072.4 Ghz' - _globals['_REGIONCODE'].values_by_name["REGION_UA_433"]._options = None - _globals['_REGIONCODE'].values_by_name["REGION_UA_433"]._serialized_options = b'\312\363\030\020:\016Ukraine 433MHz' _globals['_REGIONCODE'].values_by_name["REGION_MY_433"]._options = None _globals['_REGIONCODE'].values_by_name["REGION_MY_433"]._serialized_options = b'\312\363\030\021:\017Malaysia 433MHz' _globals['_REGIONCODE'].values_by_name["REGION_MY_919"]._options = None @@ -175,19 +173,19 @@ _globals['_ROLE']._serialized_start=599 _globals['_ROLE']._serialized_end=1867 _globals['_REGIONCODE']._serialized_start=1870 - _globals['_REGIONCODE']._serialized_end=3507 - _globals['_INPUTBROKEREVENT']._serialized_start=3510 - _globals['_INPUTBROKEREVENT']._serialized_end=4134 - _globals['_MODEMPRESET']._serialized_start=4137 - _globals['_MODEMPRESET']._serialized_end=4862 - _globals['_NODEFLAGS']._serialized_start=4865 - _globals['_NODEFLAGS']._serialized_end=5282 - _globals['_LOCSOURCE']._serialized_start=5284 - _globals['_LOCSOURCE']._serialized_end=5362 - _globals['_ERRORCODE']._serialized_start=5365 - _globals['_ERRORCODE']._serialized_end=5791 - _globals['_FIRMWAREEDITION']._serialized_start=5794 - _globals['_FIRMWAREEDITION']._serialized_end=6027 + _globals['_REGIONCODE']._serialized_end=3466 + _globals['_INPUTBROKEREVENT']._serialized_start=3469 + _globals['_INPUTBROKEREVENT']._serialized_end=4093 + _globals['_MODEMPRESET']._serialized_start=4096 + _globals['_MODEMPRESET']._serialized_end=4821 + _globals['_NODEFLAGS']._serialized_start=4824 + _globals['_NODEFLAGS']._serialized_end=5241 + _globals['_LOCSOURCE']._serialized_start=5243 + _globals['_LOCSOURCE']._serialized_end=5321 + _globals['_ERRORCODE']._serialized_start=5324 + _globals['_ERRORCODE']._serialized_end=5750 + _globals['_FIRMWAREEDITION']._serialized_start=5753 + _globals['_FIRMWAREEDITION']._serialized_end=5986 _globals['_DEVICEMETADATA']._serialized_start=134 _globals['_DEVICEMETADATA']._serialized_end=596 _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_start=361 diff --git a/meshtastic/protobuf/common_pb2.pyi b/meshtastic/protobuf/common_pb2.pyi index 363639226..4e442909c 100644 --- a/meshtastic/protobuf/common_pb2.pyi +++ b/meshtastic/protobuf/common_pb2.pyi @@ -213,57 +213,55 @@ class _RegionCodeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_RegionCode """Thailand""" REGION_LORA_24: _RegionCode.ValueType # 13 """2.4 GHz wide LoRa (worldwide)""" - REGION_UA_433: _RegionCode.ValueType # 14 - """Ukraine 433 MHz band""" - REGION_MY_433: _RegionCode.ValueType # 15 + REGION_MY_433: _RegionCode.ValueType # 14 """Malaysia 433 MHz band""" - REGION_MY_919: _RegionCode.ValueType # 16 + REGION_MY_919: _RegionCode.ValueType # 15 """Malaysia 919 MHz band""" - REGION_SG_923: _RegionCode.ValueType # 17 + REGION_SG_923: _RegionCode.ValueType # 16 """Singapore 923 MHz band""" - REGION_PH_433: _RegionCode.ValueType # 18 + REGION_PH_433: _RegionCode.ValueType # 17 """Philippines 433 MHz band""" - REGION_PH_868: _RegionCode.ValueType # 19 + REGION_PH_868: _RegionCode.ValueType # 18 """Philippines 868 MHz band""" - REGION_PH_915: _RegionCode.ValueType # 20 + REGION_PH_915: _RegionCode.ValueType # 19 """Philippines 915 MHz band""" - REGION_ANZ_433: _RegionCode.ValueType # 21 + REGION_ANZ_433: _RegionCode.ValueType # 20 """Australia / New Zealand 433 MHz band""" - REGION_KZ_433: _RegionCode.ValueType # 22 + REGION_KZ_433: _RegionCode.ValueType # 21 """Kazakhstan 433 MHz band""" - REGION_KZ_863: _RegionCode.ValueType # 23 + REGION_KZ_863: _RegionCode.ValueType # 22 """Kazakhstan 863 MHz band""" - REGION_NP_865: _RegionCode.ValueType # 24 + REGION_NP_865: _RegionCode.ValueType # 23 """Nepal 865 MHz band""" - REGION_BR_902: _RegionCode.ValueType # 25 + REGION_BR_902: _RegionCode.ValueType # 24 """Brazil 902 MHz band""" - REGION_ITU1_2M: _RegionCode.ValueType # 26 + REGION_ITU1_2M: _RegionCode.ValueType # 25 """ITU Region 1 Amateur Radio 2m band (144-146 MHz)""" - REGION_ITU2_2M: _RegionCode.ValueType # 27 + REGION_ITU2_2M: _RegionCode.ValueType # 26 """ITU Region 2 Amateur Radio 2m band (144-148 MHz)""" - REGION_EU_866: _RegionCode.ValueType # 28 + REGION_EU_866: _RegionCode.ValueType # 27 """EU 866 MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" - REGION_EU_874: _RegionCode.ValueType # 29 + REGION_EU_874: _RegionCode.ValueType # 28 """EU 874 MHz band (Band no. 1 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" - REGION_EU_917: _RegionCode.ValueType # 30 + REGION_EU_917: _RegionCode.ValueType # 29 """EU 917 MHz band (Band no. 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" - REGION_EU_N_868: _RegionCode.ValueType # 31 + REGION_EU_N_868: _RegionCode.ValueType # 30 """EU 868 MHz band, with narrow presets""" - REGION_ITU3_2M: _RegionCode.ValueType # 32 + REGION_ITU3_2M: _RegionCode.ValueType # 31 """ITU Region 3 Amateur Radio 2m band (144-148 MHz)""" - REGION_ITU1_70CM: _RegionCode.ValueType # 33 + REGION_ITU1_70CM: _RegionCode.ValueType # 32 """ITU Region 1 Amateur Radio 70cm band (430-440 MHz)""" - REGION_ITU2_70CM: _RegionCode.ValueType # 34 + REGION_ITU2_70CM: _RegionCode.ValueType # 33 """ 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! """ - REGION_ITU3_70CM: _RegionCode.ValueType # 35 + REGION_ITU3_70CM: _RegionCode.ValueType # 34 """ ITU Region 3 Amateur Radio 70cm band (430-450 MHz) Note: Some countries do not allocate 440-450 MHz. Check local law! """ - REGION_ITU2_125CM: _RegionCode.ValueType # 36 + REGION_ITU2_125CM: _RegionCode.ValueType # 35 """ 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! @@ -273,8 +271,8 @@ class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): """ Regulatory region codes for LoRa radio configuration - Ukrainian law is harmonised with the EU, so a Ukrainian node uses REGION_EU_868 and - there is no separate 868 MHz Ukrainian region. + Ukrainian law is harmonised with the EU, so a Ukrainian node uses REGION_EU_868 or + REGION_EU_433 and there is no separate Ukrainian region. """ REGION_UNSET: RegionCode.ValueType # 0 @@ -305,57 +303,55 @@ REGION_TH: RegionCode.ValueType # 12 """Thailand""" REGION_LORA_24: RegionCode.ValueType # 13 """2.4 GHz wide LoRa (worldwide)""" -REGION_UA_433: RegionCode.ValueType # 14 -"""Ukraine 433 MHz band""" -REGION_MY_433: RegionCode.ValueType # 15 +REGION_MY_433: RegionCode.ValueType # 14 """Malaysia 433 MHz band""" -REGION_MY_919: RegionCode.ValueType # 16 +REGION_MY_919: RegionCode.ValueType # 15 """Malaysia 919 MHz band""" -REGION_SG_923: RegionCode.ValueType # 17 +REGION_SG_923: RegionCode.ValueType # 16 """Singapore 923 MHz band""" -REGION_PH_433: RegionCode.ValueType # 18 +REGION_PH_433: RegionCode.ValueType # 17 """Philippines 433 MHz band""" -REGION_PH_868: RegionCode.ValueType # 19 +REGION_PH_868: RegionCode.ValueType # 18 """Philippines 868 MHz band""" -REGION_PH_915: RegionCode.ValueType # 20 +REGION_PH_915: RegionCode.ValueType # 19 """Philippines 915 MHz band""" -REGION_ANZ_433: RegionCode.ValueType # 21 +REGION_ANZ_433: RegionCode.ValueType # 20 """Australia / New Zealand 433 MHz band""" -REGION_KZ_433: RegionCode.ValueType # 22 +REGION_KZ_433: RegionCode.ValueType # 21 """Kazakhstan 433 MHz band""" -REGION_KZ_863: RegionCode.ValueType # 23 +REGION_KZ_863: RegionCode.ValueType # 22 """Kazakhstan 863 MHz band""" -REGION_NP_865: RegionCode.ValueType # 24 +REGION_NP_865: RegionCode.ValueType # 23 """Nepal 865 MHz band""" -REGION_BR_902: RegionCode.ValueType # 25 +REGION_BR_902: RegionCode.ValueType # 24 """Brazil 902 MHz band""" -REGION_ITU1_2M: RegionCode.ValueType # 26 +REGION_ITU1_2M: RegionCode.ValueType # 25 """ITU Region 1 Amateur Radio 2m band (144-146 MHz)""" -REGION_ITU2_2M: RegionCode.ValueType # 27 +REGION_ITU2_2M: RegionCode.ValueType # 26 """ITU Region 2 Amateur Radio 2m band (144-148 MHz)""" -REGION_EU_866: RegionCode.ValueType # 28 +REGION_EU_866: RegionCode.ValueType # 27 """EU 866 MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" -REGION_EU_874: RegionCode.ValueType # 29 +REGION_EU_874: RegionCode.ValueType # 28 """EU 874 MHz band (Band no. 1 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" -REGION_EU_917: RegionCode.ValueType # 30 +REGION_EU_917: RegionCode.ValueType # 29 """EU 917 MHz band (Band no. 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)""" -REGION_EU_N_868: RegionCode.ValueType # 31 +REGION_EU_N_868: RegionCode.ValueType # 30 """EU 868 MHz band, with narrow presets""" -REGION_ITU3_2M: RegionCode.ValueType # 32 +REGION_ITU3_2M: RegionCode.ValueType # 31 """ITU Region 3 Amateur Radio 2m band (144-148 MHz)""" -REGION_ITU1_70CM: RegionCode.ValueType # 33 +REGION_ITU1_70CM: RegionCode.ValueType # 32 """ITU Region 1 Amateur Radio 70cm band (430-440 MHz)""" -REGION_ITU2_70CM: RegionCode.ValueType # 34 +REGION_ITU2_70CM: RegionCode.ValueType # 33 """ 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! """ -REGION_ITU3_70CM: RegionCode.ValueType # 35 +REGION_ITU3_70CM: RegionCode.ValueType # 34 """ ITU Region 3 Amateur Radio 70cm band (430-450 MHz) Note: Some countries do not allocate 440-450 MHz. Check local law! """ -REGION_ITU2_125CM: RegionCode.ValueType # 36 +REGION_ITU2_125CM: RegionCode.ValueType # 35 """ 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! diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index 55818d1e1..6dc6bcdc5 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -1357,9 +1357,9 @@ class LoRaConfig(_message.Message): the modem preset's name from ModemPresetInfo.name. An empty primary channel name means the preset name, so the two agree on a default channel. - slot_count follows from the region's frequency range and the profile's - spacing_khz and padding_khz in the region registry, so it depends on region and - preset, not on this field. Most users never see this concept. + slot_count is the total of the region's slot plan (SCHEMA.md section 6) for the + bandwidth in use, so it depends on region and preset, not on this field. Most users + never see this concept. """ override_frequency: _builtins.int """ diff --git a/meshtastic/protobuf/modem_preset_registry_pb2.py b/meshtastic/protobuf/modem_preset_registry_pb2.py index 178b035ae..6be0045cb 100644 --- a/meshtastic/protobuf/modem_preset_registry_pb2.py +++ b/meshtastic/protobuf/modem_preset_registry_pb2.py @@ -15,7 +15,7 @@ from meshtastic.protobuf import common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/meshtastic/protobuf/modem_preset_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\xb0\x01\n\x0fModemPresetInfo\x12\x30\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rbandwidth_khz\x18\x03 \x01(\r\x12\x1a\n\x12wide_bandwidth_khz\x18\x04 \x01(\r\x12\x15\n\rspread_factor\x18\x05 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x06 \x01(\r\"^\n\x13ModemPresetRegistry\x12\x35\n\x07presets\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetInfo\x12\x10\n\x08revision\x18\x02 \x01(\rBo\n\x14org.meshtastic.protoB\x19ModemPresetRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/meshtastic/protobuf/modem_preset_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\xae\x01\n\x0fModemPresetInfo\x12\x30\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0c\x62\x61ndwidth_hz\x18\x03 \x01(\r\x12\x19\n\x11wide_bandwidth_hz\x18\x04 \x01(\r\x12\x15\n\rspread_factor\x18\x05 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x06 \x01(\r\"3\n\rBandwidthCode\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x14\n\x0c\x62\x61ndwidth_hz\x18\x02 \x01(\r\"\x9b\x01\n\x13ModemPresetRegistry\x12\x35\n\x07presets\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetInfo\x12\x10\n\x08revision\x18\x02 \x01(\r\x12;\n\x0f\x62\x61ndwidth_codes\x18\x03 \x03(\x0b\x32\".meshtastic.protobuf.BandwidthCodeBo\n\x14org.meshtastic.protoB\x19ModemPresetRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,7 +24,9 @@ _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\031ModemPresetRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_MODEMPRESETINFO']._serialized_start=107 - _globals['_MODEMPRESETINFO']._serialized_end=283 - _globals['_MODEMPRESETREGISTRY']._serialized_start=285 - _globals['_MODEMPRESETREGISTRY']._serialized_end=379 + _globals['_MODEMPRESETINFO']._serialized_end=281 + _globals['_BANDWIDTHCODE']._serialized_start=283 + _globals['_BANDWIDTHCODE']._serialized_end=334 + _globals['_MODEMPRESETREGISTRY']._serialized_start=337 + _globals['_MODEMPRESETREGISTRY']._serialized_end=492 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/modem_preset_registry_pb2.pyi b/meshtastic/protobuf/modem_preset_registry_pb2.pyi index 578e8b9a3..7a0934e82 100644 --- a/meshtastic/protobuf/modem_preset_registry_pb2.pyi +++ b/meshtastic/protobuf/modem_preset_registry_pb2.pyi @@ -42,8 +42,8 @@ class ModemPresetInfo(_message.Message): PRESET_FIELD_NUMBER: _builtins.int NAME_FIELD_NUMBER: _builtins.int - BANDWIDTH_KHZ_FIELD_NUMBER: _builtins.int - WIDE_BANDWIDTH_KHZ_FIELD_NUMBER: _builtins.int + BANDWIDTH_HZ_FIELD_NUMBER: _builtins.int + WIDE_BANDWIDTH_HZ_FIELD_NUMBER: _builtins.int SPREAD_FACTOR_FIELD_NUMBER: _builtins.int CODING_RATE_FIELD_NUMBER: _builtins.int preset: _common_pb2.ModemPreset.ValueType @@ -55,13 +55,15 @@ class ModemPresetInfo(_message.Message): it. Because LoRaConfig.channel_num can hash it, changing one of these names moves every node whose channel took its default from that preset. """ - bandwidth_khz: _builtins.int - """Bandwidth in kHz in a sub-GHz region (e.g. 125, 250, 500), rounded down""" - wide_bandwidth_khz: _builtins.int + bandwidth_hz: _builtins.int """ - Bandwidth in kHz in a wide LoRa region (RegionInfo.wide_lora, above 1 GHz), - rounded down: 812.5 kHz is 812. 0 = the preset has no wide form, and no wide - region permits it. + Nominal bandwidth in Hz in a sub-GHz region (e.g. 125000, 62500, 15600), the slot + plan's input. The radio may synthesise a slightly different value, 15625 for 15600. + """ + wide_bandwidth_hz: _builtins.int + """ + Nominal bandwidth in Hz in a wide LoRa region (RegionInfo.wide_lora, above 1 GHz), + e.g. 812500. 0 = the preset has no wide form, and no wide region permits it. """ spread_factor: _builtins.int """Spreading factor (5-12)""" @@ -72,19 +74,47 @@ class ModemPresetInfo(_message.Message): *, preset: _common_pb2.ModemPreset.ValueType = ..., name: _builtins.str = ..., - bandwidth_khz: _builtins.int = ..., - wide_bandwidth_khz: _builtins.int = ..., + bandwidth_hz: _builtins.int = ..., + wide_bandwidth_hz: _builtins.int = ..., spread_factor: _builtins.int = ..., coding_rate: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth_khz", b"bandwidth_khz", "coding_rate", b"coding_rate", "name", b"name", "preset", b"preset", "spread_factor", b"spread_factor", "wide_bandwidth_khz", b"wide_bandwidth_khz"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth_hz", b"bandwidth_hz", "coding_rate", b"coding_rate", "name", b"name", "preset", b"preset", "spread_factor", b"spread_factor", "wide_bandwidth_hz", b"wide_bandwidth_hz"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... Global___ModemPresetInfo: _TypeAlias = ModemPresetInfo # noqa: Y015 +@_typing.final +class BandwidthCode(_message.Message): + """ + A LoRaConfig.bandwidth wire code and the nominal bandwidth it stands for + """ + + DESCRIPTOR: _descriptor.Descriptor + + CODE_FIELD_NUMBER: _builtins.int + BANDWIDTH_HZ_FIELD_NUMBER: _builtins.int + code: _builtins.int + """The value of LoRaConfig.bandwidth""" + bandwidth_hz: _builtins.int + """Nominal bandwidth in Hz, the slot plan's input for a custom setting""" + def __init__( + self, + *, + code: _builtins.int = ..., + bandwidth_hz: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth_hz", b"bandwidth_hz", "code", b"code"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___BandwidthCode: _TypeAlias = BandwidthCode # noqa: Y015 + @_typing.final class ModemPresetRegistry(_message.Message): """ @@ -95,6 +125,7 @@ class ModemPresetRegistry(_message.Message): PRESETS_FIELD_NUMBER: _builtins.int REVISION_FIELD_NUMBER: _builtins.int + BANDWIDTH_CODES_FIELD_NUMBER: _builtins.int revision: _builtins.int """ Raised by every change to the data. CI rejects a change that leaves it where it @@ -104,15 +135,24 @@ class ModemPresetRegistry(_message.Message): def presets(self) -> _containers.RepeatedCompositeFieldContainer[Global___ModemPresetInfo]: """Every preset with a definition""" + @_builtins.property + def bandwidth_codes(self) -> _containers.RepeatedCompositeFieldContainer[Global___BandwidthCode]: + """ + LoRaConfig.bandwidth codes and their nominal bandwidths: every code that stands for + something other than its value in kHz, and the whole-kHz ones radios use. A code + not listed is kHz as it stands. + """ + def __init__( self, *, presets: _abc.Iterable[Global___ModemPresetInfo] | None = ..., revision: _builtins.int = ..., + bandwidth_codes: _abc.Iterable[Global___BandwidthCode] | None = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["presets", b"presets", "revision", b"revision"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["bandwidth_codes", b"bandwidth_codes", "presets", b"presets", "revision", b"revision"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/modem_presets.json b/meshtastic/protobuf/modem_presets.json new file mode 100644 index 000000000..9d3c070e5 --- /dev/null +++ b/meshtastic/protobuf/modem_presets.json @@ -0,0 +1,183 @@ +{ + "revision": 2, + "presets": [ + { + "preset": "MODEM_LONG_FAST", + "name": "LongFast", + "bandwidth_hz": 250000, + "wide_bandwidth_hz": 812500, + "spread_factor": 11, + "coding_rate": 5 + }, + { + "preset": "MODEM_MEDIUM_SLOW", + "name": "MediumSlow", + "bandwidth_hz": 250000, + "wide_bandwidth_hz": 812500, + "spread_factor": 10, + "coding_rate": 5 + }, + { + "preset": "MODEM_MEDIUM_FAST", + "name": "MediumFast", + "bandwidth_hz": 250000, + "wide_bandwidth_hz": 812500, + "spread_factor": 9, + "coding_rate": 5 + }, + { + "preset": "MODEM_SHORT_SLOW", + "name": "ShortSlow", + "bandwidth_hz": 250000, + "wide_bandwidth_hz": 812500, + "spread_factor": 8, + "coding_rate": 5 + }, + { + "preset": "MODEM_SHORT_FAST", + "name": "ShortFast", + "bandwidth_hz": 250000, + "wide_bandwidth_hz": 812500, + "spread_factor": 7, + "coding_rate": 5 + }, + { + "preset": "MODEM_LONG_MODERATE", + "name": "LongMod", + "bandwidth_hz": 125000, + "wide_bandwidth_hz": 406250, + "spread_factor": 11, + "coding_rate": 8 + }, + { + "preset": "MODEM_SHORT_TURBO", + "name": "ShortTurbo", + "bandwidth_hz": 500000, + "wide_bandwidth_hz": 1625000, + "spread_factor": 7, + "coding_rate": 5 + }, + { + "preset": "MODEM_LONG_TURBO", + "name": "LongTurbo", + "bandwidth_hz": 500000, + "wide_bandwidth_hz": 1625000, + "spread_factor": 11, + "coding_rate": 8 + }, + { + "preset": "MODEM_LITE_FAST", + "name": "LiteFast", + "bandwidth_hz": 125000, + "wide_bandwidth_hz": 0, + "spread_factor": 9, + "coding_rate": 5 + }, + { + "preset": "MODEM_LITE_SLOW", + "name": "LiteSlow", + "bandwidth_hz": 125000, + "wide_bandwidth_hz": 0, + "spread_factor": 10, + "coding_rate": 5 + }, + { + "preset": "MODEM_NARROW_FAST", + "name": "NarrowFast", + "bandwidth_hz": 62500, + "wide_bandwidth_hz": 0, + "spread_factor": 7, + "coding_rate": 6 + }, + { + "preset": "MODEM_NARROW_SLOW", + "name": "NarrowSlow", + "bandwidth_hz": 62500, + "wide_bandwidth_hz": 0, + "spread_factor": 8, + "coding_rate": 6 + }, + { + "preset": "MODEM_TINY_FAST", + "name": "TinyFast", + "bandwidth_hz": 15600, + "wide_bandwidth_hz": 0, + "spread_factor": 7, + "coding_rate": 5 + }, + { + "preset": "MODEM_TINY_SLOW", + "name": "TinySlow", + "bandwidth_hz": 15600, + "wide_bandwidth_hz": 0, + "spread_factor": 8, + "coding_rate": 6 + }, + { + "preset": "MODEM_MEDIUM_TURBO", + "name": "MediumTurbo", + "bandwidth_hz": 500000, + "wide_bandwidth_hz": 1625000, + "spread_factor": 9, + "coding_rate": 5 + } + ], + "bandwidth_codes": [ + { + "code": 8, + "bandwidth_hz": 7800 + }, + { + "code": 10, + "bandwidth_hz": 10400 + }, + { + "code": 16, + "bandwidth_hz": 15600 + }, + { + "code": 21, + "bandwidth_hz": 20800 + }, + { + "code": 31, + "bandwidth_hz": 31250 + }, + { + "code": 42, + "bandwidth_hz": 41700 + }, + { + "code": 62, + "bandwidth_hz": 62500 + }, + { + "code": 125, + "bandwidth_hz": 125000 + }, + { + "code": 250, + "bandwidth_hz": 250000 + }, + { + "code": 500, + "bandwidth_hz": 500000 + }, + { + "code": 200, + "bandwidth_hz": 203125 + }, + { + "code": 400, + "bandwidth_hz": 406250 + }, + { + "code": 800, + "bandwidth_hz": 812500 + }, + { + "code": 1600, + "bandwidth_hz": 1625000 + } + ] +} diff --git a/meshtastic/protobuf/region_registry_pb2.py b/meshtastic/protobuf/region_registry_pb2.py index 9d357599b..647bf8564 100644 --- a/meshtastic/protobuf/region_registry_pb2.py +++ b/meshtastic/protobuf/region_registry_pb2.py @@ -15,7 +15,7 @@ from meshtastic.protobuf import common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)meshtastic/protobuf/region_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\x9a\x02\n\nRegionInfo\x12\x34\n\x0bregion_code\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\x12\x0f\n\x07profile\x18\x02 \x01(\t\x12\x1b\n\x13\x66req_start_mhz_x100\x18\x03 \x01(\r\x12\x19\n\x11\x66req_end_mhz_x100\x18\x04 \x01(\r\x12\x12\n\nduty_cycle\x18\x05 \x01(\r\x12\x19\n\x11router_duty_cycle\x18\x06 \x01(\r\x12\x17\n\x0fpower_limit_dbm\x18\x07 \x01(\r\x12\x1b\n\x13\x66requency_switching\x18\x08 \x01(\x08\x12\x11\n\twide_lora\x18\t \x01(\x08\x12\x15\n\roverride_slot\x18\n \x01(\x11\"\x98\x02\n\rRegionProfile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bpreset_list\x18\x02 \x01(\t\x12\x38\n\x0e\x64\x65\x66\x61ult_preset\x18\x03 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x13\n\x0bspacing_khz\x18\x04 \x01(\r\x12\x13\n\x0bpadding_khz\x18\x05 \x01(\r\x12\x17\n\x0f\x61udio_permitted\x18\x06 \x01(\x08\x12\x15\n\rlicensed_only\x18\x07 \x01(\x08\x12\x19\n\x11position_throttle\x18\x08 \x01(\r\x12\x1a\n\x12telemetry_throttle\x18\t \x01(\r\x12\x19\n\x11\x64\x65\x66\x61ult_hop_start\x18\n \x01(\r\"R\n\x0fModemPresetList\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x07presets\x18\x02 \x03(\x0e\x32 .meshtastic.protobuf.ModemPreset\"C\n\x0fRegionSwapGroup\x12\x30\n\x07regions\x18\x01 \x03(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\"\x81\x02\n\x0eRegionRegistry\x12\x30\n\x07regions\x18\x01 \x03(\x0b\x32\x1f.meshtastic.protobuf.RegionInfo\x12\x34\n\x08profiles\x18\x02 \x03(\x0b\x32\".meshtastic.protobuf.RegionProfile\x12:\n\x0cpreset_lists\x18\x03 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetList\x12\x39\n\x0bswap_groups\x18\x04 \x03(\x0b\x32$.meshtastic.protobuf.RegionSwapGroup\x12\x10\n\x08revision\x18\x05 \x01(\rBj\n\x14org.meshtastic.protoB\x14RegionRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)meshtastic/protobuf/region_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\"\xc5\x02\n\nRegionInfo\x12\x34\n\x0bregion_code\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\x12\x0f\n\x07profile\x18\x02 \x01(\t\x12\x15\n\rfreq_start_hz\x18\x03 \x01(\r\x12\x13\n\x0b\x66req_end_hz\x18\x04 \x01(\r\x12/\n\tsub_bands\x18\x05 \x03(\x0b\x32\x1c.meshtastic.protobuf.SubBand\x12\x1b\n\x13\x64uty_cycle_permille\x18\x06 \x01(\r\x12\x17\n\x0fpower_limit_dbm\x18\x07 \x01(\r\x12\x1b\n\x13\x66requency_switching\x18\x08 \x01(\x08\x12\x11\n\twide_lora\x18\t \x01(\x08\x12\x15\n\roverride_slot\x18\n \x01(\x11\x12\x16\n\x0e\x65\x64ge_clearance\x18\x0b \x01(\x08\"+\n\x07SubBand\x12\x10\n\x08start_hz\x18\x01 \x01(\r\x12\x0e\n\x06\x65nd_hz\x18\x02 \x01(\r\"\xc9\x02\n\rRegionProfile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bpreset_list\x18\x02 \x01(\t\x12\x38\n\x0e\x64\x65\x66\x61ult_preset\x18\x03 \x01(\x0e\x32 .meshtastic.protobuf.ModemPreset\x12\x12\n\nspacing_hz\x18\x04 \x01(\r\x12\x12\n\npadding_hz\x18\x05 \x01(\r\x12\x17\n\x0funit_channel_hz\x18\x06 \x01(\r\x12\x18\n\x10max_bandwidth_hz\x18\x07 \x01(\r\x12\x17\n\x0f\x61udio_permitted\x18\x08 \x01(\x08\x12\x15\n\rlicensed_only\x18\t \x01(\x08\x12\x19\n\x11position_throttle\x18\n \x01(\r\x12\x1a\n\x12telemetry_throttle\x18\x0b \x01(\r\x12\x19\n\x11\x64\x65\x66\x61ult_hop_start\x18\x0c \x01(\r\"R\n\x0fModemPresetList\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x07presets\x18\x02 \x03(\x0e\x32 .meshtastic.protobuf.ModemPreset\"C\n\x0fRegionSwapGroup\x12\x30\n\x07regions\x18\x01 \x03(\x0e\x32\x1f.meshtastic.protobuf.RegionCode\"\x81\x02\n\x0eRegionRegistry\x12\x30\n\x07regions\x18\x01 \x03(\x0b\x32\x1f.meshtastic.protobuf.RegionInfo\x12\x34\n\x08profiles\x18\x02 \x03(\x0b\x32\".meshtastic.protobuf.RegionProfile\x12:\n\x0cpreset_lists\x18\x03 \x03(\x0b\x32$.meshtastic.protobuf.ModemPresetList\x12\x39\n\x0bswap_groups\x18\x04 \x03(\x0b\x32$.meshtastic.protobuf.RegionSwapGroup\x12\x10\n\x08revision\x18\x05 \x01(\rBj\n\x14org.meshtastic.protoB\x14RegionRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,13 +24,15 @@ _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\024RegionRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_REGIONINFO']._serialized_start=101 - _globals['_REGIONINFO']._serialized_end=383 - _globals['_REGIONPROFILE']._serialized_start=386 - _globals['_REGIONPROFILE']._serialized_end=666 - _globals['_MODEMPRESETLIST']._serialized_start=668 - _globals['_MODEMPRESETLIST']._serialized_end=750 - _globals['_REGIONSWAPGROUP']._serialized_start=752 - _globals['_REGIONSWAPGROUP']._serialized_end=819 - _globals['_REGIONREGISTRY']._serialized_start=822 - _globals['_REGIONREGISTRY']._serialized_end=1079 + _globals['_REGIONINFO']._serialized_end=426 + _globals['_SUBBAND']._serialized_start=428 + _globals['_SUBBAND']._serialized_end=471 + _globals['_REGIONPROFILE']._serialized_start=474 + _globals['_REGIONPROFILE']._serialized_end=803 + _globals['_MODEMPRESETLIST']._serialized_start=805 + _globals['_MODEMPRESETLIST']._serialized_end=887 + _globals['_REGIONSWAPGROUP']._serialized_start=889 + _globals['_REGIONSWAPGROUP']._serialized_end=956 + _globals['_REGIONREGISTRY']._serialized_start=959 + _globals['_REGIONREGISTRY']._serialized_end=1216 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/region_registry_pb2.pyi b/meshtastic/protobuf/region_registry_pb2.pyi index 66d1ec9fd..804f5b526 100644 --- a/meshtastic/protobuf/region_registry_pb2.pyi +++ b/meshtastic/protobuf/region_registry_pb2.pyi @@ -30,8 +30,9 @@ class RegionInfo(_message.Message): Each fact is stated in exactly one table, and tables refer to each other by name: - RegionInfo band, duty cycle, power limit, slot -> one RegionProfile - RegionProfile slot layout, audio, licensing, + RegionInfo band, sub-bands, duty cycle, power limit, + slot, edge clearance -> one RegionProfile + RegionProfile slot layout, raster, audio, licensing, throttles, default preset -> one ModemPresetList ModemPresetList the presets a profile permits -> ModemPreset values RegionSwapGroup regions a preset moves a node between -> RegionCode values @@ -39,7 +40,12 @@ class RegionInfo(_message.Message): Many regions share one profile, and profiles can share one preset list: NARROW and HAM_100KHZ permit the same presets and differ in licensing, padding and audio. Whatever follows from the tables is not stored, such as a preset being - reachable only by licensed operators, or the presets a swap group offers. + reachable only by licensed operators, the presets a swap group offers, or the + slot plan, which SCHEMA.md derives from the band, the profile and the bandwidth. + + Frequencies are exact hertz. Regulation beyond band edges, power and one duty + cycle (airtime caps, listen-before-talk, role-dependent duty cycles) is firmware + region hooks, not data. The radio parameters of each preset are in modem_preset_registry.proto. @@ -55,34 +61,30 @@ class RegionInfo(_message.Message): REGION_CODE_FIELD_NUMBER: _builtins.int PROFILE_FIELD_NUMBER: _builtins.int - FREQ_START_MHZ_X100_FIELD_NUMBER: _builtins.int - FREQ_END_MHZ_X100_FIELD_NUMBER: _builtins.int - DUTY_CYCLE_FIELD_NUMBER: _builtins.int - ROUTER_DUTY_CYCLE_FIELD_NUMBER: _builtins.int + FREQ_START_HZ_FIELD_NUMBER: _builtins.int + FREQ_END_HZ_FIELD_NUMBER: _builtins.int + SUB_BANDS_FIELD_NUMBER: _builtins.int + DUTY_CYCLE_PERMILLE_FIELD_NUMBER: _builtins.int POWER_LIMIT_DBM_FIELD_NUMBER: _builtins.int FREQUENCY_SWITCHING_FIELD_NUMBER: _builtins.int WIDE_LORA_FIELD_NUMBER: _builtins.int OVERRIDE_SLOT_FIELD_NUMBER: _builtins.int + EDGE_CLEARANCE_FIELD_NUMBER: _builtins.int region_code: _common_pb2.RegionCode.ValueType """Which region this defines""" profile: _builtins.str """Name of the RegionProfile this region uses""" - freq_start_mhz_x100: _builtins.int - """ - Frequency range start in MHz x100 (e.g. 90200 = 902.00 MHz). A finer band edge - is rounded down, 433.075 MHz to 43307; firmware holds the exact value. + freq_start_hz: _builtins.int """ - freq_end_mhz_x100: _builtins.int - """Frequency range end in MHz x100 (e.g. 92800 = 928.00 MHz), rounded down""" - duty_cycle: _builtins.int + Lower band edge in Hz. An edge that has no exact value rounds inward, so this + one rounds up. """ - Duty cycle percentage (1-100, where 100 = no duty cycle restriction). A - fractional limit is rounded down, 2.5% to 2; firmware holds the exact value. + freq_end_hz: _builtins.int + """Upper band edge in Hz, rounded down when it has no exact value""" + duty_cycle_permille: _builtins.int """ - router_duty_cycle: _builtins.int - """ - Duty cycle percentage for a node in the ROUTER role, where regulation grants it - more airtime than other nodes. 0 = duty_cycle applies to every role. + Duty cycle limit in per mille, 1-1000, where 1000 is no limit. A limit that + depends on the node's role is a firmware region hook, not data. """ power_limit_dbm: _builtins.int """Maximum TX power in dBm. A licensed operator (User.is_licensed) may exceed it.""" @@ -92,7 +94,7 @@ class RegionInfo(_message.Message): """ Whether this region uses wide LoRa. The boundary is 1 GHz: narrow LoRa is sub-GHz, wide LoRa above it, and newer chips reach 6 GHz. A wide region needs a - wide-capable radio, and its presets use their wide_bandwidth_khz. Kept as its own + wide-capable radio, and its presets use their wide_bandwidth_hz. Kept as its own field rather than read from the frequency range, because frequency mixing, or tuning a wideband transmitter, can open ranges where the band does not decide it. """ @@ -104,28 +106,72 @@ class RegionInfo(_message.Message): -1 the preset's name N > 0 no hash, this region is fixed to slot N, counted from 1 """ + edge_clearance: _builtins.bool + """ + Drop one slot when the outermost slots' RF edges would sit closer to the band edge + than a quarter of the bandwidth, unless fewer than five slots remain. Never set on + a region whose profile has a unit_channel_hz. + """ + @_builtins.property + def sub_bands(self) -> _containers.RepeatedCompositeFieldContainer[Global___SubBand]: + """ + The blocks the regulation permits inside the band edges, ascending and not + overlapping, the first starting at freq_start_hz and the last ending at + freq_end_hz. Empty means one block equal to the band edges; otherwise at least two. + Each block gets its own slots and no slot straddles a gap. + """ + def __init__( self, *, region_code: _common_pb2.RegionCode.ValueType = ..., profile: _builtins.str = ..., - freq_start_mhz_x100: _builtins.int = ..., - freq_end_mhz_x100: _builtins.int = ..., - duty_cycle: _builtins.int = ..., - router_duty_cycle: _builtins.int = ..., + freq_start_hz: _builtins.int = ..., + freq_end_hz: _builtins.int = ..., + sub_bands: _abc.Iterable[Global___SubBand] | None = ..., + duty_cycle_permille: _builtins.int = ..., power_limit_dbm: _builtins.int = ..., frequency_switching: _builtins.bool = ..., wide_lora: _builtins.bool = ..., override_slot: _builtins.int = ..., + edge_clearance: _builtins.bool = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["duty_cycle", b"duty_cycle", "freq_end_mhz_x100", b"freq_end_mhz_x100", "freq_start_mhz_x100", b"freq_start_mhz_x100", "frequency_switching", b"frequency_switching", "override_slot", b"override_slot", "power_limit_dbm", b"power_limit_dbm", "profile", b"profile", "region_code", b"region_code", "router_duty_cycle", b"router_duty_cycle", "wide_lora", b"wide_lora"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["duty_cycle_permille", b"duty_cycle_permille", "edge_clearance", b"edge_clearance", "freq_end_hz", b"freq_end_hz", "freq_start_hz", b"freq_start_hz", "frequency_switching", b"frequency_switching", "override_slot", b"override_slot", "power_limit_dbm", b"power_limit_dbm", "profile", b"profile", "region_code", b"region_code", "sub_bands", b"sub_bands", "wide_lora", b"wide_lora"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... Global___RegionInfo: _TypeAlias = RegionInfo # noqa: Y015 +@_typing.final +class SubBand(_message.Message): + """ + A block of permitted spectrum inside a region's band edges + """ + + DESCRIPTOR: _descriptor.Descriptor + + START_HZ_FIELD_NUMBER: _builtins.int + END_HZ_FIELD_NUMBER: _builtins.int + start_hz: _builtins.int + """Lower edge in Hz""" + end_hz: _builtins.int + """Upper edge in Hz""" + def __init__( + self, + *, + start_hz: _builtins.int = ..., + end_hz: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["end_hz", b"end_hz", "start_hz", b"start_hz"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___SubBand: _TypeAlias = SubBand # noqa: Y015 + @_typing.final class RegionProfile(_message.Message): """ @@ -137,8 +183,10 @@ class RegionProfile(_message.Message): NAME_FIELD_NUMBER: _builtins.int PRESET_LIST_FIELD_NUMBER: _builtins.int DEFAULT_PRESET_FIELD_NUMBER: _builtins.int - SPACING_KHZ_FIELD_NUMBER: _builtins.int - PADDING_KHZ_FIELD_NUMBER: _builtins.int + SPACING_HZ_FIELD_NUMBER: _builtins.int + PADDING_HZ_FIELD_NUMBER: _builtins.int + UNIT_CHANNEL_HZ_FIELD_NUMBER: _builtins.int + MAX_BANDWIDTH_HZ_FIELD_NUMBER: _builtins.int AUDIO_PERMITTED_FIELD_NUMBER: _builtins.int LICENSED_ONLY_FIELD_NUMBER: _builtins.int POSITION_THROTTLE_FIELD_NUMBER: _builtins.int @@ -153,13 +201,20 @@ class RegionProfile(_message.Message): Preset a region selects when none is set or the current one is not permitted. One of the presets in preset_list. """ - spacing_khz: _builtins.int - """Gap between adjacent frequency slots in kHz, rounded down""" - padding_khz: _builtins.int + spacing_hz: _builtins.int + """Gap between adjacent frequency slots in Hz; a whole multiple of unit_channel_hz""" + padding_hz: _builtins.int + """ + Guard band on each side of a frequency slot in Hz, widening the slot beyond the + bandwidth. Not stored when unit_channel_hz is set, which derives it. + """ + unit_channel_hz: _builtins.int """ - Guard band on each side of a frequency slot in kHz, rounded down. It widens the - slot beyond the preset bandwidth, placing 62.5 kHz presets on a 100 kHz raster. + Regulatory channel raster in Hz, 0 for continuous spectrum. A signal occupies + ceil(bandwidth / unit_channel_hz) bonded unit channels and is centred on the bond. """ + max_bandwidth_hz: _builtins.int + """Widest bandwidth in Hz the regions of this profile permit, 0 for no cap""" audio_permitted: _builtins.bool """Whether audio mode is permitted""" licensed_only: _builtins.bool @@ -184,8 +239,10 @@ class RegionProfile(_message.Message): name: _builtins.str = ..., preset_list: _builtins.str = ..., default_preset: _common_pb2.ModemPreset.ValueType = ..., - spacing_khz: _builtins.int = ..., - padding_khz: _builtins.int = ..., + spacing_hz: _builtins.int = ..., + padding_hz: _builtins.int = ..., + unit_channel_hz: _builtins.int = ..., + max_bandwidth_hz: _builtins.int = ..., audio_permitted: _builtins.bool = ..., licensed_only: _builtins.bool = ..., position_throttle: _builtins.int = ..., @@ -194,7 +251,7 @@ class RegionProfile(_message.Message): ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["audio_permitted", b"audio_permitted", "default_hop_start", b"default_hop_start", "default_preset", b"default_preset", "licensed_only", b"licensed_only", "name", b"name", "padding_khz", b"padding_khz", "position_throttle", b"position_throttle", "preset_list", b"preset_list", "spacing_khz", b"spacing_khz", "telemetry_throttle", b"telemetry_throttle"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["audio_permitted", b"audio_permitted", "default_hop_start", b"default_hop_start", "default_preset", b"default_preset", "licensed_only", b"licensed_only", "max_bandwidth_hz", b"max_bandwidth_hz", "name", b"name", "padding_hz", b"padding_hz", "position_throttle", b"position_throttle", "preset_list", b"preset_list", "spacing_hz", b"spacing_hz", "telemetry_throttle", b"telemetry_throttle", "unit_channel_hz", b"unit_channel_hz"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -239,8 +296,8 @@ class RegionSwapGroup(_message.Message): members' presets in each of them. Members need not share a frequency range. EU_868 and EU_N_868 overlap, while - EU_866 is a bespoke RFID band that overlaps neither. EU_874 and EU_917 follow - the same pattern if they are allocated. + EU_866 is a bespoke band that overlaps neither. EU_874 and EU_917 permit the same + presets as EU_866, so they cannot join the group. """ DESCRIPTOR: _descriptor.Descriptor diff --git a/meshtastic/protobuf/regions.json b/meshtastic/protobuf/regions.json new file mode 100644 index 000000000..f6c959d94 --- /dev/null +++ b/meshtastic/protobuf/regions.json @@ -0,0 +1,657 @@ +{ + "revision": 3, + "regions": [ + { + "region_code": "REGION_UNSET", + "profile": "STD", + "freq_start_hz": 902000000, + "freq_end_hz": 928000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_US", + "profile": "STD", + "freq_start_hz": 902000000, + "freq_end_hz": 928000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_EU_433", + "profile": "STD", + "freq_start_hz": 433050000, + "freq_end_hz": 434790000, + "duty_cycle_permille": 100, + "power_limit_dbm": 10, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_EU_868", + "profile": "EU868", + "freq_start_hz": 869400000, + "freq_end_hz": 869650000, + "duty_cycle_permille": 100, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_CN", + "profile": "STD", + "freq_start_hz": 470000000, + "freq_end_hz": 510000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 19, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_JP", + "profile": "JP", + "freq_start_hz": 920500000, + "freq_end_hz": 923500000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 13, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_ANZ", + "profile": "STD", + "freq_start_hz": 915000000, + "freq_end_hz": 928000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_KR", + "profile": "STD", + "freq_start_hz": 920000000, + "freq_end_hz": 923000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 23, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_TW", + "profile": "STD", + "freq_start_hz": 920000000, + "freq_end_hz": 925000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_RU", + "profile": "STD", + "freq_start_hz": 868700000, + "freq_end_hz": 869200000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 20, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_IN", + "profile": "STD", + "freq_start_hz": 865000000, + "freq_end_hz": 867000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_NZ_865", + "profile": "STD", + "freq_start_hz": 864000000, + "freq_end_hz": 868000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 36, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_TH", + "profile": "STD", + "freq_start_hz": 920000000, + "freq_end_hz": 925000000, + "duty_cycle_permille": 100, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_LORA_24", + "profile": "STD", + "freq_start_hz": 2400000000, + "freq_end_hz": 2483500000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 10, + "frequency_switching": false, + "wide_lora": true, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_MY_433", + "profile": "STD", + "freq_start_hz": 433000000, + "freq_end_hz": 435000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 20, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_MY_919", + "profile": "STD", + "freq_start_hz": 919000000, + "freq_end_hz": 924000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 27, + "frequency_switching": true, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_SG_923", + "profile": "STD", + "freq_start_hz": 917000000, + "freq_end_hz": 925000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 20, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_PH_433", + "profile": "STD", + "freq_start_hz": 433050000, + "freq_end_hz": 434790000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 10, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_PH_868", + "profile": "STD", + "freq_start_hz": 868000000, + "freq_end_hz": 869200000, + "sub_bands": [ + { + "start_hz": 868000000, + "end_hz": 868600000 + }, + { + "start_hz": 868700000, + "end_hz": 869200000 + } + ], + "duty_cycle_permille": 1000, + "power_limit_dbm": 14, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_PH_915", + "profile": "STD", + "freq_start_hz": 915000000, + "freq_end_hz": 918000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 24, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_ANZ_433", + "profile": "STD", + "freq_start_hz": 433050000, + "freq_end_hz": 434790000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 14, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_KZ_433", + "profile": "STD", + "freq_start_hz": 433075000, + "freq_end_hz": 434775000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 10, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_KZ_863", + "profile": "STD", + "freq_start_hz": 863000000, + "freq_end_hz": 868000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_NP_865", + "profile": "STD", + "freq_start_hz": 865000000, + "freq_end_hz": 868000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_BR_902", + "profile": "STD", + "freq_start_hz": 902000000, + "freq_end_hz": 907500000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": true + }, + { + "region_code": "REGION_ITU1_2M", + "profile": "HAM_20KHZ", + "freq_start_hz": 144000000, + "freq_end_hz": 146000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 26, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU2_2M", + "profile": "HAM_20KHZ", + "freq_start_hz": 144000000, + "freq_end_hz": 148000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 51, + "edge_clearance": false + }, + { + "region_code": "REGION_EU_866", + "profile": "LITE", + "freq_start_hz": 865600000, + "freq_end_hz": 867600000, + "sub_bands": [ + { + "start_hz": 865600000, + "end_hz": 865800000 + }, + { + "start_hz": 866200000, + "end_hz": 866400000 + }, + { + "start_hz": 866800000, + "end_hz": 867000000 + }, + { + "start_hz": 867400000, + "end_hz": 867600000 + } + ], + "duty_cycle_permille": 25, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_EU_874", + "profile": "LITE_FLEX", + "freq_start_hz": 874000000, + "freq_end_hz": 874400000, + "duty_cycle_permille": 25, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_EU_917", + "profile": "LITE_FLEX", + "freq_start_hz": 917300000, + "freq_end_hz": 918900000, + "sub_bands": [ + { + "start_hz": 917300000, + "end_hz": 917700000 + }, + { + "start_hz": 918500000, + "end_hz": 918900000 + } + ], + "duty_cycle_permille": 25, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 0, + "edge_clearance": false + }, + { + "region_code": "REGION_EU_N_868", + "profile": "NARROW", + "freq_start_hz": 869400000, + "freq_end_hz": 869650000, + "duty_cycle_permille": 100, + "power_limit_dbm": 27, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 1, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU3_2M", + "profile": "HAM_20KHZ", + "freq_start_hz": 144000000, + "freq_end_hz": 148000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 33, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU1_70CM", + "profile": "HAM_100KHZ", + "freq_start_hz": 430000000, + "freq_end_hz": 440000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 37, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU2_70CM", + "profile": "HAM_100KHZ", + "freq_start_hz": 420000000, + "freq_end_hz": 450000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 137, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU3_70CM", + "profile": "HAM_100KHZ", + "freq_start_hz": 430000000, + "freq_end_hz": 450000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 37, + "edge_clearance": false + }, + { + "region_code": "REGION_ITU2_125CM", + "profile": "HAM_100KHZ", + "freq_start_hz": 220000000, + "freq_end_hz": 225000000, + "duty_cycle_permille": 1000, + "power_limit_dbm": 30, + "frequency_switching": false, + "wide_lora": false, + "override_slot": 37, + "edge_clearance": false + } + ], + "profiles": [ + { + "name": "STD", + "preset_list": "STD", + "default_preset": "MODEM_LONG_FAST", + "spacing_hz": 0, + "padding_hz": 0, + "unit_channel_hz": 0, + "max_bandwidth_hz": 0, + "position_throttle": 1, + "telemetry_throttle": 1, + "default_hop_start": 3, + "audio_permitted": true, + "licensed_only": false + }, + { + "name": "EU868", + "preset_list": "EU_868", + "default_preset": "MODEM_LONG_FAST", + "spacing_hz": 0, + "padding_hz": 0, + "unit_channel_hz": 0, + "max_bandwidth_hz": 0, + "position_throttle": 1, + "telemetry_throttle": 1, + "default_hop_start": 3, + "audio_permitted": false, + "licensed_only": false + }, + { + "name": "JP", + "preset_list": "JP", + "default_preset": "MODEM_LONG_FAST", + "spacing_hz": 0, + "unit_channel_hz": 200000, + "max_bandwidth_hz": 0, + "position_throttle": 1, + "telemetry_throttle": 1, + "default_hop_start": 3, + "audio_permitted": true, + "licensed_only": false + }, + { + "name": "LITE", + "preset_list": "LITE", + "default_preset": "MODEM_LITE_FAST", + "spacing_hz": 0, + "unit_channel_hz": 200000, + "max_bandwidth_hz": 0, + "position_throttle": 10, + "telemetry_throttle": 10, + "default_hop_start": 3, + "audio_permitted": false, + "licensed_only": false + }, + { + "name": "LITE_FLEX", + "preset_list": "LITE", + "default_preset": "MODEM_LITE_FAST", + "spacing_hz": 0, + "padding_hz": 0, + "unit_channel_hz": 0, + "max_bandwidth_hz": 200000, + "position_throttle": 10, + "telemetry_throttle": 10, + "default_hop_start": 3, + "audio_permitted": false, + "licensed_only": false + }, + { + "name": "NARROW", + "preset_list": "NARROW", + "default_preset": "MODEM_NARROW_SLOW", + "spacing_hz": 0, + "padding_hz": 10400, + "unit_channel_hz": 0, + "max_bandwidth_hz": 0, + "position_throttle": 1, + "telemetry_throttle": 1, + "default_hop_start": 3, + "audio_permitted": true, + "licensed_only": false + }, + { + "name": "HAM_20KHZ", + "preset_list": "TINY", + "default_preset": "MODEM_TINY_FAST", + "spacing_hz": 0, + "unit_channel_hz": 20000, + "max_bandwidth_hz": 0, + "position_throttle": 2, + "telemetry_throttle": 2, + "default_hop_start": 3, + "audio_permitted": false, + "licensed_only": true + }, + { + "name": "HAM_100KHZ", + "preset_list": "NARROW", + "default_preset": "MODEM_NARROW_SLOW", + "spacing_hz": 0, + "unit_channel_hz": 100000, + "max_bandwidth_hz": 0, + "position_throttle": 1, + "telemetry_throttle": 1, + "default_hop_start": 3, + "audio_permitted": false, + "licensed_only": true + } + ], + "preset_lists": [ + { + "name": "STD", + "presets": [ + "MODEM_LONG_FAST", + "MODEM_MEDIUM_SLOW", + "MODEM_MEDIUM_FAST", + "MODEM_SHORT_SLOW", + "MODEM_SHORT_FAST", + "MODEM_LONG_MODERATE", + "MODEM_SHORT_TURBO", + "MODEM_LONG_TURBO", + "MODEM_MEDIUM_TURBO" + ] + }, + { + "name": "EU_868", + "presets": [ + "MODEM_LONG_FAST", + "MODEM_MEDIUM_SLOW", + "MODEM_MEDIUM_FAST", + "MODEM_SHORT_SLOW", + "MODEM_SHORT_FAST", + "MODEM_LONG_MODERATE" + ] + }, + { + "name": "JP", + "presets": [ + "MODEM_LONG_FAST", + "MODEM_MEDIUM_SLOW", + "MODEM_MEDIUM_FAST", + "MODEM_SHORT_SLOW", + "MODEM_SHORT_FAST", + "MODEM_SHORT_TURBO", + "MODEM_LONG_TURBO", + "MODEM_NARROW_FAST", + "MODEM_NARROW_SLOW", + "MODEM_MEDIUM_TURBO" + ] + }, + { + "name": "LITE", + "presets": [ + "MODEM_LITE_FAST", + "MODEM_LITE_SLOW" + ] + }, + { + "name": "NARROW", + "presets": [ + "MODEM_NARROW_FAST", + "MODEM_NARROW_SLOW" + ] + }, + { + "name": "TINY", + "presets": [ + "MODEM_TINY_FAST", + "MODEM_TINY_SLOW" + ] + } + ], + "swap_groups": [ + { + "regions": [ + "REGION_EU_868", + "REGION_EU_866", + "REGION_EU_N_868" + ] + } + ] +} diff --git a/protobufs b/protobufs index 3a81613a9..bf6f3100e 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 3a81613a9ef0ec8074a9216d16ef61de847e9a0e +Subproject commit bf6f3100e623c7f6ca9d1cd3420c2e073952db79 From 8694bbc360e789642237e69c39a96d1cac234471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 19:22:34 +0200 Subject: [PATCH 05/24] Use the 3.0 link letters: channels /f/, contacts /u/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getURL and getContactURL produce /f/ and /u/ links. - setURL and addContactURL refuse another generation's letter instead of decoding its bytes into the wrong 3.0 fields. - Examples and fixtures carry 3.0 channel links. - protobufs d46c968. Signed-off-by: Thomas Göttgens --- .vscode/launch.json | 2 +- exampleConfig.yaml | 2 +- example_config.yaml | 2 +- meshtastic/__main__.py | 2 +- meshtastic/node.py | 61 +++++++++++++++-------------- meshtastic/protobuf/admin_pb2.pyi | 5 +++ meshtastic/protobuf/apponly_pb2.pyi | 3 +- meshtastic/protobuf/mqtt_pb2.pyi | 1 + meshtastic/tests/test_main.py | 18 ++++----- meshtastic/tests/test_node.py | 39 ++++++++++++++++-- meshtastic/tests/test_smoke1.py | 12 +++--- meshtastic/tests/test_smokevirt.py | 2 +- protobufs | 2 +- 13 files changed, 96 insertions(+), 55 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 1df777fdd..a7143ec51 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -180,7 +180,7 @@ "request": "launch", "module": "meshtastic", "justMyCode": true, - "args": ["--seturl", "https://www.meshtastic.org/d/#CgIYAw" + "args": ["--seturl", "https://meshtastic.org/f/#CgMKAQE" ] }, { diff --git a/exampleConfig.yaml b/exampleConfig.yaml index a546e5a39..3dd917c4c 100644 --- a/exampleConfig.yaml +++ b/exampleConfig.yaml @@ -2,7 +2,7 @@ owner: Bob TBeam ownerShort: BOB -channelUrl: https://www.meshtastic.org/d/#CgUYAyIBAQ +channelUrl: https://meshtastic.org/f/#CgMKAQE location: lat: 35.88888 diff --git a/example_config.yaml b/example_config.yaml index acbdc332b..3870116c1 100644 --- a/example_config.yaml +++ b/example_config.yaml @@ -2,7 +2,7 @@ owner: Bob TBeam owner_short: BOB -channel_url: https://www.meshtastic.org/e/#CgMSAQESCDgBQANIAVAe +channel_url: https://meshtastic.org/f/#CgMKAQESCAgDOAFAA0g8 canned_messages: Hi|Bye|Yes|No|Ok ringtone: 24:d=32,o=5,b=565:f6,p,f6,4p,p,f6,p,f6,2p,p,b6,p,b6,p,b6,p,b6,p,b,p,b,p,b,p,b,p,b,p,b,p,b,p,b,1p.,2p.,p diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index f933ffd42..df9e32204 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -2381,7 +2381,7 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars group.add_argument( "--add-contact", help="Add a contact (User) to the NodeDB from a shareable URL. " - "Example: https://meshtastic.org/v/#", + "Example: https://meshtastic.org/u/#", metavar="URL", ) diff --git a/meshtastic/node.py b/meshtastic/node.py index 8a2494d62..ffa948152 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -3,6 +3,7 @@ import base64 import logging +import re import time from typing import Optional, Union, List @@ -27,6 +28,31 @@ MAX_CHANNELS = 16 """Channels a 3.0 node holds""" +CHANNEL_URL_LETTER = "f" +"""Path letter of a 3.0 channel link, https://meshtastic.org/f/#...; 2.x used e, 1.2 d, 1.0 c""" + +CONTACT_URL_LETTER = "u" +"""Path letter of a 3.0 contact link, https://meshtastic.org/u/#...; 2.x used v""" + +_LINK_RE = re.compile(r"/([A-Za-z])/(\?add=true)?#([A-Za-z0-9_=-]*)$") + + +def link_payload(url: str, letter: str, kind: str, addOnly: bool = False) -> bytes: + """The bytes a channel or contact link carries. A link with another generation's letter + is refused: its payload would parse into the wrong 3.0 fields without an error.""" + m = _LINK_RE.search(url.strip()) + if not m or bool(m.group(2)) != addOnly: + our_exit(f"Warning: Invalid URL '{url}'") + if m.group(1).lower() != letter: + our_exit( + f"Warning: '{url}' is not a Meshtastic 3.0 {kind} link; those read " + f"https://meshtastic.org/{letter}/#..." + ) + b64 = m.group(3) + # Links drop the base64 padding; the decoder wants it back + b64 += "=" * (-len(b64) % 4) + return base64.urlsafe_b64decode(b64) + def channel_role(ch: channel_pb2.Channel) -> str: """A 3.0 channel has no role field: index 0 is the primary, and a channel without @@ -352,7 +378,7 @@ def getURL(self, includeAll: bool = True): some_bytes = channelSet.SerializeToString() s = base64.urlsafe_b64encode(some_bytes).decode("ascii") s = s.replace("=", "").replace("+", "-").replace("/", "_") - return f"https://meshtastic.org/e/#{s}" + return f"https://meshtastic.org/{CHANNEL_URL_LETTER}/#{s}" def getContactURL(self, node_id: Union[int, str], should_ignore: bool = False, manually_verified: bool = False): """Generate a shareable contact URL for the specified node""" @@ -388,31 +414,15 @@ def getContactURL(self, node_id: Union[int, str], should_ignore: bool = False, m data = contact.SerializeToString() s = base64.urlsafe_b64encode(data).decode("ascii") s = s.replace("=", "").replace("+", "-").replace("/", "_") - return f"https://meshtastic.org/v/#{s}" + return f"https://meshtastic.org/{CONTACT_URL_LETTER}/#{s}" def setURL(self, url: str, addOnly: bool = False): """Set mesh network URL""" if self.localConfig is None or self.channels is None: our_exit("Warning: config or channels not loaded") - # URLs are of the form https://meshtastic.org/d/#{base64_channel_set} - # Split on '/#' to find the base64 encoded channel settings - if addOnly: - splitURL = url.split("/?add=true#") - else: - splitURL = url.split("/#") - if len(splitURL) == 1: - our_exit(f"Warning: Invalid URL '{url}'") - b64 = splitURL[-1] - - # We normally strip padding to make for a shorter URL, but the python parser doesn't like - # that. So add back any missing padding - # per https://stackoverflow.com/a/9807138 - missing_padding = len(b64) % 4 - if missing_padding: - b64 += "=" * (4 - missing_padding) - - decodedURL = base64.urlsafe_b64decode(b64) + # https://meshtastic.org/f/#{base64_channel_set}, or /f/?add=true#... to add channels + decodedURL = link_payload(url, CHANNEL_URL_LETTER, "channel", addOnly) channelSet = apponly_pb2.ChannelSet() channelSet.ParseFromString(decodedURL) @@ -453,16 +463,7 @@ def addContactURL(self, url: str): """Add a contact (User) to the NodeDB from a shareable URL""" self.ensureSessionKey() - splitURL = url.split("/#") - if len(splitURL) == 1: - our_exit(f"Warning: Invalid URL '{url}'") - b64 = splitURL[-1] - - missing_padding = len(b64) % 4 - if missing_padding: - b64 += "=" * (4 - missing_padding) - - decodedURL = base64.urlsafe_b64decode(b64) + decodedURL = link_payload(url, CONTACT_URL_LETTER, "contact") contact = admin_pb2.SharedContact() contact.ParseFromString(decodedURL) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index 2af8d1d77..d56312f8e 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -1063,6 +1063,11 @@ Global___NodeRemoteHardwarePinsResponse: _TypeAlias = NodeRemoteHardwarePinsResp @_typing.final class SharedContact(_message.Message): + """ + A node shared as a contact, as a link or QR code: + https://meshtastic.org/u/# (SCHEMA.md "Links and MQTT topics"). + """ + DESCRIPTOR: _descriptor.Descriptor NODE_NUM_FIELD_NUMBER: _builtins.int diff --git a/meshtastic/protobuf/apponly_pb2.pyi b/meshtastic/protobuf/apponly_pb2.pyi index 61d694c99..a841ee0e3 100644 --- a/meshtastic/protobuf/apponly_pb2.pyi +++ b/meshtastic/protobuf/apponly_pb2.pyi @@ -26,7 +26,8 @@ class ChannelSet(_message.Message): This is the most compact possible representation for a set of channels. The primary channel is first; the rest follow in table order. Disabled channels are not included. - This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL + This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL: + https://meshtastic.org/f/#, SCHEMA.md "Links and MQTT topics". """ DESCRIPTOR: _descriptor.Descriptor diff --git a/meshtastic/protobuf/mqtt_pb2.pyi b/meshtastic/protobuf/mqtt_pb2.pyi index e24503bc4..b822ee6fa 100644 --- a/meshtastic/protobuf/mqtt_pb2.pyi +++ b/meshtastic/protobuf/mqtt_pb2.pyi @@ -22,6 +22,7 @@ DESCRIPTOR: _descriptor.FileDescriptor class ServiceEnvelope(_message.Message): """ This message wraps a MeshPacket with extra metadata about the sender and how it arrived. + Published on /3/e// (SCHEMA.md "Links and MQTT topics"). """ DESCRIPTOR: _descriptor.Descriptor diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index fc38d6ea3..f86578292 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -1062,7 +1062,7 @@ def mock_setFixedPosition(lat, lon, alt): @pytest.mark.usefixtures("reset_mt_config") def test_main_seturl(capsys): """Test --seturl (url used below is what is generated after a factory_reset)""" - sys.argv = ["", "--seturl", "https://www.meshtastic.org/d/#CgUYAyIBAQ"] + sys.argv = ["", "--seturl", "https://meshtastic.org/f/#CgMKAQE"] mt_config.args = sys.argv iface = MagicMock(autospec=SerialInterface) @@ -2027,7 +2027,7 @@ def test_export_profile_serializes_deviceprofile(): iface = MagicMock(autospec=SerialInterface) iface.getLongName.return_value = "foo" iface.getShortName.return_value = "oof" - iface.localNode.getURL.return_value = "https://meshtastic.org/e/#test" + iface.localNode.getURL.return_value = "https://meshtastic.org/f/#test" iface.getCannedMessage.return_value = "Hi|Bye" iface.getRingtone.return_value = "24:d=32,o=5" iface.getMyNodeInfo.return_value = { @@ -2043,7 +2043,7 @@ def test_export_profile_serializes_deviceprofile(): profile.ParseFromString(raw) # must not raise assert profile.long_name == "foo" assert profile.short_name == "oof" - assert profile.channel_url == "https://meshtastic.org/e/#test" + assert profile.channel_url == "https://meshtastic.org/f/#test" assert profile.canned_messages == "Hi|Bye" assert profile.ringtone == "24:d=32,o=5" assert profile.HasField("fixed_position") @@ -2134,7 +2134,7 @@ def test_profile_from_yaml_maps_all_fields(): configuration = { "owner": "YAML Owner", "owner_short": "YO", - "channel_url": "https://meshtastic.org/e/#test", + "channel_url": "https://meshtastic.org/f/#test", "canned_messages": "Hi|Bye", "ringtone": "24:d=32,o=5", "location": {"lat": 35.88888, "lon": -93.88888, "alt": 304}, @@ -2145,7 +2145,7 @@ def test_profile_from_yaml_maps_all_fields(): assert profile.long_name == "YAML Owner" assert profile.short_name == "YO" - assert profile.channel_url == "https://meshtastic.org/e/#test" + assert profile.channel_url == "https://meshtastic.org/f/#test" assert profile.canned_messages == "Hi|Bye" assert profile.ringtone == "24:d=32,o=5" assert profile.HasField("fixed_position") @@ -2165,12 +2165,12 @@ def test_profile_from_yaml_camelcase_keys(): """_profile_from_yaml() handles camelCase YAML keys""" configuration = { "ownerShort": "CB", - "channelUrl": "https://meshtastic.org/e/#camel", + "channelUrl": "https://meshtastic.org/f/#camel", } profile = _profile_from_yaml(configuration) assert profile.short_name == "CB" - assert profile.channel_url == "https://meshtastic.org/e/#camel" + assert profile.channel_url == "https://meshtastic.org/f/#camel" assert not profile.HasField("long_name") @@ -2340,7 +2340,7 @@ def test_main_export_config_binary_round_trip(tmp_path, capsys): iface = MagicMock(autospec=SerialInterface) iface.getLongName.return_value = "Round Trip" iface.getShortName.return_value = "RT" - iface.localNode.getURL.return_value = "https://meshtastic.org/e/#rt" + iface.localNode.getURL.return_value = "https://meshtastic.org/f/#rt" iface.getCannedMessage.return_value = "Yes|No" iface.getRingtone.return_value = None iface.getMyNodeInfo.return_value = { @@ -3610,7 +3610,7 @@ def test_remove_ignored_node(): @pytest.mark.usefixtures("reset_mt_config") def test_add_contact_url(): """Test --add-contact with a shareable URL""" - url = "https://meshtastic.org/v/#CKqkvZgIElEKCSE4MzBmNTIyYRIQUm9hZHJ1bm5lciBSaWRnZRoEUktTTiIGAAAAAAAAKAk4AkIgRxo_Fw_ergQIhRqBbrHasLYy3gU-Ay8hrhu4OVnIPQc=" # pylint: disable=line-too-long + url = "https://meshtastic.org/u/#CKqkvZgIElEKCSE4MzBmNTIyYRIQUm9hZHJ1bm5lciBSaWRnZRoEUktTTiIGAAAAAAAAKAk4AkIgRxo_Fw_ergQIhRqBbrHasLYy3gU-Ay8hrhu4OVnIPQc=" # pylint: disable=line-too-long sys.argv = ["", "--add-contact", url] mt_config.args = sys.argv mocked_node = MagicMock(autospec=Node) diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 308d31386..37afaaa9e 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -11,7 +11,7 @@ from ..protobuf import admin_pb2, common_pb2, config_pb2, localonly_pb2, nanopb_pb2, wire_pb2 from ..protobuf.channel_pb2 import Channel # pylint: disable=E0611 -from ..node import MAX_CHANNELS, Node, channel_role +from ..node import CHANNEL_URL_LETTER, CONTACT_URL_LETTER, MAX_CHANNELS, Node, channel_role, link_payload from ..serial_interface import SerialInterface from ..mesh_interface import MeshInterface from ..util import to_node_num @@ -335,7 +335,7 @@ def test_setURL_empty_url(capsys): def test_setURL_valid_URL_but_no_settings(capsys): """Test setURL""" iface = MagicMock(autospec=SerialInterface) - url = "https://www.meshtastic.org/d/#" + url = "https://meshtastic.org/f/#" with pytest.raises(SystemExit) as pytest_wrapped_e: anode = Node(iface, "bar", noProto=True) anode.radioConfig = "baz" @@ -347,6 +347,39 @@ def test_setURL_valid_URL_but_no_settings(capsys): assert err == "" +@pytest.mark.unit +@pytest.mark.parametrize("url", [ + # 2.x: parses under the 3.0 schema as a channel named 0x01 with a garbled LoRa config + "https://meshtastic.org/e/#CgMSAQESCDgBQANIAVAe", + # 1.2: parses under the 3.0 schema as one empty channel + "https://www.meshtastic.org/d/#CgUYAyIBAQ", +]) +def test_channel_link_refuses_older_generations(capsys, url): + """An older link decodes into the wrong 3.0 fields without an error, so its letter is refused""" + with pytest.raises(SystemExit) as e: + link_payload(url, CHANNEL_URL_LETTER, "channel") + assert e.value.code == 1 + assert "not a Meshtastic 3.0 channel link" in capsys.readouterr().out + + +@pytest.mark.unit +def test_contact_link_refuses_2x(capsys): + """A 2.x contact link (/v/) is refused; 3.0 contacts use /u/""" + with pytest.raises(SystemExit): + link_payload("https://meshtastic.org/v/#CKqkvZgIElEKCSE4MzBmNTIyYQ", CONTACT_URL_LETTER, "contact") + assert "not a Meshtastic 3.0 contact link" in capsys.readouterr().out + + +@pytest.mark.unit +def test_link_payload_restores_padding_and_reads_the_add_form(): + """Links drop base64 padding; the add-only form carries ?add=true and is accepted only as such""" + expected = bytes([0x0A, 0x03, 0x0A, 0x01, 0x01]) # ChannelSet { settings { psk: 0x01 } } + assert link_payload("https://meshtastic.org/f/#CgMKAQE", CHANNEL_URL_LETTER, "channel") == expected + assert link_payload("https://meshtastic.org/f/?add=true#CgMKAQE", CHANNEL_URL_LETTER, "channel", True) == expected + with pytest.raises(SystemExit): + link_payload("https://meshtastic.org/f/#CgMKAQE", CHANNEL_URL_LETTER, "channel", True) + + @pytest.mark.unit @pytest.mark.parametrize("node_id,node_data,should_ignore,manually_verified", [ pytest.param( @@ -445,7 +478,7 @@ def capture_send(p, *_args, **_kwargs): with patch.object(anode, "_sendAdmin", side_effect=capture_send): url = anode.getContactURL(node_id, should_ignore=should_ignore, manually_verified=manually_verified) - assert url.startswith("https://meshtastic.org/v/#") + assert url.startswith("https://meshtastic.org/u/#") anode.addContactURL(url) diff --git a/meshtastic/tests/test_smoke1.py b/meshtastic/tests/test_smoke1.py index e3dcc3a4a..309eb5d09 100644 --- a/meshtastic/tests/test_smoke1.py +++ b/meshtastic/tests/test_smoke1.py @@ -583,27 +583,27 @@ def test_smoke1_seturl_default(): time.sleep(PAUSE_AFTER_COMMAND) # ensure we no longer have a default primary channel return_value, out = subprocess.getstatusoutput("meshtastic --info") - assert not re.search("CgUYAyIBAQ", out, re.MULTILINE) + assert not re.search("CgMKAQE", out, re.MULTILINE) assert return_value == 0 - url = "https://www.meshtastic.org/d/#CgUYAyIBAQ" + url = "https://meshtastic.org/f/#CgMKAQE" return_value, out = subprocess.getstatusoutput(f"meshtastic --seturl {url}") assert re.match(r"Connected to radio", out) assert return_value == 0 # pause for the radio time.sleep(PAUSE_AFTER_COMMAND) return_value, out = subprocess.getstatusoutput("meshtastic --info") - assert re.search("CgUYAyIBAQ", out, re.MULTILINE) + assert re.search("CgMKAQE", out, re.MULTILINE) assert return_value == 0 @pytest.mark.smoke1 def test_smoke1_seturl_invalid_url(): - """Test --seturl with invalid url""" - # Note: This url is no longer a valid url. + """Test --seturl with a link from an older generation""" + # A 1.0 link: its letter is not the 3.0 /f/, so it is refused before decoding. url = "https://www.meshtastic.org/c/#GAMiENTxuzogKQdZ8Lz_q89Oab8qB0RlZmF1bHQ=" return_value, out = subprocess.getstatusoutput(f"meshtastic --seturl {url}") assert re.match(r"Connected to radio", out) - assert re.search("Warning: There were no settings", out, re.MULTILINE) + assert re.search("not a Meshtastic 3.0 channel link", out, re.MULTILINE) assert return_value == 1 # pause for the radio time.sleep(PAUSE_AFTER_COMMAND) diff --git a/meshtastic/tests/test_smokevirt.py b/meshtastic/tests/test_smokevirt.py index 35778dbb5..e50c3db60 100644 --- a/meshtastic/tests/test_smokevirt.py +++ b/meshtastic/tests/test_smokevirt.py @@ -394,7 +394,7 @@ def test_smokevirt_ch_del_needs_ch_index(firmware_node): @pytest.mark.smokevirt def test_smokevirt_seturl_default(firmware_node): """--seturl applies a known channel URL.""" - url = "https://www.meshtastic.org/d/#CgUYAyIBAQ" + url = "https://meshtastic.org/f/#CgMKAQE" # Use the fixture's already-connected TCPInterface so the same # connection handles the firmware restart after setURL. diff --git a/protobufs b/protobufs index bf6f3100e..d46c96884 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit bf6f3100e623c7f6ca9d1cd3420c2e073952db79 +Subproject commit d46c96884d4da8c8d22c5c35bc7d09e179a9965b From 20efc601f54812f0f1cbe70b95d46fc613697b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 20:40:31 +0200 Subject: [PATCH 06/24] Read MQTT uplink and downlink from Channel.flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - --ch-set uplink_enabled / downlink_enabled set CHANNEL_UPLINK and CHANNEL_DOWNLINK on the Channel; channel links no longer carry them. - --info shows each channel's bridging as mqtt=uplink,downlink or mqtt=off. - Smoke tests set scope SCOPE_GLOBAL before enabling uplink. - protobufs 86ff1e8. Signed-off-by: Thomas Göttgens --- meshtastic/__main__.py | 11 ++++ meshtastic/node.py | 5 +- meshtastic/protobuf/bitfields.py | 1 + meshtastic/protobuf/channel_pb2.py | 27 ++++++---- meshtastic/protobuf/channel_pb2.pyi | 63 ++++++++++++++++------- meshtastic/protobuf/module_config_pb2.pyi | 8 +-- meshtastic/tests/test_main.py | 21 ++++++++ meshtastic/tests/test_smoke1.py | 8 ++- meshtastic/tests/test_smokevirt.py | 14 ++--- protobufs | 2 +- 10 files changed, 116 insertions(+), 44 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index df9e32204..bc4153c9b 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -1045,6 +1045,15 @@ def setSimpleConfig(modem_preset): ch.settings.psk = meshtastic.util.fromPSK(pref[1]) else: found = setPref(ch.settings, pref[0], pref[1]) + if not found: + # MQTT bridging is the node's own Channel.flags, not the shared settings; the 2.x + # names uplink_enabled / downlink_enabled still select those bits + bit = meshtastic.util.find_bit(ch.DESCRIPTOR, pref[0].removesuffix("_enabled")) + if bit: + on = meshtastic.util.fromStr(pref[1]) + setattr(ch, bit[0], getattr(ch, bit[0]) | bit[1] if on else getattr(ch, bit[0]) & ~bit[1]) + print(f"Set {pref[0]} to {pref[1]}") + found = True if not found: category_settings = ["module_settings"] print( @@ -1065,6 +1074,8 @@ def setSimpleConfig(modem_preset): names.append(tmp_name) for temp_name in sorted(names): print(f" {temp_name}") + for bit_name in meshtastic.util.bitfield_bits(ch.DESCRIPTOR): + print(f"{bit_name}_enabled") enable = True # If we set any pref, assume the user wants to enable the channel diff --git a/meshtastic/node.py b/meshtastic/node.py index ffa948152..f4653eeb3 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -122,10 +122,13 @@ def showChannels(self): logger.debug(f"self.channels:{self.channels}") for c in self.channels: cStr = message_to_json(c.settings) + # MQTT bridging is the node's own Channel.flags, not part of the shared settings + mqtt = ",".join(f.removeprefix("CHANNEL_").lower() for f in flags_to_list(channel_pb2.Channel.Flags, c.flags)) # don't show disabled channels if channel_role(c) != "DISABLED": print( - f" Index {c.index}: {channel_role(c)} psk={pskToString(c.settings.psk)} {cStr}" + f" Index {c.index}: {channel_role(c)} psk={pskToString(c.settings.psk)} " + f"mqtt={mqtt or 'off'} {cStr}" ) publicURL = self.getURL(includeAll=False) adminURL = self.getURL(includeAll=True) diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py index 8e59e45c7..ab5ecbeb1 100644 --- a/meshtastic/protobuf/bitfields.py +++ b/meshtastic/protobuf/bitfields.py @@ -18,6 +18,7 @@ 'trees': ('terrain_flags', 8), 'ventilator': ('equipment_flags', 8), 'wires': ('terrain_flags', 16)}, + 'Channel': {'downlink': ('flags', 2), 'uplink': ('flags', 1)}, 'Data': {'ok_to_mqtt': ('bitfield', 1), 'want_response': ('bitfield', 2)}, 'DetectionSensorConfig': {'enabled': ('flags', 1), 'send_bell': ('flags', 2), diff --git a/meshtastic/protobuf/channel_pb2.py b/meshtastic/protobuf/channel_pb2.py index 5160e8c04..4f950b43a 100644 --- a/meshtastic/protobuf/channel_pb2.py +++ b/meshtastic/protobuf/channel_pb2.py @@ -12,10 +12,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!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xc2\x02\n\x0f\x43hannelSettings\x12\x12\n\x03psk\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x13\n\x04name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x0c\x12\n\n\x02id\x18\x03 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x04 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x05 \x01(\x08\x12<\n\x0fmodule_settings\x18\x06 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\x12\x39\n\x05scope\x18\x07 \x01(\x0e\x32*.meshtastic.protobuf.ChannelSettings.Scope\"O\n\x05Scope\x12\x0f\n\x0bSCOPE_UNSET\x10\x00\x12\x0f\n\x0bSCOPE_LOCAL\x10\x01\x12\x12\n\x0eSCOPE_REGIONAL\x10\x02\x12\x10\n\x0cSCOPE_GLOBAL\x10\x03\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"W\n\x07\x43hannel\x12\x14\n\x05index\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettingsBc\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/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\x90\x02\n\x0f\x43hannelSettings\x12\x12\n\x03psk\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x13\n\x04name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x0c\x12\n\n\x02id\x18\x03 \x01(\x07\x12<\n\x0fmodule_settings\x18\x04 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\x12\x39\n\x05scope\x18\x05 \x01(\x0e\x32*.meshtastic.protobuf.ChannelSettings.Scope\"O\n\x05Scope\x12\x0f\n\x0bSCOPE_UNSET\x10\x00\x12\x0f\n\x0bSCOPE_LOCAL\x10\x01\x12\x12\n\x0eSCOPE_REGIONAL\x10\x02\x12\x10\n\x0cSCOPE_GLOBAL\x10\x03\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"\xd4\x02\n\x07\x43hannel\x12\x14\n\x05index\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\xe4\x01\n\x05\x46lags\x12\x10\n\x0c\x43HANNEL_NONE\x10\x00\x12Y\n\x0e\x43HANNEL_UPLINK\x10\x01\x1a\x45\xca\xf3\x18\x41:\x0eUplink EnabledB/Send this channel\'s messages to the MQTT broker\x12n\n\x10\x43HANNEL_DOWNLINK\x10\x02\x1aX\xca\xf3\x18T:\x10\x44ownlink EnabledB@Forward this channel\'s messages from the MQTT broker to the meshBc\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) @@ -27,14 +28,22 @@ _globals['_CHANNELSETTINGS'].fields_by_name['psk']._serialized_options = b'\222?\002\010 ' _globals['_CHANNELSETTINGS'].fields_by_name['name']._options = None _globals['_CHANNELSETTINGS'].fields_by_name['name']._serialized_options = b'\222?\002\010\014' + _globals['_CHANNEL_FLAGS'].values_by_name["CHANNEL_UPLINK"]._options = None + _globals['_CHANNEL_FLAGS'].values_by_name["CHANNEL_UPLINK"]._serialized_options = b'\312\363\030A:\016Uplink EnabledB/Send this channel\'s messages to the MQTT broker' + _globals['_CHANNEL_FLAGS'].values_by_name["CHANNEL_DOWNLINK"]._options = None + _globals['_CHANNEL_FLAGS'].values_by_name["CHANNEL_DOWNLINK"]._serialized_options = b'\312\363\030T:\020Downlink EnabledB@Forward this channel\'s messages from the MQTT broker to the mesh' _globals['_CHANNEL'].fields_by_name['index']._options = None _globals['_CHANNEL'].fields_by_name['index']._serialized_options = b'\222?\0028\010' - _globals['_CHANNELSETTINGS']._serialized_start=93 - _globals['_CHANNELSETTINGS']._serialized_end=415 - _globals['_CHANNELSETTINGS_SCOPE']._serialized_start=336 - _globals['_CHANNELSETTINGS_SCOPE']._serialized_end=415 - _globals['_MODULESETTINGS']._serialized_start=417 - _globals['_MODULESETTINGS']._serialized_end=479 - _globals['_CHANNEL']._serialized_start=481 - _globals['_CHANNEL']._serialized_end=568 + _globals['_CHANNEL'].fields_by_name['flags']._options = None + _globals['_CHANNEL'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' + _globals['_CHANNELSETTINGS']._serialized_start=135 + _globals['_CHANNELSETTINGS']._serialized_end=407 + _globals['_CHANNELSETTINGS_SCOPE']._serialized_start=328 + _globals['_CHANNELSETTINGS_SCOPE']._serialized_end=407 + _globals['_MODULESETTINGS']._serialized_start=409 + _globals['_MODULESETTINGS']._serialized_end=471 + _globals['_CHANNEL']._serialized_start=474 + _globals['_CHANNEL']._serialized_end=814 + _globals['_CHANNEL_FLAGS']._serialized_start=586 + _globals['_CHANNEL_FLAGS']._serialized_end=814 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/channel_pb2.pyi b/meshtastic/protobuf/channel_pb2.pyi index b6c5aafd9..a1f783299 100644 --- a/meshtastic/protobuf/channel_pb2.pyi +++ b/meshtastic/protobuf/channel_pb2.pyi @@ -67,12 +67,12 @@ class ChannelSettings(_message.Message): Intended reach of this channel. It travels in the channel URL, so everyone who joins the channel launches its traffic the same way. - Scope caps the hop_start a node launches with on this channel, decides whether - uplink_enabled may be set, and tells congestion control whether it may raise that - cap. It is a sender-side rule: a relay cannot read it, and enforces reach with + Scope caps the hop_start a node launches with on this channel, decides whether a + node may set CHANNEL_UPLINK on it, and tells congestion control whether it may raise + that cap. It is a sender-side rule: a relay cannot read it, and enforces reach with RelayConfig instead. - | scope | launch hop_start | uplink_enabled | congestion control may raise | + | scope | launch hop_start | CHANNEL_UPLINK | congestion control may raise | |----------|------------------|----------------|------------------------------| | LOCAL | 2 | refused | no | | REGIONAL | region default | refused | yes, to the region maximum | @@ -95,8 +95,6 @@ class ChannelSettings(_message.Message): PSK_FIELD_NUMBER: _builtins.int NAME_FIELD_NUMBER: _builtins.int ID_FIELD_NUMBER: _builtins.int - UPLINK_ENABLED_FIELD_NUMBER: _builtins.int - DOWNLINK_ENABLED_FIELD_NUMBER: _builtins.int MODULE_SETTINGS_FIELD_NUMBER: _builtins.int SCOPE_FIELD_NUMBER: _builtins.int psk: _builtins.bytes @@ -134,14 +132,6 @@ class ChannelSettings(_message.Message): A channel shared by name alone, with no id and the default PSK, is as insecure as its name is public; a sender that wants privacy generates both. """ - uplink_enabled: _builtins.bool - """ - If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe - """ - downlink_enabled: _builtins.bool - """ - If true, messages seen on the internet will be forwarded to the local mesh. - """ scope: Global___ChannelSettings.Scope.ValueType """ Intended reach of this channel, enforced by senders. @@ -158,14 +148,12 @@ class ChannelSettings(_message.Message): psk: _builtins.bytes = ..., name: _builtins.str = ..., id: _builtins.int = ..., - uplink_enabled: _builtins.bool = ..., - downlink_enabled: _builtins.bool = ..., module_settings: Global___ModuleSettings | None = ..., scope: Global___ChannelSettings.Scope.ValueType = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _typing.Literal["module_settings", b"module_settings"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "scope", b"scope", "uplink_enabled", b"uplink_enabled"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "scope", b"scope"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -212,8 +200,42 @@ class Channel(_message.Message): DESCRIPTOR: _descriptor.Descriptor + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[Channel._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + CHANNEL_NONE: Channel._Flags.ValueType # 0 + """Not bridged""" + CHANNEL_UPLINK: Channel._Flags.ValueType # 1 + """ + Publish this channel's traffic to the MQTT broker. Only a SCOPE_GLOBAL channel may + set it. + """ + CHANNEL_DOWNLINK: Channel._Flags.ValueType # 2 + """Forward this channel's traffic from the MQTT broker to the mesh""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + What this node does with the channel on MQTT. These belong to the node, not the + channel: a channel URL carries settings only, so joining a channel never makes a node + a gateway for it. + """ + + CHANNEL_NONE: Channel.Flags.ValueType # 0 + """Not bridged""" + CHANNEL_UPLINK: Channel.Flags.ValueType # 1 + """ + Publish this channel's traffic to the MQTT broker. Only a SCOPE_GLOBAL channel may + set it. + """ + CHANNEL_DOWNLINK: Channel.Flags.ValueType # 2 + """Forward this channel's traffic from the MQTT broker to the mesh""" + INDEX_FIELD_NUMBER: _builtins.int SETTINGS_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int index: _builtins.int """ The index of this channel in the channel table, 0 to MAX_NUM_CHANNELS-1. @@ -224,6 +246,10 @@ class Channel(_message.Message): decrypting traffic on that same frequency. Position carries this distinction, so no role field states it. """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ @_builtins.property def settings(self) -> Global___ChannelSettings: """ @@ -235,10 +261,11 @@ class Channel(_message.Message): *, index: _builtins.int = ..., settings: Global___ChannelSettings | None = ..., + flags: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _typing.Literal["settings", b"settings"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["index", b"index", "settings", b"settings"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "index", b"index", "settings", b"settings"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 85fff4fae..62d68d5bf 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -75,8 +75,8 @@ class MQTTConfig(_message.Message): """Nothing enabled""" MQTT_ENABLED: MQTTConfig._Flags.ValueType # 1 """ - Gateway any channels marked is_uplink_enabled or is_downlink_enabled, when - this node can reach the internet. + Gateway every channel whose Channel.flags has CHANNEL_UPLINK or CHANNEL_DOWNLINK, + when this node can reach the internet. """ MQTT_ENCRYPTION: MQTTConfig._Flags.ValueType # 2 """ @@ -100,8 +100,8 @@ class MQTTConfig(_message.Message): """Nothing enabled""" MQTT_ENABLED: MQTTConfig.Flags.ValueType # 1 """ - Gateway any channels marked is_uplink_enabled or is_downlink_enabled, when - this node can reach the internet. + Gateway every channel whose Channel.flags has CHANNEL_UPLINK or CHANNEL_DOWNLINK, + when this node can reach the internet. """ MQTT_ENCRYPTION: MQTTConfig.Flags.ValueType # 2 """ diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index f86578292..ea4b8ad28 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -3407,6 +3407,27 @@ def test_main_ch_set_psk_with_ch_index(capsys): mo.assert_called() +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_ch_set_uplink_sets_channel_flags(capsys): + """--ch-set uplink_enabled / downlink_enabled set the node's own Channel.flags, which a channel + link does not carry, rather than the shared settings""" + sys.argv = ["", "--ch-set", "uplink_enabled", "true", "--ch-set", "downlink_enabled", "true", "--ch-index", "0"] + mt_config.args = sys.argv + ch = Channel(index=0) + ch.settings.name = "bridge" + node = MagicMock(autospec=Node) + node.channels = [ch] + iface = MagicMock(autospec=SerialInterface) + iface.getNode.return_value = node + with patch("meshtastic.serial_interface.SerialInterface", return_value=iface): + main() + out, _ = capsys.readouterr() + assert "Set uplink_enabled to true" in out + assert ch.flags == Channel.CHANNEL_UPLINK | Channel.CHANNEL_DOWNLINK + node.writeChannel.assert_called_once_with(0) + + # TODO # doesn't work properly with nested/module config stuff #@pytest.mark.unit diff --git a/meshtastic/tests/test_smoke1.py b/meshtastic/tests/test_smoke1.py index 309eb5d09..7db9d41b1 100644 --- a/meshtastic/tests/test_smoke1.py +++ b/meshtastic/tests/test_smoke1.py @@ -315,13 +315,12 @@ def test_smoke1_ch_set_downlink_and_uplink(): # pause for the radio time.sleep(PAUSE_AFTER_COMMAND) return_value, out = subprocess.getstatusoutput("meshtastic --info") - assert not re.search(r"uplinkEnabled", out, re.MULTILINE) - assert not re.search(r"downlinkEnabled", out, re.MULTILINE) + assert re.search(r"Index 0: PRIMARY .*mqtt=off", out, re.MULTILINE) assert return_value == 0 # pause for the radio time.sleep(PAUSE_AFTER_COMMAND) return_value, out = subprocess.getstatusoutput( - "meshtastic --ch-set downlink_enabled true --ch-set uplink_enabled true --ch-index 0" + "meshtastic --ch-set scope SCOPE_GLOBAL --ch-set downlink_enabled true --ch-set uplink_enabled true --ch-index 0" ) assert re.match(r"Connected to radio", out) assert re.search(r"^Set downlink_enabled to true", out, re.MULTILINE) @@ -330,8 +329,7 @@ def test_smoke1_ch_set_downlink_and_uplink(): # pause for the radio time.sleep(PAUSE_AFTER_COMMAND) return_value, out = subprocess.getstatusoutput("meshtastic --info") - assert re.search(r"uplinkEnabled", out, re.MULTILINE) - assert re.search(r"downlinkEnabled", out, re.MULTILINE) + assert re.search(r"Index 0: PRIMARY .*mqtt=uplink,downlink", out, re.MULTILINE) assert return_value == 0 diff --git a/meshtastic/tests/test_smokevirt.py b/meshtastic/tests/test_smokevirt.py index e50c3db60..30586d400 100644 --- a/meshtastic/tests/test_smokevirt.py +++ b/meshtastic/tests/test_smokevirt.py @@ -26,7 +26,7 @@ import pytest from meshtastic.node import channel_role -from meshtastic.protobuf import common_pb2, config_pb2 +from meshtastic.protobuf import channel_pb2, common_pb2, config_pb2 from .fw_helpers import ( PAUSE_AFTER_CLI, @@ -287,12 +287,14 @@ def check(iface): @pytest.mark.smokevirt def test_smokevirt_ch_set_downlink_uplink(firmware_node): - """--ch-set downlink_enabled/uplink_enabled flips both flags.""" + """--ch-set downlink_enabled/uplink_enabled flips both Channel.flags bits (the node's own + MQTT choice, not part of the shared settings). Only a SCOPE_GLOBAL channel may uplink.""" + bridged = channel_pb2.Channel.CHANNEL_UPLINK | channel_pb2.Channel.CHANNEL_DOWNLINK + def check_disabled(iface): ch = _channel(iface, 0) assert ch is not None - assert ch.settings.downlink_enabled is False, ch - assert ch.settings.uplink_enabled is False, ch + assert ch.flags & bridged == 0, ch cli_then_verify( firmware_node.port, @@ -307,12 +309,12 @@ def check_disabled(iface): def check_enabled(iface): ch = _channel(iface, 0) assert ch is not None - assert ch.settings.downlink_enabled is True, ch - assert ch.settings.uplink_enabled is True, ch + assert ch.flags & bridged == bridged, ch cli_then_verify( firmware_node.port, [ + "--ch-set", "scope", "SCOPE_GLOBAL", "--ch-set", "downlink_enabled", "true", "--ch-set", "uplink_enabled", "true", "--ch-index", "0", diff --git a/protobufs b/protobufs index d46c96884..86ff1e83e 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit d46c96884d4da8c8d22c5c35bc7d09e179a9965b +Subproject commit 86ff1e83ea4b18a4f17bb30d46ecc94aa16f4a13 From 27b16585a8e76566854b772798a9ada3b66b586c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 21:07:32 +0200 Subject: [PATCH 07/24] Follow the renamed duration fields; uptime in minutes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - protobufs da3299b: _secs on config durations, SerialConfig.timeout_ms, DeviceMetrics.uptime_minutes. - Telemetry display and the device-metrics send path use uptime_minutes. - Example config and profile test use the new names. Signed-off-by: Thomas Göttgens --- example_config.yaml | 4 +- meshtastic/mesh_interface.py | 10 +- meshtastic/protobuf/admin_pb2.py | 89 +++++++------- meshtastic/protobuf/admin_pb2.pyi | 18 +-- meshtastic/protobuf/config_pb2.py | 124 +++++++++---------- meshtastic/protobuf/config_pb2.pyi | 8 +- meshtastic/protobuf/device_ui_pb2.py | 55 +++++---- meshtastic/protobuf/device_ui_pb2.pyi | 10 +- meshtastic/protobuf/module_config_pb2.py | 142 +++++++++++----------- meshtastic/protobuf/module_config_pb2.pyi | 49 ++++---- meshtastic/protobuf/telemetry_pb2.py | 2 +- meshtastic/protobuf/telemetry_pb2.pyi | 20 +-- meshtastic/tests/test_main.py | 4 +- protobufs | 2 +- 14 files changed, 273 insertions(+), 264 deletions(-) diff --git a/example_config.yaml b/example_config.yaml index 3870116c1..d5b6d734c 100644 --- a/example_config.yaml +++ b/example_config.yaml @@ -30,7 +30,7 @@ config: position: gpsAttemptTime: 900 gpsEnabled: true - gpsUpdateInterval: 120 + gpsUpdateIntervalSecs: 120 positionBroadcastSecs: 900 positionBroadcastSmartEnabled: true positionFlags: 3 @@ -42,5 +42,5 @@ config: module_config: telemetry: - deviceUpdateInterval: 900 + deviceUpdateIntervalSecs: 900 environmentUpdateInterval: 900 diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index e5bf83348..e8778e68e 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -756,9 +756,9 @@ def sendTelemetry( air_util_tx = metrics.get("airUtilTx") if air_util_tx is not None: r.device_metrics.air_util_tx = air_util_tx - uptime_seconds = metrics.get("uptimeSeconds") - if uptime_seconds is not None: - r.device_metrics.uptime_seconds = uptime_seconds + uptime_minutes = metrics.get("uptimeMinutes") + if uptime_minutes is not None: + r.device_metrics.uptime_minutes = uptime_minutes if wantResponse: onResponse = self.onResponseTelemetry @@ -796,8 +796,8 @@ def onResponseTelemetry(self, p: dict): print(f"Total channel utilization: {m.channel_utilization / 100:.2f}%") if m.HasField("air_util_tx"): print(f"Transmit air utilization: {m.air_util_tx / 100:.2f}%") - if m.HasField("uptime_seconds"): - print(f"Uptime: {m.uptime_seconds} s") + if m.HasField("uptime_minutes"): + print(f"Uptime: {m.uptime_minutes} min") elif telemetry.HasField("sensor_readings"): for sample in sensor_readings_to_list(telemetry.sensor_readings, telemetry.time): print(f"sensorReadings at {sample.pop('time')}:") diff --git a/meshtastic/protobuf/admin_pb2.py b/meshtastic/protobuf/admin_pb2.py index baa970d38..cd946d619 100644 --- a/meshtastic/protobuf/admin_pb2.py +++ b/meshtastic/protobuf/admin_pb2.py @@ -17,12 +17,13 @@ from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 from meshtastic.protobuf import connection_status_pb2 as meshtastic_dot_protobuf_dot_connection__status__pb2 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 module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 from meshtastic.protobuf import wire_pb2 as meshtastic_dot_protobuf_dot_wire__pb2 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/common.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb7\x1e\n\x0c\x41\x64minMessage\x12\x1e\n\x0fsession_passkey\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08\x08\x12\x1d\n\x13get_channel_request\x18\x02 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x03 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x04 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x05 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x06 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12\x41\n\x13get_config_response\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12W\n\x19get_module_config_request\x18\x08 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12N\n\x1aget_module_config_response\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\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\xe7\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\x80\x02H\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\x1c \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18\x1d \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\nset_config\x18\x1e \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12\x45\n\x11set_module_config\x18\x1f \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12\x34\n\"set_canned_message_module_messages\x18 \x01(\tB\x06\x92?\x03\x08\xe7\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, \x01(\rH\x00\x12\x1b\n\x11toggle_muted_node\x18- \x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18. \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18/ \x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x30 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x31 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18\x32 \x01(\x11H\x00\x12\x18\n\x0e\x65xit_simulator\x18\x33 \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x34 \x01(\x11H\x00\x12\x1a\n\x10shutdown_seconds\x18\x35 \x01(\x11H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x36 \x01(\x11H\x00\x12\x16\n\x0cnodedb_reset\x18\x37 \x01(\x08H\x00\x12\x41\n\x0bota_request\x18\x38 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18\x39 \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18: \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1a\x96\x01\n\nInputEvent\x12@\n\nevent_code\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB\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 \"\xfa\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\x12\x10\n\x0cRELAY_CONFIG\x10\n\x12\x10\n\x0cGROUP_CONFIG\x10\x0b\"\x84\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\x10TELEMETRY_CONFIG\x10\x04\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x05\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x06\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x07\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\x08\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\t\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\n\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0b\x12\x18\n\x14STATUSMESSAGE_CONFIG\x10\x0c\x12\x1c\n\x18TRAFFICMANAGEMENT_CONFIG\x10\r\x12\x0e\n\nTAK_CONFIG\x10\x0e\x12\x15\n\x11MESHBEACON_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\"\xa4\x01\n\x0cLockdownAuth\x12\x19\n\npassphrase\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\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(\x11\x12\x11\n\tfrequency\x18\x03 \x01(\r\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(\x07\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(\x11H\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(\x11H\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(\x11H\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(\x11H\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\"A\n\x0cSHTXX_config\x12 \n\x0cset_accuracy\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x0f\n\r_set_accuracy\"Z\n\rDS248X_config\x12,\n\x18main_temperature_channel\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x1b\n\x19_main_temperature_channel\"L\n\rAS3935_config\x12%\n\x11set_tuning_cap_pf\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb7\x1e\n\x0c\x41\x64minMessage\x12\x1e\n\x0fsession_passkey\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08\x08\x12\x1d\n\x13get_channel_request\x18\x02 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x03 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x04 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x05 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x06 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12\x41\n\x13get_config_response\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12W\n\x19get_module_config_request\x18\x08 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12N\n\x1aget_module_config_response\x18\t \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\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\xe7\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\x80\x02H\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\x1c \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18\x1d \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x38\n\nset_config\x18\x1e \x01(\x0b\x32\".meshtastic.protobuf.ConfigPayloadH\x00\x12\x45\n\x11set_module_config\x18\x1f \x01(\x0b\x32(.meshtastic.protobuf.ModuleConfigPayloadH\x00\x12\x34\n\"set_canned_message_module_messages\x18 \x01(\tB\x06\x92?\x03\x08\xe7\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, \x01(\rH\x00\x12\x1b\n\x11toggle_muted_node\x18- \x01(\rH\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18. \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18/ \x01(\x08H\x00\x12\x39\n\x0b\x61\x64\x64_contact\x18\x30 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x31 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18\x32 \x01(\x11H\x00\x12\x18\n\x0e\x65xit_simulator\x18\x33 \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x34 \x01(\x11H\x00\x12\x1a\n\x10shutdown_seconds\x18\x35 \x01(\x11H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x36 \x01(\x11H\x00\x12\x16\n\x0cnodedb_reset\x18\x37 \x01(\x08H\x00\x12\x41\n\x0bota_request\x18\x38 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18\x39 \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18: \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1a\x96\x01\n\nInputEvent\x12@\n\nevent_code\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB\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 \"\xfa\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\x12\x10\n\x0cRELAY_CONFIG\x10\n\x12\x10\n\x0cGROUP_CONFIG\x10\x0b\"\x84\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\x10TELEMETRY_CONFIG\x10\x04\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x05\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x06\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x07\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\x08\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\t\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\n\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0b\x12\x18\n\x14STATUSMESSAGE_CONFIG\x10\x0c\x12\x1c\n\x18TRAFFICMANAGEMENT_CONFIG\x10\r\x12\x0e\n\nTAK_CONFIG\x10\x0e\x12\x15\n\x11MESHBEACON_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\"\xa4\x01\n\x0cLockdownAuth\x12\x19\n\npassphrase\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1e\n\x0f\x62oots_remaining\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\x07\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(\x11\x12\x11\n\tfrequency\x18\x03 \x01(\r\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(\x07\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(\x11H\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(\x11H\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(\x11H\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\"\xc7\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(\x11H\x02\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x33\n\x1dset_measurement_interval_secs\x18\x05 \x01(\rB\x07\xca\xf3\x18\x03*\x01sH\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 \n\x1e_set_measurement_interval_secsB\r\n\x0b_soft_reset\"A\n\x0cSHTXX_config\x12 \n\x0cset_accuracy\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x0f\n\r_set_accuracy\"Z\n\rDS248X_config\x12,\n\x18main_temperature_channel\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x1b\n\x19_main_temperature_channel\"L\n\rAS3935_config\x12%\n\x11set_tuning_cap_pf\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\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) @@ -64,52 +65,54 @@ _globals['_HAMPARAMETERS'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\017' _globals['_NODEREMOTEHARDWAREPINSRESPONSE'].fields_by_name['node_remote_hardware_pins']._options = None _globals['_NODEREMOTEHARDWAREPINSRESPONSE'].fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\020' + _globals['_SCD30_CONFIG'].fields_by_name['set_measurement_interval_secs']._options = None + _globals['_SCD30_CONFIG'].fields_by_name['set_measurement_interval_secs']._serialized_options = b'\312\363\030\003*\001s' _globals['_SHTXX_CONFIG'].fields_by_name['set_accuracy']._options = None _globals['_SHTXX_CONFIG'].fields_by_name['set_accuracy']._serialized_options = b'\222?\0028\010' _globals['_DS248X_CONFIG'].fields_by_name['main_temperature_channel']._options = None _globals['_DS248X_CONFIG'].fields_by_name['main_temperature_channel']._serialized_options = b'\222?\0028\010' _globals['_AS3935_CONFIG'].fields_by_name['set_tuning_cap_pf']._options = None _globals['_AS3935_CONFIG'].fields_by_name['set_tuning_cap_pf']._serialized_options = b'\222?\0028\010' - _globals['_OTAMODE']._serialized_start=7010 - _globals['_OTAMODE']._serialized_end=7065 - _globals['_ADMINMESSAGE']._serialized_start=349 - _globals['_ADMINMESSAGE']._serialized_end=4244 - _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3302 - _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3452 - _globals['_ADMINMESSAGE_OTAEVENT']._serialized_start=3454 - _globals['_ADMINMESSAGE_OTAEVENT']._serialized_end=3544 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3547 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3797 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3800 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=4188 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=4190 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=4225 - _globals['_LOCKDOWNAUTH']._serialized_start=4247 - _globals['_LOCKDOWNAUTH']._serialized_end=4411 - _globals['_HAMPARAMETERS']._serialized_start=4414 - _globals['_HAMPARAMETERS']._serialized_end=4545 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=4547 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=4665 - _globals['_SHAREDCONTACT']._serialized_start=4667 - _globals['_SHAREDCONTACT']._serialized_end=4791 - _globals['_KEYVERIFICATIONADMIN']._serialized_start=4794 - _globals['_KEYVERIFICATIONADMIN']._serialized_end=5087 - _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4964 - _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=5067 - _globals['_SENSORCONFIG']._serialized_start=5090 - _globals['_SENSORCONFIG']._serialized_end=5507 - _globals['_SCD4X_CONFIG']._serialized_start=5510 - _globals['_SCD4X_CONFIG']._serialized_end=5864 - _globals['_SEN5X_CONFIG']._serialized_start=5867 - _globals['_SEN5X_CONFIG']._serialized_end=6041 - _globals['_SEN6X_CONFIG']._serialized_start=6044 - _globals['_SEN6X_CONFIG']._serialized_end=6460 - _globals['_SCD30_CONFIG']._serialized_start=6463 - _globals['_SCD30_CONFIG']._serialized_end=6771 - _globals['_SHTXX_CONFIG']._serialized_start=6773 - _globals['_SHTXX_CONFIG']._serialized_end=6838 - _globals['_DS248X_CONFIG']._serialized_start=6840 - _globals['_DS248X_CONFIG']._serialized_end=6930 - _globals['_AS3935_CONFIG']._serialized_start=6932 - _globals['_AS3935_CONFIG']._serialized_end=7008 + _globals['_OTAMODE']._serialized_start=7071 + _globals['_OTAMODE']._serialized_end=7126 + _globals['_ADMINMESSAGE']._serialized_start=391 + _globals['_ADMINMESSAGE']._serialized_end=4286 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3344 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3494 + _globals['_ADMINMESSAGE_OTAEVENT']._serialized_start=3496 + _globals['_ADMINMESSAGE_OTAEVENT']._serialized_end=3586 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3589 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3839 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3842 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=4230 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=4232 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=4267 + _globals['_LOCKDOWNAUTH']._serialized_start=4289 + _globals['_LOCKDOWNAUTH']._serialized_end=4453 + _globals['_HAMPARAMETERS']._serialized_start=4456 + _globals['_HAMPARAMETERS']._serialized_end=4587 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=4589 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=4707 + _globals['_SHAREDCONTACT']._serialized_start=4709 + _globals['_SHAREDCONTACT']._serialized_end=4833 + _globals['_KEYVERIFICATIONADMIN']._serialized_start=4836 + _globals['_KEYVERIFICATIONADMIN']._serialized_end=5129 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=5006 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=5109 + _globals['_SENSORCONFIG']._serialized_start=5132 + _globals['_SENSORCONFIG']._serialized_end=5549 + _globals['_SCD4X_CONFIG']._serialized_start=5552 + _globals['_SCD4X_CONFIG']._serialized_end=5906 + _globals['_SEN5X_CONFIG']._serialized_start=5909 + _globals['_SEN5X_CONFIG']._serialized_end=6083 + _globals['_SEN6X_CONFIG']._serialized_start=6086 + _globals['_SEN6X_CONFIG']._serialized_end=6502 + _globals['_SCD30_CONFIG']._serialized_start=6505 + _globals['_SCD30_CONFIG']._serialized_end=6832 + _globals['_SHTXX_CONFIG']._serialized_start=6834 + _globals['_SHTXX_CONFIG']._serialized_end=6899 + _globals['_DS248X_CONFIG']._serialized_start=6901 + _globals['_DS248X_CONFIG']._serialized_end=6991 + _globals['_AS3935_CONFIG']._serialized_start=6993 + _globals['_AS3935_CONFIG']._serialized_end=7069 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index d56312f8e..7638d5858 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -1505,7 +1505,7 @@ class SCD30_config(_message.Message): SET_TARGET_CO2_CONC_FIELD_NUMBER: _builtins.int SET_TEMPERATURE_FIELD_NUMBER: _builtins.int SET_ALTITUDE_FIELD_NUMBER: _builtins.int - SET_MEASUREMENT_INTERVAL_FIELD_NUMBER: _builtins.int + SET_MEASUREMENT_INTERVAL_SECS_FIELD_NUMBER: _builtins.int SOFT_RESET_FIELD_NUMBER: _builtins.int set_asc: _builtins.bool """ @@ -1523,9 +1523,9 @@ class SCD30_config(_message.Message): """ Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure) """ - set_measurement_interval: _builtins.int + set_measurement_interval_secs: _builtins.int """ - Power mode for sensor (true for low power, false for normal) + Seconds between measurements, 2..1800 """ soft_reset: _builtins.bool """ @@ -1538,19 +1538,19 @@ class SCD30_config(_message.Message): set_target_co2_conc: _builtins.int | None = ..., set_temperature: _builtins.int | None = ..., set_altitude: _builtins.int | None = ..., - set_measurement_interval: _builtins.int | None = ..., + set_measurement_interval_secs: _builtins.int | None = ..., soft_reset: _builtins.bool | None = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval_secs", b"_set_measurement_interval_secs", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval_secs", b"set_measurement_interval_secs", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval", b"_set_measurement_interval", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval", b"set_measurement_interval", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude", "_set_asc", b"_set_asc", "_set_measurement_interval_secs", b"_set_measurement_interval_secs", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_soft_reset", b"_soft_reset", "set_altitude", b"set_altitude", "set_asc", b"set_asc", "set_measurement_interval_secs", b"set_measurement_interval_secs", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "soft_reset", b"soft_reset"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... _WhichOneofReturnType__set_altitude: _TypeAlias = _typing.Literal["set_altitude"] # noqa: Y015 _WhichOneofArgType__set_altitude: _TypeAlias = _typing.Literal["_set_altitude", b"_set_altitude"] # noqa: Y015 _WhichOneofReturnType__set_asc: _TypeAlias = _typing.Literal["set_asc"] # noqa: Y015 _WhichOneofArgType__set_asc: _TypeAlias = _typing.Literal["_set_asc", b"_set_asc"] # noqa: Y015 - _WhichOneofReturnType__set_measurement_interval: _TypeAlias = _typing.Literal["set_measurement_interval"] # noqa: Y015 - _WhichOneofArgType__set_measurement_interval: _TypeAlias = _typing.Literal["_set_measurement_interval", b"_set_measurement_interval"] # noqa: Y015 + _WhichOneofReturnType__set_measurement_interval_secs: _TypeAlias = _typing.Literal["set_measurement_interval_secs"] # noqa: Y015 + _WhichOneofArgType__set_measurement_interval_secs: _TypeAlias = _typing.Literal["_set_measurement_interval_secs", b"_set_measurement_interval_secs"] # noqa: Y015 _WhichOneofReturnType__set_target_co2_conc: _TypeAlias = _typing.Literal["set_target_co2_conc"] # noqa: Y015 _WhichOneofArgType__set_target_co2_conc: _TypeAlias = _typing.Literal["_set_target_co2_conc", b"_set_target_co2_conc"] # noqa: Y015 _WhichOneofReturnType__set_temperature: _TypeAlias = _typing.Literal["set_temperature"] # noqa: Y015 @@ -1562,7 +1562,7 @@ class SCD30_config(_message.Message): @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__set_asc) -> _WhichOneofReturnType__set_asc | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType__set_measurement_interval) -> _WhichOneofReturnType__set_measurement_interval | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType__set_measurement_interval_secs) -> _WhichOneofReturnType__set_measurement_interval_secs | None: ... @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__set_target_co2_conc) -> _WhichOneofReturnType__set_target_co2_conc | None: ... @_typing.overload diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index c0a58c5b3..9e527f734 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xec\x16\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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^\n\x13gps_update_interval\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xec\x16\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -93,8 +93,8 @@ _globals['_POSITIONCONFIG'].fields_by_name['position_broadcast_smart_enabled']._serialized_options = b'\312\363\030\020:\016Smart Position' _globals['_POSITIONCONFIG'].fields_by_name['fixed_position']._options = None _globals['_POSITIONCONFIG'].fields_by_name['fixed_position']._serialized_options = b'\312\363\030\224\001:\016Fixed PositionB\201\001The last known latitude, longitude and altitude are broadcast over the mesh on the position interval, rather than a live GPS fix.' - _globals['_POSITIONCONFIG'].fields_by_name['gps_update_interval']._options = None - _globals['_POSITIONCONFIG'].fields_by_name['gps_update_interval']._serialized_options = b'\312\363\030=*\001s:\017Update IntervalB\'How often to try to get a GPS position.' + _globals['_POSITIONCONFIG'].fields_by_name['gps_update_interval_secs']._options = None + _globals['_POSITIONCONFIG'].fields_by_name['gps_update_interval_secs']._serialized_options = b'\312\363\030=*\001s:\017Update IntervalB\'How often to try to get a GPS position.' _globals['_POSITIONCONFIG'].fields_by_name['position_flags']._options = None _globals['_POSITIONCONFIG'].fields_by_name['position_flags']._serialized_options = b'\312\363\030N:\016Position FlagsB None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_en_gpio", b"gps_en_gpio", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_en_gpio", b"gps_en_gpio", "gps_mode", b"gps_mode", "gps_update_interval_secs", b"gps_update_interval_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index 41d7ca8f1..b5e50c2cf 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -12,10 +12,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#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xd1\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08pin_code\x18\x05 \x01(\r\x12)\n\x05theme\x18\x06 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x1b\n\x0cring_tone_id\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12/\n\x08language\x18\x08 \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\t \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\n \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x1f\n\x10\x63\x61libration_data\x18\x0b \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12*\n\x08map_data\x18\x0c \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12=\n\x0c\x63ompass_mode\x18\r \x01(\x0e\x32 .meshtastic.protobuf.CompassModeB\x05\x92?\x02\x38\x08\x12\x18\n\x10screen_rgb_color\x18\x0e \x01(\r\x12R\n\ngps_format\x18\x0f \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormatB\x05\x92?\x02\x38\x08\"\x87\x01\n\x05\x46lags\x12\x0b\n\x07UI_NONE\x10\x00\x12\x12\n\x0eUI_SCREEN_LOCK\x10\x01\x12\x14\n\x10UI_SETTINGS_LOCK\x10\x02\x12\x14\n\x10UI_ALERT_ENABLED\x10\x04\x12\x15\n\x11UI_BANNER_ENABLED\x10\x08\x12\x1a\n\x16UI_IS_CLOCKFACE_ANALOG\x10\x10\"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\"\xdc\x01\n\nNodeFilter\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\thops_away\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x16\n\x07\x63hannel\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\"l\n\x05\x46lags\x12\x0f\n\x0b\x46ILTER_NONE\x10\x00\x12\x12\n\x0e\x46ILTER_UNKNOWN\x10\x01\x12\x12\n\x0e\x46ILTER_OFFLINE\x10\x02\x12\x15\n\x11\x46ILTER_PUBLIC_KEY\x10\x04\x12\x13\n\x0f\x46ILTER_POSITION\x10\x08\"\xb4\x01\n\rNodeHighlight\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x10\"s\n\x05\x46lags\x12\x12\n\x0eHIGHLIGHT_NONE\x10\x00\x12\x12\n\x0eHIGHLIGHT_CHAT\x10\x01\x12\x16\n\x12HIGHLIGHT_POSITION\x10\x02\x12\x17\n\x13HIGHLIGHT_TELEMETRY\x10\x04\x12\x11\n\rHIGHLIGHT_IAQ\x10\x08\"D\n\x08GeoPoint\x12\x13\n\x04zoom\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08latitude\x18\x02 \x01(\x0f\x12\x11\n\tlongitude\x18\x03 \x01(\x0f\"\\\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdd\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)\n\x13screen_timeout_secs\x18\x03 \x01(\rB\x0c\x92?\x02\x38\x10\xca\xf3\x18\x03*\x01s\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08pin_code\x18\x05 \x01(\r\x12)\n\x05theme\x18\x06 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x1b\n\x0cring_tone_id\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12/\n\x08language\x18\x08 \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\t \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\n \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x1f\n\x10\x63\x61libration_data\x18\x0b \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12*\n\x08map_data\x18\x0c \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12=\n\x0c\x63ompass_mode\x18\r \x01(\x0e\x32 .meshtastic.protobuf.CompassModeB\x05\x92?\x02\x38\x08\x12\x18\n\x10screen_rgb_color\x18\x0e \x01(\r\x12R\n\ngps_format\x18\x0f \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormatB\x05\x92?\x02\x38\x08\"\x87\x01\n\x05\x46lags\x12\x0b\n\x07UI_NONE\x10\x00\x12\x12\n\x0eUI_SCREEN_LOCK\x10\x01\x12\x14\n\x10UI_SETTINGS_LOCK\x10\x02\x12\x14\n\x10UI_ALERT_ENABLED\x10\x04\x12\x15\n\x11UI_BANNER_ENABLED\x10\x08\x12\x1a\n\x16UI_IS_CLOCKFACE_ANALOG\x10\x10\"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\"\xdc\x01\n\nNodeFilter\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\thops_away\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x16\n\x07\x63hannel\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\"l\n\x05\x46lags\x12\x0f\n\x0b\x46ILTER_NONE\x10\x00\x12\x12\n\x0e\x46ILTER_UNKNOWN\x10\x01\x12\x12\n\x0e\x46ILTER_OFFLINE\x10\x02\x12\x15\n\x11\x46ILTER_PUBLIC_KEY\x10\x04\x12\x13\n\x0f\x46ILTER_POSITION\x10\x08\"\xb4\x01\n\rNodeHighlight\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tnode_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x10\"s\n\x05\x46lags\x12\x12\n\x0eHIGHLIGHT_NONE\x10\x00\x12\x12\n\x0eHIGHLIGHT_CHAT\x10\x01\x12\x16\n\x12HIGHLIGHT_POSITION\x10\x02\x12\x17\n\x13HIGHLIGHT_TELEMETRY\x10\x04\x12\x11\n\rHIGHLIGHT_IAQ\x10\x08\"D\n\x08GeoPoint\x12\x13\n\x04zoom\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08latitude\x18\x02 \x01(\x0f\x12\x11\n\tlongitude\x18\x03 \x01(\x0f\"\\\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) @@ -25,8 +26,8 @@ _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_DEVICEUICONFIG'].fields_by_name['screen_brightness']._options = None _globals['_DEVICEUICONFIG'].fields_by_name['screen_brightness']._serialized_options = b'\222?\0028\010' - _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout']._options = None - _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout']._serialized_options = b'\222?\0028\020' + _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout_secs']._options = None + _globals['_DEVICEUICONFIG'].fields_by_name['screen_timeout_secs']._serialized_options = b'\222?\0028\020\312\363\030\003*\001s' _globals['_DEVICEUICONFIG'].fields_by_name['flags']._options = None _globals['_DEVICEUICONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' _globals['_DEVICEUICONFIG'].fields_by_name['ring_tone_id']._options = None @@ -53,28 +54,28 @@ _globals['_GEOPOINT'].fields_by_name['zoom']._serialized_options = b'\222?\0028\010' _globals['_MAP'].fields_by_name['style']._options = None _globals['_MAP'].fields_by_name['style']._serialized_options = b'\222?\002\010\024' - _globals['_COMPASSMODE']._serialized_start=1516 - _globals['_COMPASSMODE']._serialized_end=1578 - _globals['_THEME']._serialized_start=1580 - _globals['_THEME']._serialized_end=1617 - _globals['_LANGUAGE']._serialized_start=1620 - _globals['_LANGUAGE']._serialized_end=1972 - _globals['_DEVICEUICONFIG']._serialized_start=95 - _globals['_DEVICEUICONFIG']._serialized_end=944 - _globals['_DEVICEUICONFIG_FLAGS']._serialized_start=721 - _globals['_DEVICEUICONFIG_FLAGS']._serialized_end=856 - _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_start=858 - _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_end=944 - _globals['_NODEFILTER']._serialized_start=947 - _globals['_NODEFILTER']._serialized_end=1167 - _globals['_NODEFILTER_FLAGS']._serialized_start=1059 - _globals['_NODEFILTER_FLAGS']._serialized_end=1167 - _globals['_NODEHIGHLIGHT']._serialized_start=1170 - _globals['_NODEHIGHLIGHT']._serialized_end=1350 - _globals['_NODEHIGHLIGHT_FLAGS']._serialized_start=1235 - _globals['_NODEHIGHLIGHT_FLAGS']._serialized_end=1350 - _globals['_GEOPOINT']._serialized_start=1352 - _globals['_GEOPOINT']._serialized_end=1420 - _globals['_MAP']._serialized_start=1422 - _globals['_MAP']._serialized_end=1514 + _globals['_COMPASSMODE']._serialized_start=1570 + _globals['_COMPASSMODE']._serialized_end=1632 + _globals['_THEME']._serialized_start=1634 + _globals['_THEME']._serialized_end=1671 + _globals['_LANGUAGE']._serialized_start=1674 + _globals['_LANGUAGE']._serialized_end=2026 + _globals['_DEVICEUICONFIG']._serialized_start=137 + _globals['_DEVICEUICONFIG']._serialized_end=998 + _globals['_DEVICEUICONFIG_FLAGS']._serialized_start=775 + _globals['_DEVICEUICONFIG_FLAGS']._serialized_end=910 + _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_start=912 + _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_end=998 + _globals['_NODEFILTER']._serialized_start=1001 + _globals['_NODEFILTER']._serialized_end=1221 + _globals['_NODEFILTER_FLAGS']._serialized_start=1113 + _globals['_NODEFILTER_FLAGS']._serialized_end=1221 + _globals['_NODEHIGHLIGHT']._serialized_start=1224 + _globals['_NODEHIGHLIGHT']._serialized_end=1404 + _globals['_NODEHIGHLIGHT_FLAGS']._serialized_start=1289 + _globals['_NODEHIGHLIGHT_FLAGS']._serialized_end=1404 + _globals['_GEOPOINT']._serialized_start=1406 + _globals['_GEOPOINT']._serialized_end=1474 + _globals['_MAP']._serialized_start=1476 + _globals['_MAP']._serialized_end=1568 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index 371e4f940..d4b6377db 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -428,7 +428,7 @@ class DeviceUIConfig(_message.Message): VERSION_FIELD_NUMBER: _builtins.int SCREEN_BRIGHTNESS_FIELD_NUMBER: _builtins.int - SCREEN_TIMEOUT_FIELD_NUMBER: _builtins.int + SCREEN_TIMEOUT_SECS_FIELD_NUMBER: _builtins.int FLAGS_FIELD_NUMBER: _builtins.int PIN_CODE_FIELD_NUMBER: _builtins.int THEME_FIELD_NUMBER: _builtins.int @@ -449,9 +449,9 @@ class DeviceUIConfig(_message.Message): """ TFT display brightness 1..255 """ - screen_timeout: _builtins.int + screen_timeout_secs: _builtins.int """ - Screen timeout 0..900 + Screen timeout in seconds, 0..900 """ flags: _builtins.int """ @@ -513,7 +513,7 @@ class DeviceUIConfig(_message.Message): *, version: _builtins.int = ..., screen_brightness: _builtins.int = ..., - screen_timeout: _builtins.int = ..., + screen_timeout_secs: _builtins.int = ..., flags: _builtins.int = ..., pin_code: _builtins.int = ..., theme: Global___Theme.ValueType = ..., @@ -529,7 +529,7 @@ class DeviceUIConfig(_message.Message): ) -> None: ... _HasFieldArgType: _TypeAlias = _typing.Literal["map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["calibration_data", b"calibration_data", "compass_mode", b"compass_mode", "flags", b"flags", "gps_format", b"gps_format", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_rgb_color", b"screen_rgb_color", "screen_timeout", b"screen_timeout", "theme", b"theme", "version", b"version"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["calibration_data", b"calibration_data", "compass_mode", b"compass_mode", "flags", b"flags", "gps_format", b"gps_format", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_rgb_color", b"screen_rgb_color", "screen_timeout_secs", b"screen_timeout_secs", "theme", b"theme", "version", b"version"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index fa2f1a2b6..d9eca3d48 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xeb\x04\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \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\x02 \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\x03 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x04 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xc7\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12\x62\n\x07timeout\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd2\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12P\n\x0bnag_timeout\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\xdc\x07\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12r\n\x16\x64\x65vice_update_interval\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x1e\n\x16sensor_update_interval\x18\x03 \x01(\r\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xeb\x04\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \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\x02 \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\x03 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x04 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -57,8 +57,8 @@ _globals['_REMOTEHARDWARECONFIG'].fields_by_name['authorized_key']._serialized_options = b'\222?\004\010 \020\003' _globals['_NEIGHBORINFOCONFIG'].fields_by_name['enabled']._options = None _globals['_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.' - _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval']._options = None - _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval']._serialized_options = b'\312\363\030;*\001s:\017Update IntervalB%How often to broadcast neighbor info.' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval_secs']._options = None + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval_secs']._serialized_options = b'\312\363\030;*\001s:\017Update IntervalB%How often to broadcast neighbor info.' _globals['_NEIGHBORINFOCONFIG'].fields_by_name['transmit_over_lora']._options = None _globals['_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.' _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_LOW"]._options = None @@ -125,8 +125,8 @@ _globals['_AUDIOCONFIG'].fields_by_name['i2s_sck']._serialized_options = b'\222?\0028\010\312\363\030\t:\007I2S SCK' _globals['_PAXCOUNTERCONFIG'].fields_by_name['enabled']._options = None _globals['_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.' - _globals['_PAXCOUNTERCONFIG'].fields_by_name['paxcounter_update_interval']._options = None - _globals['_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.' + _globals['_PAXCOUNTERCONFIG'].fields_by_name['paxcounter_update_interval_secs']._options = None + _globals['_PAXCOUNTERCONFIG'].fields_by_name['paxcounter_update_interval_secs']._serialized_options = b'\312\363\030[*\001s:\017Update IntervalBEHow often we can send a message to the mesh when people are detected.' _globals['_PAXCOUNTERCONFIG'].fields_by_name['wifi_threshold']._options = None _globals['_PAXCOUNTERCONFIG'].fields_by_name['wifi_threshold']._serialized_options = b'\312\363\030@*\003dBm:\016WiFi ThresholdB)RSSI threshold for counting WiFi devices.' _globals['_PAXCOUNTERCONFIG'].fields_by_name['ble_threshold']._options = None @@ -197,8 +197,8 @@ _globals['_SERIALCONFIG'].fields_by_name['txd']._serialized_options = b'\312\363\030-:\034Transmit data (txd) GPIO pinB\rTX pin number' _globals['_SERIALCONFIG'].fields_by_name['baud']._options = None _globals['_SERIALCONFIG'].fields_by_name['baud']._serialized_options = b'\312\363\030\030:\004BaudB\020Serial baud rate' - _globals['_SERIALCONFIG'].fields_by_name['timeout']._options = None - _globals['_SERIALCONFIG'].fields_by_name['timeout']._serialized_options = b'\312\363\030M:\007TimeoutBBThe amount of time to wait before we consider your packet as done.' + _globals['_SERIALCONFIG'].fields_by_name['timeout_ms']._options = None + _globals['_SERIALCONFIG'].fields_by_name['timeout_ms']._serialized_options = b'\312\363\030Q*\002ms:\007TimeoutBBThe amount of time to wait before we consider your packet as done.' _globals['_SERIALCONFIG'].fields_by_name['mode']._options = None _globals['_SERIALCONFIG'].fields_by_name['mode']._serialized_options = b'\312\363\030$:\004ModeB\034Serial module operation mode' _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS'].values_by_name["ALERT_ACTIVE"]._options = None @@ -229,8 +229,8 @@ _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_vibra']._serialized_options = b'\222?\0028\010\312\363\0303:\025Output pin vibra GPIOB\032Vibration motor output pin' _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_buzzer']._options = None _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['output_buzzer']._serialized_options = b'\222?\0028\010\312\363\030+:\026Output pin buzzer GPIOB\021Buzzer output pin' - _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout']._options = None - _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout']._serialized_options = b'\222?\0028\020\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.' + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout_secs']._options = None + _globals['_EXTERNALNOTIFICATIONCONFIG'].fields_by_name['nag_timeout_secs']._serialized_options = b'\222?\0028\020\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.' _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_ENABLED"]._options = None _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_ENABLED"]._serialized_options = b'\312\363\030B:\031Store and Forward EnabledB%Enables the store and forward module.' _globals['_STOREFORWARDCONFIG_FLAGS'].values_by_name["STOREFORWARD_HEARTBEAT"]._options = None @@ -261,8 +261,10 @@ _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._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' _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._options = None _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\020' - _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval']._options = None - _globals['_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.' + _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval_secs']._options = None + _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval_secs']._serialized_options = b'\312\363\030N*\001s:\027Device Metrics IntervalB0How often device metrics are sent over the mesh.' + _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_update_interval_secs']._options = None + _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_update_interval_secs']._serialized_options = b'\312\363\030\033*\001s:\026Sensor Update Interval' _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._options = None _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._serialized_options = b'\312\363\030!:\010Rotary 1B\025Enable rotary encoder' _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_UPDOWN1"]._options = None @@ -329,8 +331,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14611 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14684 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14676 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14749 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -340,61 +342,61 @@ _globals['_REMOTEHARDWARECONFIG']._serialized_start=1572 _globals['_REMOTEHARDWARECONFIG']._serialized_end=1751 _globals['_NEIGHBORINFOCONFIG']._serialized_start=1754 - _globals['_NEIGHBORINFOCONFIG']._serialized_end=2235 - _globals['_DETECTIONSENSORCONFIG']._serialized_start=2238 - _globals['_DETECTIONSENSORCONFIG']._serialized_end=3714 - _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2866 - _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=3111 - _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_start=3114 - _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_end=3714 - _globals['_AUDIOCONFIG']._serialized_start=3717 - _globals['_AUDIOCONFIG']._serialized_end=4579 - _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=4270 - _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=4579 - _globals['_PAXCOUNTERCONFIG']._serialized_start=4582 - _globals['_PAXCOUNTERCONFIG']._serialized_end=5135 - _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=5138 - _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5757 - _globals['_SERIALCONFIG']._serialized_start=5760 - _globals['_SERIALCONFIG']._serialized_end=7239 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6220 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6766 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6769 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=7019 - _globals['_SERIALCONFIG_FLAGS']._serialized_start=7022 - _globals['_SERIALCONFIG_FLAGS']._serialized_end=7239 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7242 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=8988 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7837 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=8988 - _globals['_STOREFORWARDCONFIG']._serialized_start=8991 - _globals['_STOREFORWARDCONFIG']._serialized_end=9661 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9240 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9661 - _globals['_TELEMETRYCONFIG']._serialized_start=9664 - _globals['_TELEMETRYCONFIG']._serialized_end=10652 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9854 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10652 - _globals['_CANNEDMESSAGECONFIG']._serialized_start=10655 - _globals['_CANNEDMESSAGECONFIG']._serialized_end=11599 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11364 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11599 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11602 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12217 - _globals['_STATUSMESSAGECONFIG']._serialized_start=12219 - _globals['_STATUSMESSAGECONFIG']._serialized_end=12268 - _globals['_MESHBEACONCONFIG']._serialized_start=12271 - _globals['_MESHBEACONCONFIG']._serialized_end=13112 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12788 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12987 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12989 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13085 - _globals['_TAKCONFIG']._serialized_start=13115 - _globals['_TAKCONFIG']._serialized_end=13271 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13273 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13396 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13398 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13492 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13495 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14609 + _globals['_NEIGHBORINFOCONFIG']._serialized_end=2240 + _globals['_DETECTIONSENSORCONFIG']._serialized_start=2243 + _globals['_DETECTIONSENSORCONFIG']._serialized_end=3719 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2871 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=3116 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_start=3119 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_end=3719 + _globals['_AUDIOCONFIG']._serialized_start=3722 + _globals['_AUDIOCONFIG']._serialized_end=4584 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=4275 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=4584 + _globals['_PAXCOUNTERCONFIG']._serialized_start=4587 + _globals['_PAXCOUNTERCONFIG']._serialized_end=5145 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=5148 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5767 + _globals['_SERIALCONFIG']._serialized_start=5770 + _globals['_SERIALCONFIG']._serialized_end=7256 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6237 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6783 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6786 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=7036 + _globals['_SERIALCONFIG_FLAGS']._serialized_start=7039 + _globals['_SERIALCONFIG_FLAGS']._serialized_end=7256 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7259 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=9010 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7859 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=9010 + _globals['_STOREFORWARDCONFIG']._serialized_start=9013 + _globals['_STOREFORWARDCONFIG']._serialized_end=9683 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9262 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9683 + _globals['_TELEMETRYCONFIG']._serialized_start=9686 + _globals['_TELEMETRYCONFIG']._serialized_end=10717 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9919 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10717 + _globals['_CANNEDMESSAGECONFIG']._serialized_start=10720 + _globals['_CANNEDMESSAGECONFIG']._serialized_end=11664 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11429 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11664 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11667 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12282 + _globals['_STATUSMESSAGECONFIG']._serialized_start=12284 + _globals['_STATUSMESSAGECONFIG']._serialized_end=12333 + _globals['_MESHBEACONCONFIG']._serialized_start=12336 + _globals['_MESHBEACONCONFIG']._serialized_end=13177 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12853 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=13052 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=13054 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13150 + _globals['_TAKCONFIG']._serialized_start=13180 + _globals['_TAKCONFIG']._serialized_end=13336 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13338 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13461 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13463 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13557 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13560 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14674 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 62d68d5bf..29ac7d0ac 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -275,13 +275,13 @@ class NeighborInfoConfig(_message.Message): DESCRIPTOR: _descriptor.Descriptor ENABLED_FIELD_NUMBER: _builtins.int - UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int TRANSMIT_OVER_LORA_FIELD_NUMBER: _builtins.int enabled: _builtins.bool """ Whether the Module is enabled """ - update_interval: _builtins.int + update_interval_secs: _builtins.int """ Interval in seconds of how often we should try to send our Neighbor Info (minimum is 14400, i.e., 4 hours) @@ -295,12 +295,12 @@ class NeighborInfoConfig(_message.Message): self, *, enabled: _builtins.bool = ..., - update_interval: _builtins.int = ..., + update_interval_secs: _builtins.int = ..., transmit_over_lora: _builtins.bool = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "transmit_over_lora", b"transmit_over_lora", "update_interval", b"update_interval"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "transmit_over_lora", b"transmit_over_lora", "update_interval_secs", b"update_interval_secs"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -570,14 +570,14 @@ class PaxcounterConfig(_message.Message): DESCRIPTOR: _descriptor.Descriptor ENABLED_FIELD_NUMBER: _builtins.int - PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + PAXCOUNTER_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int WIFI_THRESHOLD_FIELD_NUMBER: _builtins.int BLE_THRESHOLD_FIELD_NUMBER: _builtins.int enabled: _builtins.bool """ Enable the Paxcounter Module """ - paxcounter_update_interval: _builtins.int + paxcounter_update_interval_secs: _builtins.int """ Interval in seconds of how often we should try to send our metrics to the mesh @@ -594,13 +594,13 @@ class PaxcounterConfig(_message.Message): self, *, enabled: _builtins.bool = ..., - paxcounter_update_interval: _builtins.int = ..., + paxcounter_update_interval_secs: _builtins.int = ..., wifi_threshold: _builtins.int = ..., ble_threshold: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["ble_threshold", b"ble_threshold", "enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval", "wifi_threshold", b"wifi_threshold"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["ble_threshold", b"ble_threshold", "enabled", b"enabled", "paxcounter_update_interval_secs", b"paxcounter_update_interval_secs", "wifi_threshold", b"wifi_threshold"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -823,7 +823,7 @@ class SerialConfig(_message.Message): RXD_FIELD_NUMBER: _builtins.int TXD_FIELD_NUMBER: _builtins.int BAUD_FIELD_NUMBER: _builtins.int - TIMEOUT_FIELD_NUMBER: _builtins.int + TIMEOUT_MS_FIELD_NUMBER: _builtins.int MODE_FIELD_NUMBER: _builtins.int flags: _builtins.int """ @@ -841,9 +841,10 @@ class SerialConfig(_message.Message): """ Serial baud rate """ - timeout: _builtins.int + timeout_ms: _builtins.int """ - Timeout in seconds for serial module operations (0 = no timeout) + Milliseconds the serial port waits for more input before it treats a packet as + complete. 0 takes the default of 250. """ mode: Global___SerialConfig.Serial_Mode.ValueType """ @@ -856,12 +857,12 @@ class SerialConfig(_message.Message): rxd: _builtins.int = ..., txd: _builtins.int = ..., baud: Global___SerialConfig.Serial_Baud.ValueType = ..., - timeout: _builtins.int = ..., + timeout_ms: _builtins.int = ..., mode: Global___SerialConfig.Serial_Mode.ValueType = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["baud", b"baud", "flags", b"flags", "mode", b"mode", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["baud", b"baud", "flags", b"flags", "mode", b"mode", "rxd", b"rxd", "timeout_ms", b"timeout_ms", "txd", b"txd"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -934,7 +935,7 @@ class ExternalNotificationConfig(_message.Message): ALERT_FLAGS_FIELD_NUMBER: _builtins.int OUTPUT_VIBRA_FIELD_NUMBER: _builtins.int OUTPUT_BUZZER_FIELD_NUMBER: _builtins.int - NAG_TIMEOUT_FIELD_NUMBER: _builtins.int + NAG_TIMEOUT_SECS_FIELD_NUMBER: _builtins.int enabled: _builtins.bool """ Enable the ExternalNotificationModule @@ -965,7 +966,7 @@ class ExternalNotificationConfig(_message.Message): ALERT_USE_PWM is clear. 0 is GPIO0, not "unset": the ALERT_*_BUZZER flags say whether it sounds. In standalone devices it matches the UI. """ - nag_timeout: _builtins.int + nag_timeout_secs: _builtins.int """ The notification will toggle with 'output_ms' for this time of seconds. Default is 0 which means don't repeat at all. 60 would mean blink @@ -980,11 +981,11 @@ class ExternalNotificationConfig(_message.Message): alert_flags: _builtins.int = ..., output_vibra: _builtins.int = ..., output_buzzer: _builtins.int = ..., - nag_timeout: _builtins.int = ..., + nag_timeout_secs: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["alert_flags", b"alert_flags", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["alert_flags", b"alert_flags", "enabled", b"enabled", "nag_timeout_secs", b"nag_timeout_secs", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -1191,18 +1192,18 @@ class TelemetryConfig(_message.Message): """ FLAGS_FIELD_NUMBER: _builtins.int - DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int - SENSOR_UPDATE_INTERVAL_FIELD_NUMBER: _builtins.int + DEVICE_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + SENSOR_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int flags: _builtins.int """ Bitwise OR of Flags values. """ - device_update_interval: _builtins.int + device_update_interval_secs: _builtins.int """ Interval in seconds of how often we should try to send our device metrics to the mesh """ - sensor_update_interval: _builtins.int + sensor_update_interval_secs: _builtins.int """ Interval in seconds of how often we should try to send sensor readings to the mesh. One interval covers every sensor category, since they now travel together @@ -1213,12 +1214,12 @@ class TelemetryConfig(_message.Message): self, *, flags: _builtins.int = ..., - device_update_interval: _builtins.int = ..., - sensor_update_interval: _builtins.int = ..., + device_update_interval_secs: _builtins.int = ..., + sensor_update_interval_secs: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["device_update_interval", b"device_update_interval", "flags", b"flags", "sensor_update_interval", b"sensor_update_interval"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_update_interval_secs", b"device_update_interval_secs", "flags", b"flags", "sensor_update_interval_secs", b"sensor_update_interval_secs"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index db6c90dae..3afa72800 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -15,7 +15,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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\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\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\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\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\x03\x88\x01\x01\x12\x1b\n\x0euptime_minutes\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_minutes\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\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\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\x10\x35\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) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index 649bfa137..dc0e9e5d8 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -479,7 +479,7 @@ class DeviceMetrics(_message.Message): VOLTAGE_FIELD_NUMBER: _builtins.int CHANNEL_UTILIZATION_FIELD_NUMBER: _builtins.int AIR_UTIL_TX_FIELD_NUMBER: _builtins.int - UPTIME_SECONDS_FIELD_NUMBER: _builtins.int + UPTIME_MINUTES_FIELD_NUMBER: _builtins.int battery_level: _builtins.int """ 0-100 (>100 means powered) @@ -496,9 +496,11 @@ class DeviceMetrics(_message.Message): """ Percent of airtime for TX x100 (e.g. 1025 = 10.25%) """ - uptime_seconds: _builtins.int + uptime_minutes: _builtins.int """ - How long the device has been running since the last reboot (in seconds) + How long the device has been running since the last reboot, in minutes. Sent on + the air with every device telemetry packet, where a second's resolution has no use + and minutes cost one byte less for any uptime from 4.5 hours to 11 days. """ def __init__( self, @@ -507,11 +509,11 @@ class DeviceMetrics(_message.Message): voltage: _builtins.int | None = ..., channel_utilization: _builtins.int | None = ..., air_util_tx: _builtins.int | None = ..., - uptime_seconds: _builtins.int | None = ..., + uptime_minutes: _builtins.int | None = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_minutes", b"_uptime_minutes", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_minutes", b"uptime_minutes", "voltage", b"voltage"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_seconds", b"_uptime_seconds", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx", "_battery_level", b"_battery_level", "_channel_utilization", b"_channel_utilization", "_uptime_minutes", b"_uptime_minutes", "_voltage", b"_voltage", "air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_minutes", b"uptime_minutes", "voltage", b"voltage"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... _WhichOneofReturnType__air_util_tx: _TypeAlias = _typing.Literal["air_util_tx"] # noqa: Y015 _WhichOneofArgType__air_util_tx: _TypeAlias = _typing.Literal["_air_util_tx", b"_air_util_tx"] # noqa: Y015 @@ -519,8 +521,8 @@ class DeviceMetrics(_message.Message): _WhichOneofArgType__battery_level: _TypeAlias = _typing.Literal["_battery_level", b"_battery_level"] # noqa: Y015 _WhichOneofReturnType__channel_utilization: _TypeAlias = _typing.Literal["channel_utilization"] # noqa: Y015 _WhichOneofArgType__channel_utilization: _TypeAlias = _typing.Literal["_channel_utilization", b"_channel_utilization"] # noqa: Y015 - _WhichOneofReturnType__uptime_seconds: _TypeAlias = _typing.Literal["uptime_seconds"] # noqa: Y015 - _WhichOneofArgType__uptime_seconds: _TypeAlias = _typing.Literal["_uptime_seconds", b"_uptime_seconds"] # noqa: Y015 + _WhichOneofReturnType__uptime_minutes: _TypeAlias = _typing.Literal["uptime_minutes"] # noqa: Y015 + _WhichOneofArgType__uptime_minutes: _TypeAlias = _typing.Literal["_uptime_minutes", b"_uptime_minutes"] # noqa: Y015 _WhichOneofReturnType__voltage: _TypeAlias = _typing.Literal["voltage"] # noqa: Y015 _WhichOneofArgType__voltage: _TypeAlias = _typing.Literal["_voltage", b"_voltage"] # noqa: Y015 @_typing.overload @@ -530,7 +532,7 @@ class DeviceMetrics(_message.Message): @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__channel_utilization) -> _WhichOneofReturnType__channel_utilization | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType__uptime_seconds) -> _WhichOneofReturnType__uptime_seconds | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType__uptime_minutes) -> _WhichOneofReturnType__uptime_minutes | None: ... @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__voltage) -> _WhichOneofReturnType__voltage | None: ... diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index ea4b8ad28..552942c01 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -2139,7 +2139,7 @@ def test_profile_from_yaml_maps_all_fields(): "ringtone": "24:d=32,o=5", "location": {"lat": 35.88888, "lon": -93.88888, "alt": 304}, "config": {"bluetooth": {"enabled": True, "fixedPin": 123456}}, - "module_config": {"telemetry": {"deviceUpdateInterval": 900}}, + "module_config": {"telemetry": {"deviceUpdateIntervalSecs": 900}}, } profile = _profile_from_yaml(configuration) @@ -2156,7 +2156,7 @@ def test_profile_from_yaml_maps_all_fields(): assert profile.config.bluetooth.enabled is True assert profile.config.bluetooth.fixed_pin == 123456 assert profile.HasField("module_config") - assert profile.module_config.telemetry.device_update_interval == 900 + assert profile.module_config.telemetry.device_update_interval_secs == 900 @pytest.mark.unit diff --git a/protobufs b/protobufs index 86ff1e83e..da3299bd4 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 86ff1e83ea4b18a4f17bb30d46ecc94aa16f4a13 +Subproject commit da3299bd4321cd744007f12279bd6e0d884e0fc7 From d8cee7d6be31d23b9bd9f5c654e35ea1205fa2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 21:36:43 +0200 Subject: [PATCH 08/24] Regenerate protobufs without the TrafficManagement direct response --- meshtastic/protobuf/module_config_pb2.py | 94 +++++++++++------------ meshtastic/protobuf/module_config_pb2.pyi | 10 +-- meshtastic/protobuf/telemetry_pb2.py | 40 +++++----- meshtastic/protobuf/telemetry_pb2.pyi | 8 +- protobufs | 2 +- 5 files changed, 69 insertions(+), 85 deletions(-) diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index d9eca3d48..91b9a6614 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xeb\x04\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \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\x02 \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\x03 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x04 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x05 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -133,8 +133,6 @@ _globals['_PAXCOUNTERCONFIG'].fields_by_name['ble_threshold']._serialized_options = b'\312\363\030>*\003dBm:\rBLE ThresholdB(RSSI threshold for counting BLE devices.' _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['position_min_interval_secs']._options = None _globals['_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.' - _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['nodeinfo_direct_response_max_hops']._options = None - _globals['_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.' _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['rate_limit_window_secs']._options = None _globals['_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.' _globals['_TRAFFICMANAGEMENTCONFIG'].fields_by_name['rate_limit_max_packets']._options = None @@ -331,8 +329,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14676 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14749 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14554 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14627 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -356,47 +354,47 @@ _globals['_PAXCOUNTERCONFIG']._serialized_start=4587 _globals['_PAXCOUNTERCONFIG']._serialized_end=5145 _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=5148 - _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5767 - _globals['_SERIALCONFIG']._serialized_start=5770 - _globals['_SERIALCONFIG']._serialized_end=7256 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6237 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6783 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6786 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=7036 - _globals['_SERIALCONFIG_FLAGS']._serialized_start=7039 - _globals['_SERIALCONFIG_FLAGS']._serialized_end=7256 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7259 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=9010 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7859 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=9010 - _globals['_STOREFORWARDCONFIG']._serialized_start=9013 - _globals['_STOREFORWARDCONFIG']._serialized_end=9683 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9262 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9683 - _globals['_TELEMETRYCONFIG']._serialized_start=9686 - _globals['_TELEMETRYCONFIG']._serialized_end=10717 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9919 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10717 - _globals['_CANNEDMESSAGECONFIG']._serialized_start=10720 - _globals['_CANNEDMESSAGECONFIG']._serialized_end=11664 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11429 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11664 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11667 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12282 - _globals['_STATUSMESSAGECONFIG']._serialized_start=12284 - _globals['_STATUSMESSAGECONFIG']._serialized_end=12333 - _globals['_MESHBEACONCONFIG']._serialized_start=12336 - _globals['_MESHBEACONCONFIG']._serialized_end=13177 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12853 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=13052 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=13054 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13150 - _globals['_TAKCONFIG']._serialized_start=13180 - _globals['_TAKCONFIG']._serialized_end=13336 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13338 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13461 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13463 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13557 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13560 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14674 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5645 + _globals['_SERIALCONFIG']._serialized_start=5648 + _globals['_SERIALCONFIG']._serialized_end=7134 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6115 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6661 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6664 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=6914 + _globals['_SERIALCONFIG_FLAGS']._serialized_start=6917 + _globals['_SERIALCONFIG_FLAGS']._serialized_end=7134 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7137 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=8888 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7737 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=8888 + _globals['_STOREFORWARDCONFIG']._serialized_start=8891 + _globals['_STOREFORWARDCONFIG']._serialized_end=9561 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9140 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9561 + _globals['_TELEMETRYCONFIG']._serialized_start=9564 + _globals['_TELEMETRYCONFIG']._serialized_end=10595 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9797 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10595 + _globals['_CANNEDMESSAGECONFIG']._serialized_start=10598 + _globals['_CANNEDMESSAGECONFIG']._serialized_end=11542 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11307 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11542 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11545 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12160 + _globals['_STATUSMESSAGECONFIG']._serialized_start=12162 + _globals['_STATUSMESSAGECONFIG']._serialized_end=12211 + _globals['_MESHBEACONCONFIG']._serialized_start=12214 + _globals['_MESHBEACONCONFIG']._serialized_end=13055 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12731 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12930 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12932 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13028 + _globals['_TAKCONFIG']._serialized_start=13058 + _globals['_TAKCONFIG']._serialized_end=13214 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13216 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13339 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13341 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13435 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13438 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14552 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 29ac7d0ac..cc8cb7598 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -619,7 +619,6 @@ class TrafficManagementConfig(_message.Message): DESCRIPTOR: _descriptor.Descriptor POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: _builtins.int - NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: _builtins.int RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: _builtins.int RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: _builtins.int UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: _builtins.int @@ -629,12 +628,6 @@ class TrafficManagementConfig(_message.Message): 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 - """ - 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 per-node rate limiting. @@ -655,14 +648,13 @@ class TrafficManagementConfig(_message.Message): self, *, position_min_interval_secs: _builtins.int = ..., - nodeinfo_direct_response_max_hops: _builtins.int = ..., rate_limit_window_secs: _builtins.int = ..., rate_limit_max_packets: _builtins.int = ..., unknown_packet_threshold: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _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"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["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"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index 3afa72800..da5a0e3a9 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -15,7 +15,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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\x03\x88\x01\x01\x12\x1b\n\x0euptime_minutes\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_minutes\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\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\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\x03\x88\x01\x01\x12\x1b\n\x0euptime_minutes\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_minutes\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\xc7\x01\n\x16TrafficManagementStats\x12\x19\n\x11packets_inspected\x18\x01 \x01(\r\x12\x1c\n\x14position_dedup_drops\x18\x02 \x01(\r\x12\x18\n\x10rate_limit_drops\x18\x03 \x01(\r\x12\x1c\n\x14unknown_packet_drops\x18\x04 \x01(\r\x12\x1d\n\x15hop_exhausted_packets\x18\x05 \x01(\r\x12\x1d\n\x15router_hops_preserved\x18\x06 \x01(\r\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\x10\x35\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) @@ -59,8 +59,8 @@ _globals['_SENSORREADINGS'].fields_by_name['sensors']._serialized_options = b'\222?\004\020\0208\010' _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._options = None _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._serialized_options = b'\222?\0028 ' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=4257 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=4991 + _globals['_TELEMETRYSENSORTYPE']._serialized_start=4228 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=4962 _globals['_DEVICEMETRICS']._serialized_start=95 _globals['_DEVICEMETRICS']._serialized_end=359 _globals['_LOCALSTATS']._serialized_start=362 @@ -68,21 +68,21 @@ _globals['_LOCALSTATS_DISCOVERYSTAGE']._serialized_start=915 _globals['_LOCALSTATS_DISCOVERYSTAGE']._serialized_end=1042 _globals['_TRAFFICMANAGEMENTSTATS']._serialized_start=1045 - _globals['_TRAFFICMANAGEMENTSTATS']._serialized_end=1273 - _globals['_HOSTMETRICS']._serialized_start=1276 - _globals['_HOSTMETRICS']._serialized_end=1578 - _globals['_SENSORREADINGS']._serialized_start=1581 - _globals['_SENSORREADINGS']._serialized_end=3299 - _globals['_SENSORREADINGS_QUANTITY']._serialized_start=1728 - _globals['_SENSORREADINGS_QUANTITY']._serialized_end=3299 - _globals['_TELEMETRY']._serialized_start=3302 - _globals['_TELEMETRY']._serialized_end=3659 - _globals['_NAU7802CONFIG']._serialized_start=3661 - _globals['_NAU7802CONFIG']._serialized_end=3730 - _globals['_AS3935STATE']._serialized_start=3732 - _globals['_AS3935STATE']._serialized_end=3768 - _globals['_SEN5XSTATE']._serialized_start=3771 - _globals['_SEN5XSTATE']._serialized_end=4011 - _globals['_SEN6XSTATE']._serialized_start=4014 - _globals['_SEN6XSTATE']._serialized_end=4254 + _globals['_TRAFFICMANAGEMENTSTATS']._serialized_end=1244 + _globals['_HOSTMETRICS']._serialized_start=1247 + _globals['_HOSTMETRICS']._serialized_end=1549 + _globals['_SENSORREADINGS']._serialized_start=1552 + _globals['_SENSORREADINGS']._serialized_end=3270 + _globals['_SENSORREADINGS_QUANTITY']._serialized_start=1699 + _globals['_SENSORREADINGS_QUANTITY']._serialized_end=3270 + _globals['_TELEMETRY']._serialized_start=3273 + _globals['_TELEMETRY']._serialized_end=3630 + _globals['_NAU7802CONFIG']._serialized_start=3632 + _globals['_NAU7802CONFIG']._serialized_end=3701 + _globals['_AS3935STATE']._serialized_start=3703 + _globals['_AS3935STATE']._serialized_end=3739 + _globals['_SEN5XSTATE']._serialized_start=3742 + _globals['_SEN5XSTATE']._serialized_end=3982 + _globals['_SEN6XSTATE']._serialized_start=3985 + _globals['_SEN6XSTATE']._serialized_end=4225 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index dc0e9e5d8..bd5e4c06a 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -729,7 +729,6 @@ class TrafficManagementStats(_message.Message): PACKETS_INSPECTED_FIELD_NUMBER: _builtins.int POSITION_DEDUP_DROPS_FIELD_NUMBER: _builtins.int - NODEINFO_CACHE_HITS_FIELD_NUMBER: _builtins.int RATE_LIMIT_DROPS_FIELD_NUMBER: _builtins.int UNKNOWN_PACKET_DROPS_FIELD_NUMBER: _builtins.int HOP_EXHAUSTED_PACKETS_FIELD_NUMBER: _builtins.int @@ -742,10 +741,6 @@ class TrafficManagementStats(_message.Message): """ Number of position packets dropped due to deduplication """ - nodeinfo_cache_hits: _builtins.int - """ - Number of NodeInfo requests answered from cache - """ rate_limit_drops: _builtins.int """ Number of packets dropped due to rate limiting @@ -767,7 +762,6 @@ class TrafficManagementStats(_message.Message): *, packets_inspected: _builtins.int = ..., position_dedup_drops: _builtins.int = ..., - nodeinfo_cache_hits: _builtins.int = ..., rate_limit_drops: _builtins.int = ..., unknown_packet_drops: _builtins.int = ..., hop_exhausted_packets: _builtins.int = ..., @@ -775,7 +769,7 @@ class TrafficManagementStats(_message.Message): ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["hop_exhausted_packets", b"hop_exhausted_packets", "nodeinfo_cache_hits", b"nodeinfo_cache_hits", "packets_inspected", b"packets_inspected", "position_dedup_drops", b"position_dedup_drops", "rate_limit_drops", b"rate_limit_drops", "router_hops_preserved", b"router_hops_preserved", "unknown_packet_drops", b"unknown_packet_drops"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["hop_exhausted_packets", b"hop_exhausted_packets", "packets_inspected", b"packets_inspected", "position_dedup_drops", b"position_dedup_drops", "rate_limit_drops", b"rate_limit_drops", "router_hops_preserved", b"router_hops_preserved", "unknown_packet_drops", b"unknown_packet_drops"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/protobufs b/protobufs index da3299bd4..984570665 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit da3299bd4321cd744007f12279bd6e0d884e0fc7 +Subproject commit 984570665d4b432de1c4080a5b22bf5d80011d06 From ccde9f97bb45bfe4e9e4b5c75cecd80dd022c1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 22:29:59 +0200 Subject: [PATCH 09/24] Set hop_start from an explicit hop limit; protobufs at 3309307 --- meshtastic/mesh_interface.py | 3 +++ meshtastic/protobuf/channel_pb2.pyi | 6 +++--- meshtastic/protobuf/packet_pb2.pyi | 4 +++- meshtastic/tests/test_mesh_interface.py | 11 +++++++++++ protobufs | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index e8778e68e..cc40f3f4c 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -996,6 +996,9 @@ def _sendPacket( if hopLimit is not None: meshPacket.hop_limit = hopLimit + # An explicit budget also sets hop_start: the node launches a direct message + # with it in place of the channel scope's cap. + meshPacket.hop_start = hopLimit else: loraConfig = getattr(self.localNode.localConfig, "lora") meshPacket.hop_limit = getattr(loraConfig, "hop_limit") diff --git a/meshtastic/protobuf/channel_pb2.pyi b/meshtastic/protobuf/channel_pb2.pyi index a1f783299..ea2c50855 100644 --- a/meshtastic/protobuf/channel_pb2.pyi +++ b/meshtastic/protobuf/channel_pb2.pyi @@ -56,7 +56,7 @@ class ChannelSettings(_message.Message): SCOPE_UNSET: ChannelSettings._Scope.ValueType # 0 """Treated as REGIONAL""" SCOPE_LOCAL: ChannelSettings._Scope.ValueType # 1 - """One or two hops: a site, an event, a household""" + """Neighbours and one relay: a site, an event, a household""" SCOPE_REGIONAL: ChannelSettings._Scope.ValueType # 2 """The region's default hop cap""" SCOPE_GLOBAL: ChannelSettings._Scope.ValueType # 3 @@ -74,7 +74,7 @@ class ChannelSettings(_message.Message): | scope | launch hop_start | CHANNEL_UPLINK | congestion control may raise | |----------|------------------|----------------|------------------------------| - | LOCAL | 2 | refused | no | + | LOCAL | 1 | refused | no | | REGIONAL | region default | refused | yes, to the region maximum | | GLOBAL | 15 | allowed | yes | @@ -86,7 +86,7 @@ class ChannelSettings(_message.Message): SCOPE_UNSET: ChannelSettings.Scope.ValueType # 0 """Treated as REGIONAL""" SCOPE_LOCAL: ChannelSettings.Scope.ValueType # 1 - """One or two hops: a site, an event, a household""" + """Neighbours and one relay: a site, an event, a household""" SCOPE_REGIONAL: ChannelSettings.Scope.ValueType # 2 """The region's default hop cap""" SCOPE_GLOBAL: ChannelSettings.Scope.ValueType # 3 diff --git a/meshtastic/protobuf/packet_pb2.pyi b/meshtastic/protobuf/packet_pb2.pyi index 29cb05ef5..c83708f6c 100644 --- a/meshtastic/protobuf/packet_pb2.pyi +++ b/meshtastic/protobuf/packet_pb2.pyi @@ -470,7 +470,9 @@ class MeshPacket(_message.Message): The hop budget the originator launched with: header flags.hop_start, 0-15 in four bits, covered by the AAD. hop_start - hop_limit is the number of hops taken, and because only one of the two is authenticated it is a hint, never an - authorisation input (SCHEMA.md §8, Hop accounting). + authorisation input (SCHEMA.md §8, Hop accounting). The node sets it when it + launches a frame; a client may set it on a direct message to launch with that + budget instead of the channel scope's cap. """ next_hop: _builtins.int """ diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 55eba594e..90e3d5b8c 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -432,6 +432,17 @@ def test_sendPacket_with_destination_as_int(caplog): assert re.search(r"Not sending packet", caplog.text, re.MULTILINE) +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_sendPacket_explicit_hop_limit_sets_hop_start(): + """An explicit hopLimit also sets hop_start, which 3.0 firmware honours on a direct message""" + iface = MeshInterface(noProto=True) + p = iface._sendPacket(packet_pb2.MeshPacket(), destinationId=123, hopLimit=5) + assert (p.hop_limit, p.hop_start) == (5, 5) + p = iface._sendPacket(packet_pb2.MeshPacket(), destinationId=123) + assert p.hop_start == 0 + + @pytest.mark.unit @pytest.mark.usefixtures("reset_mt_config") def test_sendPacket_with_destination_starting_with_a_bang(caplog): diff --git a/protobufs b/protobufs index 984570665..3309307e8 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 984570665d4b432de1c4080a5b22bf5d80011d06 +Subproject commit 3309307e80389800e876a8aa2a15c7726ceb8fbd From bf57290e19ea3c3172fb1735d850502166a8fe62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 4 Oct 2026 23:21:20 +0200 Subject: [PATCH 10/24] Protobufs at 9591272 --- meshtastic/protobuf/common_pb2.pyi | 3 +-- meshtastic/protobuf/deviceonly_pb2.pyi | 5 ++--- meshtastic/protobuf/wire_pb2.pyi | 6 +++--- protobufs | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/meshtastic/protobuf/common_pb2.pyi b/meshtastic/protobuf/common_pb2.pyi index 4e442909c..5ed246508 100644 --- a/meshtastic/protobuf/common_pb2.pyi +++ b/meshtastic/protobuf/common_pb2.pyi @@ -680,8 +680,7 @@ class NodeFlags(_NodeFlags, metaclass=_NodeFlagsEnumTypeWrapper): One definition shared by the stored NodeInfoLite.bitfield and the client-facing NodeInfo.flags, so the two can never drift and firmware converts between them by - copying the word rather than shuffling bits. Values match NODEINFO_BITFIELD_* in - the firmware's src/mesh/NodeDB.h. + copying the word rather than shuffling bits. The HAS_* entries are presence bits: they say a value was actually observed, which a plain false cannot express. HAS_SNR in particular distinguishes a genuine 0 dB diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index ffe192f31..4d02950ca 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -128,9 +128,8 @@ class NodeInfoLite(_message.Message): """ SNR of the last received message: dB x 2, zigzag-encoded, the one SNR scale. Encode: snr = (int32_t)lroundf(snr_db * 2.0f). Decode: snr_db = snr / 2.0f. - A stored 0 does not by itself mean "unknown" - see NODEINFO_BITFIELD_HAS_SNR in - src/mesh/NodeDB.h for the presence bit that disambiguates a genuine 0 dB reading - from "never measured". + A stored 0 does not by itself mean "unknown" - NODE_FLAG_HAS_SNR in bitfield is + the presence bit that tells a genuine 0 dB reading from "never measured". """ last_heard: _builtins.int """ diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index bc5e2fba1..9beffb704 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -251,9 +251,9 @@ class User(_message.Message): long_name: _builtins.str """ A full name for this user, i.e. "Kevin Hester" - Limited to 24 bytes of UTF-8. Clients should enforce that in their UI; a - device truncates anything longer before storing or rebroadcasting, with - sanitizeUtf8 cleaning up a partial multi-byte sequence at the boundary. + Limited to 24 bytes of UTF-8, and clients must enforce that: a device decodes + into a fixed buffer, so a longer name fails the whole message carrying it. Cut + at a character boundary, never inside a multi-byte sequence. """ short_name: _builtins.str """ diff --git a/protobufs b/protobufs index 3309307e8..959127211 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 3309307e80389800e876a8aa2a15c7726ceb8fbd +Subproject commit 95912721194939d7770060b458dbce7f3265fb0d From b83eaa367414f3c840c59f260d6e965e16f3ba1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 10:53:12 +0200 Subject: [PATCH 11/24] Truncate the owner long name to 24 bytes --- meshtastic/node.py | 5 +++++ meshtastic/tests/test_node.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/meshtastic/node.py b/meshtastic/node.py index f4653eeb3..a0d267065 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -338,6 +338,11 @@ def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None # Validate that long_name is not empty or whitespace-only if not long_name: our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") + # 24 bytes is what a device keeps; cut at a character boundary + truncated = long_name.encode("utf-8")[:24].decode("utf-8", "ignore") + if truncated != long_name: + long_name = truncated + print(f"Maximum is 24 bytes, truncated to {long_name}") p.set_owner.long_name = long_name p.set_owner.is_licensed = is_licensed if short_name is not None: diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 37afaaa9e..6f23e4d7b 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1873,6 +1873,20 @@ def test_setOwner_whitespace_only_long_name(capsys): assert excinfo.value.code == 1 +@pytest.mark.unit +def test_setOwner_truncates_long_name_at_a_character_boundary(capsys): + """A long name is cut to the 24 bytes a device keeps, never inside a character""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + anode._sendAdmin = MagicMock() + + anode.setOwner(long_name="Base Camp North Ridge € Relay") + + sent = anode._sendAdmin.call_args[0][0] + assert sent.set_owner.long_name == "Base Camp North Ridge " + assert "truncated" in capsys.readouterr().out + + @pytest.mark.unit def test_setOwner_empty_long_name(capsys): """Test setOwner with empty long name""" From 43e66b407e8a7e64dae395e14474eb7152ce73b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 13:21:17 +0200 Subject: [PATCH 12/24] User.flags for the owner and contacts; protobufs at 8a2eb79 setOwner sets NODE_FLAG_IS_LICENSED and the unmessagable flags, and contact links carry User.flags. --- meshtastic/node.py | 16 +- meshtastic/protobuf/bitfields.py | 34 +++ meshtastic/protobuf/common_pb2.py | 48 ++-- meshtastic/protobuf/common_pb2.pyi | 179 ++++---------- meshtastic/protobuf/config_pb2.py | 148 +++++------ meshtastic/protobuf/config_pb2.pyi | 54 ++++- meshtastic/protobuf/deviceonly_pb2.pyi | 2 +- meshtastic/protobuf/discovery_pb2.pyi | 8 +- meshtastic/protobuf/module_config_pb2.py | 26 +- meshtastic/protobuf/module_config_pb2.pyi | 23 +- meshtastic/protobuf/region_registry_pb2.pyi | 4 +- meshtastic/protobuf/role_registry_pb2.py | 35 +++ meshtastic/protobuf/role_registry_pb2.pyi | 256 ++++++++++++++++++++ meshtastic/protobuf/wire_pb2.py | 74 +++--- meshtastic/protobuf/wire_pb2.pyi | 27 +-- meshtastic/tests/test_node.py | 23 +- protobufs | 2 +- 17 files changed, 622 insertions(+), 337 deletions(-) create mode 100644 meshtastic/protobuf/role_registry_pb2.py create mode 100644 meshtastic/protobuf/role_registry_pb2.pyi diff --git a/meshtastic/node.py b/meshtastic/node.py index a0d267065..844a7a431 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -344,7 +344,8 @@ def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None long_name = truncated print(f"Maximum is 24 bytes, truncated to {long_name}") p.set_owner.long_name = long_name - p.set_owner.is_licensed = is_licensed + if is_licensed: + p.set_owner.flags |= common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED if short_name is not None: short_name = short_name.strip() # Validate that short_name is not empty or whitespace-only @@ -355,13 +356,14 @@ def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None print(f"Maximum is 4 characters, truncated to {short_name}") p.set_owner.short_name = short_name if is_unmessagable is not None: - p.set_owner.is_unmessagable = is_unmessagable + p.set_owner.flags |= common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE + if is_unmessagable: + p.set_owner.flags |= common_pb2.NodeFlags.NODE_FLAG_IS_UNMESSAGABLE # Note: These debug lines are used in unit tests logger.debug(f"p.set_owner.long_name:{p.set_owner.long_name}:") logger.debug(f"p.set_owner.short_name:{p.set_owner.short_name}:") - logger.debug(f"p.set_owner.is_licensed:{p.set_owner.is_licensed}") - logger.debug(f"p.set_owner.is_unmessagable:{p.set_owner.is_unmessagable}:") + logger.debug(f"p.set_owner.flags:{p.set_owner.flags:#x}") # If sending to a remote node, wait for ACK/NAK if self == self.iface.localNode: onResponse = None @@ -410,10 +412,8 @@ def getContactURL(self, node_id: Union[int, str], should_ignore: bool = False, m contact.user.role = common_pb2.Role.Value(u["role"]) if u.get("publicKey"): contact.user.public_key = base64.b64decode(u["publicKey"]) - if u.get("isLicensed"): - contact.user.is_licensed = u["isLicensed"] - if u.get("isUnmessagable") is not None: - contact.user.is_unmessagable = u["isUnmessagable"] + if u.get("flags"): + contact.user.flags = u["flags"] if should_ignore: contact.should_ignore = True if manually_verified: diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py index ab5ecbeb1..63475b276 100644 --- a/meshtastic/protobuf/bitfields.py +++ b/meshtastic/protobuf/bitfields.py @@ -27,7 +27,11 @@ 'disable_triple_click': ('flags', 2), 'double_tap_as_button_press': ('flags', 1), 'led_heartbeat_disabled': ('flags', 4), + 'lost_and_found': ('flags', 128), 'no_taper': ('discovery_flags', 2), + 'quiet': ('flags', 64), + 'relay_favorites': ('flags', 32), + 'relay_late': ('flags', 16), 'serve': ('discovery_flags', 1)}, 'DeviceMetadata': {'altitude': ('position_flags', 1), 'can_shutdown': ('capabilities', 1), @@ -122,6 +126,8 @@ 'is_licensed': ('flags', 64), 'is_muted': ('flags', 2), 'is_unmessagable': ('flags', 128), + 'lost_and_found': ('flags', 67108864), + 'relays_favorites': ('flags', 33554432), 'via_mqtt': ('flags', 4)}, 'NodeInfoLite': {'has_is_unmessagable': ('bitfield', 256), 'has_rf_hear': ('bitfield', 2048), @@ -135,6 +141,8 @@ 'is_licensed': ('bitfield', 64), 'is_muted': ('bitfield', 2), 'is_unmessagable': ('bitfield', 128), + 'lost_and_found': ('bitfield', 67108864), + 'relays_favorites': ('bitfield', 33554432), 'via_mqtt': ('bitfield', 4)}, 'NodeRecord': {'has_is_unmessagable': ('flags', 256), 'has_rf_hear': ('flags', 2048), @@ -148,6 +156,8 @@ 'is_licensed': ('flags', 64), 'is_muted': ('flags', 2), 'is_unmessagable': ('flags', 128), + 'lost_and_found': ('flags', 67108864), + 'relays_favorites': ('flags', 33554432), 'via_mqtt': ('flags', 4)}, 'PositionConfig': {'altitude': ('position_flags', 1), 'dop': ('position_flags', 8), @@ -169,6 +179,14 @@ 'vext1_on': ('powermon_enables', 4), 'wifi_on': ('powermon_enables', 1024)}, 'RemoteShell': {'grant': ('flags', 1), 'more': ('flags', 2), 'rts': ('flags', 4)}, + 'RoleDefaults': {'altitude': ('position_flags', 1), + 'dop': ('position_flags', 8), + 'geoidal_separation': ('position_flags', 4), + 'heading': ('position_flags', 256), + 'satinview': ('position_flags', 32), + 'seq_no': ('position_flags', 64), + 'speed': ('position_flags', 512)}, + 'RolePreset': {'tak_enabled': ('tak_flags', 1)}, 'SecurityConfig': {'admin_channel_enabled': ('flags', 8), 'debug_log_api_enabled': ('flags', 4), 'enabled': ('ratchet_flags', 1), @@ -191,6 +209,7 @@ 'via_mqtt': ('flags', 4), 'want_ack': ('flags', 8), 'xeddsa_signed': ('flags', 32)}, + 'TAKConfig': {'tak_enabled': ('flags', 1)}, 'TelemetryConfig': {'air_quality': ('flags', 8), 'air_quality_screen': ('flags', 16), 'device': ('flags', 512), @@ -200,6 +219,21 @@ 'health_screen': ('flags', 256), 'power_measurement': ('flags', 32), 'power_screen': ('flags', 64)}, + 'User': {'has_is_unmessagable': ('flags', 256), + 'has_rf_hear': ('flags', 2048), + 'has_snr': ('flags', 1024), + 'has_user': ('flags', 32), + 'has_xeddsa_signed': ('flags', 512), + 'heard_on_current_lora': ('flags', 16777216), + 'is_favorite': ('flags', 8), + 'is_ignored': ('flags', 16), + 'is_key_manually_verified': ('flags', 1), + 'is_licensed': ('flags', 64), + 'is_muted': ('flags', 2), + 'is_unmessagable': ('flags', 128), + 'lost_and_found': ('flags', 67108864), + 'relays_favorites': ('flags', 33554432), + 'via_mqtt': ('flags', 4)}, 'Waypoint': {'favorites_only': ('notify_flags', 4), 'on_enter': ('notify_flags', 1), 'on_exit': ('notify_flags', 2)}} diff --git a/meshtastic/protobuf/common_pb2.py b/meshtastic/protobuf/common_pb2.py index 5ab6528aa..2cdcc4e84 100644 --- a/meshtastic/protobuf/common_pb2.py +++ b/meshtastic/protobuf/common_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/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf4\t\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xb0\x01\n\x06ROUTER\x10\x02\x1a\xa3\x01\xca\xf3\x18\x9e\x01:\x06RouterB\x93\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12H\n\x07TRACKER\x10\x03\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x04\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x05\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x06\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x89\x01\n\x0eLOST_AND_FOUND\x10\x07\x1au\xca\xf3\x18q:\x0eLost and FoundB_Broadcasts location as message to default channel regularly for to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\x08\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\t\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\x85\x01\n\x0b\x43LIENT_BASE\x10\n\x1at\xca\xf3\x18p:\x0b\x43lient BaseBaUsed for rooftop nodes to distribute messages more widely from multiple nearby client mute nodes.*\xbc\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12(\n\rREGION_MY_433\x10\x0e\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x10\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x11\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x14\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x15\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x17\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x18\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x19\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1b\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1e\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10\x1f\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10 \x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10#\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xa1\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08*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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf8\x02\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\x96\x01\n\x06ROUTER\x10\x01\x1a\x89\x01\xca\xf3\x18\x84\x01:\x06RouterBzInfrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage.\x12H\n\x07TRACKER\x10\x02\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x03\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.*\xbc\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12(\n\rREGION_MY_433\x10\x0e\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x10\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x11\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x14\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x15\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x17\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x18\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x19\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1b\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1e\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10\x1f\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10 \x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10#\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xe5\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08\x12!\n\x1aNODE_FLAG_RELAYS_FAVORITES\x10\x80\x80\x80\x10\x12\x1f\n\x18NODE_FLAG_LOST_AND_FOUND\x10\x80\x80\x80 *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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -26,26 +26,12 @@ _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\014CommonProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_ROLE'].values_by_name["CLIENT"]._options = None _globals['_ROLE'].values_by_name["CLIENT"]._serialized_options = b'\312\363\0308:\006ClientB.App connected or stand alone messaging device.' - _globals['_ROLE'].values_by_name["CLIENT_MUTE"]._options = None - _globals['_ROLE'].values_by_name["CLIENT_MUTE"]._serialized_options = b'\312\363\030G:\013Client MuteB8Device that does not forward packets from other devices.' _globals['_ROLE'].values_by_name["ROUTER"]._options = None - _globals['_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.' + _globals['_ROLE'].values_by_name["ROUTER"]._serialized_options = b'\312\363\030\204\001:\006RouterBzInfrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage.' _globals['_ROLE'].values_by_name["TRACKER"]._options = None _globals['_ROLE'].values_by_name["TRACKER"]._serialized_options = b'\312\363\0307:\007TrackerB,Broadcasts GPS position packets as priority.' _globals['_ROLE'].values_by_name["SENSOR"]._options = None _globals['_ROLE'].values_by_name["SENSOR"]._serialized_options = b'\312\363\0303:\006SensorB)Broadcasts telemetry packets as priority.' - _globals['_ROLE'].values_by_name["TAK"]._options = None - _globals['_ROLE'].values_by_name["TAK"]._serialized_options = b'\312\363\030K:\003TAKBDOptimized for ATAK system communication, reduces routine broadcasts.' - _globals['_ROLE'].values_by_name["CLIENT_HIDDEN"]._options = None - _globals['_ROLE'].values_by_name["CLIENT_HIDDEN"]._serialized_options = b'\312\363\030T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.' - _globals['_ROLE'].values_by_name["LOST_AND_FOUND"]._options = None - _globals['_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.' - _globals['_ROLE'].values_by_name["TAK_TRACKER"]._options = None - _globals['_ROLE'].values_by_name["TAK_TRACKER"]._serialized_options = b'\312\363\030S:\013TAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.' - _globals['_ROLE'].values_by_name["ROUTER_LATE"]._options = None - _globals['_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.' - _globals['_ROLE'].values_by_name["CLIENT_BASE"]._options = None - _globals['_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.' _globals['_REGIONCODE'].values_by_name["REGION_UNSET"]._options = None _globals['_REGIONCODE'].values_by_name["REGION_UNSET"]._serialized_options = b'\312\363\030\025:\023Please set a region' _globals['_REGIONCODE'].values_by_name["REGION_US"]._options = None @@ -171,21 +157,21 @@ _globals['_DEVICEMETADATA'].fields_by_name['role']._options = None _globals['_DEVICEMETADATA'].fields_by_name['role']._serialized_options = b'\222?\0028\010' _globals['_ROLE']._serialized_start=599 - _globals['_ROLE']._serialized_end=1867 - _globals['_REGIONCODE']._serialized_start=1870 - _globals['_REGIONCODE']._serialized_end=3466 - _globals['_INPUTBROKEREVENT']._serialized_start=3469 - _globals['_INPUTBROKEREVENT']._serialized_end=4093 - _globals['_MODEMPRESET']._serialized_start=4096 - _globals['_MODEMPRESET']._serialized_end=4821 - _globals['_NODEFLAGS']._serialized_start=4824 - _globals['_NODEFLAGS']._serialized_end=5241 - _globals['_LOCSOURCE']._serialized_start=5243 - _globals['_LOCSOURCE']._serialized_end=5321 - _globals['_ERRORCODE']._serialized_start=5324 - _globals['_ERRORCODE']._serialized_end=5750 - _globals['_FIRMWAREEDITION']._serialized_start=5753 - _globals['_FIRMWAREEDITION']._serialized_end=5986 + _globals['_ROLE']._serialized_end=975 + _globals['_REGIONCODE']._serialized_start=978 + _globals['_REGIONCODE']._serialized_end=2574 + _globals['_INPUTBROKEREVENT']._serialized_start=2577 + _globals['_INPUTBROKEREVENT']._serialized_end=3201 + _globals['_MODEMPRESET']._serialized_start=3204 + _globals['_MODEMPRESET']._serialized_end=3929 + _globals['_NODEFLAGS']._serialized_start=3932 + _globals['_NODEFLAGS']._serialized_end=4417 + _globals['_LOCSOURCE']._serialized_start=4419 + _globals['_LOCSOURCE']._serialized_end=4497 + _globals['_ERRORCODE']._serialized_start=4500 + _globals['_ERRORCODE']._serialized_end=4926 + _globals['_FIRMWAREEDITION']._serialized_start=4929 + _globals['_FIRMWAREEDITION']._serialized_end=5162 _globals['_DEVICEMETADATA']._serialized_start=134 _globals['_DEVICEMETADATA']._serialized_end=596 _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_start=361 diff --git a/meshtastic/protobuf/common_pb2.pyi b/meshtastic/protobuf/common_pb2.pyi index 5ed246508..de593b845 100644 --- a/meshtastic/protobuf/common_pb2.pyi +++ b/meshtastic/protobuf/common_pb2.pyi @@ -25,157 +25,54 @@ class _RoleEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Role.ValueType], DESCRIPTOR: _descriptor.EnumDescriptor CLIENT: _Role.ValueType # 0 """ - Description: App connected or stand alone messaging device. - Technical Details: Default Role + A messaging device, app-connected or standalone. Relays normally, and mutes itself while + routers already cover it (DEVICE_AUTO_MUTE_DISABLED opts out). """ - CLIENT_MUTE: _Role.ValueType # 1 + ROUTER: _Role.ValueType # 1 """ - Description: Device that does not forward packets from other devices. + Infrastructure: never cancels a relay, relays early (or late with DEVICE_RELAY_LATE), + does not sleep. Clients mute for it, relay rules apply to it, and EU data-network duty + cycle rules treat it as an access point. """ - ROUTER: _Role.ValueType # 2 + TRACKER: _Role.ValueType # 2 """ - Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. - Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. - The wifi radio and the oled screen will be put to sleep. - This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. + A position reporter: its positions get queue priority and a hop floor of 2, it may sleep + between them, and peers protect it in their warm tier. """ - TRACKER: _Role.ValueType # 3 + SENSOR: _Role.ValueType # 3 """ - Description: Broadcasts GPS position packets as priority. - Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send position, and then sleep for position.position_broadcast_secs seconds. - """ - SENSOR: _Role.ValueType # 4 - """ - Description: Broadcasts telemetry packets as priority. - Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. - """ - TAK: _Role.ValueType # 5 - """ - Description: Optimized for ATAK system communication and reduces routine broadcasts. - Technical Details: Used for nodes dedicated for connection to an ATAK EUD. - Turns off many of the routine broadcasts to favor CoT packet stream - from the Meshtastic ATAK plugin -> IMeshService -> Node - """ - CLIENT_HIDDEN: _Role.ValueType # 6 - """ - Description: Device that only broadcasts as needed for stealth or power savings. - Technical Details: Used for nodes that "only speak when spoken to" - Turns all of the routine broadcasts but allows for ad-hoc communication - Still rebroadcasts, but with local only rebroadcast mode (known meshes only) - Can be used for clandestine operation or to dramatically reduce airtime / power consumption - """ - LOST_AND_FOUND: _Role.ValueType # 7 - """ - Description: Broadcasts location as message to default channel regularly for to assist with device recovery. - Technical Details: Used to automatically send a text message to the mesh - with the current position of the device on a frequent interval: - "I'm lost! Position: lat / long" - """ - TAK_TRACKER: _Role.ValueType # 8 - """ - Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. - Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream - and automatic TAK PLI (position location information) broadcasts. - Uses position module configuration to determine TAK PLI broadcast interval. - """ - ROUTER_LATE: _Role.ValueType # 9 - """ - Description: Will always rebroadcast packets, but will do so after all other modes. - Technical Details: Used for router nodes that are intended to provide additional coverage - in areas not already covered by other routers, or to bridge around problematic terrain, - but should not be given priority over other routers in order to avoid unnecessarily - consuming hops. - """ - CLIENT_BASE: _Role.ValueType # 10 - """ - Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. - Technical Details: Used for stronger attic/roof nodes to distribute messages more widely - from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes - where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. + A telemetry reporter: its telemetry gets priority and a hop floor of 1, it may sleep + between reports, and peers protect it in their warm tier. """ class Role(_Role, metaclass=_RoleEnumTypeWrapper): """ - Defines the device's role on the Mesh network + What a device is on the mesh. Four base roles; finer behaviour is a switch on a role + (DeviceConfig.Flags, TAKConfig.Flags), and the defaults each configuration installs are rows in + registry/roles.yaml. A peer acts on the advertised role and on NODE_FLAG_RELAYS_FAVORITES and + NODE_FLAG_LOST_AND_FOUND. """ CLIENT: Role.ValueType # 0 """ -Description: App connected or stand alone messaging device. -Technical Details: Default Role -""" -CLIENT_MUTE: Role.ValueType # 1 -""" -Description: Device that does not forward packets from other devices. -""" -ROUTER: Role.ValueType # 2 -""" -Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list. -Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps. - The wifi radio and the oled screen will be put to sleep. - This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. +A messaging device, app-connected or standalone. Relays normally, and mutes itself while +routers already cover it (DEVICE_AUTO_MUTE_DISABLED opts out). """ -TRACKER: Role.ValueType # 3 +ROUTER: Role.ValueType # 1 """ -Description: Broadcasts GPS position packets as priority. -Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send position, and then sleep for position.position_broadcast_secs seconds. +Infrastructure: never cancels a relay, relays early (or late with DEVICE_RELAY_LATE), +does not sleep. Clients mute for it, relay rules apply to it, and EU data-network duty +cycle rules treat it as an access point. """ -SENSOR: Role.ValueType # 4 +TRACKER: Role.ValueType # 2 """ -Description: Broadcasts telemetry packets as priority. -Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default. - When used in conjunction with power.is_power_saving = true, nodes will wake up, - send environment telemetry, and then sleep for telemetry.environment_update_interval seconds. +A position reporter: its positions get queue priority and a hop floor of 2, it may sleep +between them, and peers protect it in their warm tier. """ -TAK: Role.ValueType # 5 +SENSOR: Role.ValueType # 3 """ -Description: Optimized for ATAK system communication and reduces routine broadcasts. -Technical Details: Used for nodes dedicated for connection to an ATAK EUD. - Turns off many of the routine broadcasts to favor CoT packet stream - from the Meshtastic ATAK plugin -> IMeshService -> Node -""" -CLIENT_HIDDEN: Role.ValueType # 6 -""" -Description: Device that only broadcasts as needed for stealth or power savings. -Technical Details: Used for nodes that "only speak when spoken to" - Turns all of the routine broadcasts but allows for ad-hoc communication - Still rebroadcasts, but with local only rebroadcast mode (known meshes only) - Can be used for clandestine operation or to dramatically reduce airtime / power consumption -""" -LOST_AND_FOUND: Role.ValueType # 7 -""" -Description: Broadcasts location as message to default channel regularly for to assist with device recovery. -Technical Details: Used to automatically send a text message to the mesh - with the current position of the device on a frequent interval: - "I'm lost! Position: lat / long" -""" -TAK_TRACKER: Role.ValueType # 8 -""" -Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts. -Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream - and automatic TAK PLI (position location information) broadcasts. - Uses position module configuration to determine TAK PLI broadcast interval. -""" -ROUTER_LATE: Role.ValueType # 9 -""" -Description: Will always rebroadcast packets, but will do so after all other modes. -Technical Details: Used for router nodes that are intended to provide additional coverage - in areas not already covered by other routers, or to bridge around problematic terrain, - but should not be given priority over other routers in order to avoid unnecessarily - consuming hops. -""" -CLIENT_BASE: Role.ValueType # 10 -""" -Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT. -Technical Details: Used for stronger attic/roof nodes to distribute messages more widely - from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes - where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. +A telemetry reporter: its telemetry gets priority and a hop floor of 1, it may sleep +between reports, and peers protect it in their warm tier. """ Global___Role: _TypeAlias = Role # noqa: Y015 @@ -673,6 +570,16 @@ class _NodeFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_NodeFlags.V rather than over the air - see NODE_FLAG_VIA_MQTT - nor for one added as a shared contact, which has never been heard over RF at all. """ + NODE_FLAG_RELAYS_FAVORITES: _NodeFlags.ValueType # 33554432 + """ + A CLIENT with DEVICE_RELAY_FAVORITES: it relays its favourites' traffic like a router and + counts as infrastructure for zero-cost hops between favourites. Set by the node itself. + """ + NODE_FLAG_LOST_AND_FOUND: _NodeFlags.ValueType # 67108864 + """ + A TRACKER with DEVICE_LOST_AND_FOUND: it is asking to be found, so peers let its duplicate + positions through more often. Set by the node itself. + """ class NodeFlags(_NodeFlags, metaclass=_NodeFlagsEnumTypeWrapper): """ @@ -742,6 +649,16 @@ them. Never set for a node heard only over MQTT, which reaches us over the inter rather than over the air - see NODE_FLAG_VIA_MQTT - nor for one added as a shared contact, which has never been heard over RF at all. """ +NODE_FLAG_RELAYS_FAVORITES: NodeFlags.ValueType # 33554432 +""" +A CLIENT with DEVICE_RELAY_FAVORITES: it relays its favourites' traffic like a router and +counts as infrastructure for zero-cost hops between favourites. Set by the node itself. +""" +NODE_FLAG_LOST_AND_FOUND: NodeFlags.ValueType # 67108864 +""" +A TRACKER with DEVICE_LOST_AND_FOUND: it is asking to be found, so peers let its duplicate +positions through more often. Set by the node itself. +""" Global___NodeFlags: _TypeAlias = NodeFlags # noqa: Y015 class _LocSource: diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index 9e527f734..a15448f3b 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xec\x16\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\x1a\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -34,7 +34,7 @@ _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["KNOWN_ONLY"]._options = None _globals['_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.' _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["NONE"]._options = None - _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["NONE"]._serialized_options = b'\312\363\0305:\004NoneB-Never rebroadcast. Not available on a router.' _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["CORE_PORTNUMS_ONLY"]._options = None _globals['_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.' _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS"]._options = None @@ -45,6 +45,14 @@ _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_LED_HEARTBEAT_DISABLED"]._serialized_options = b'\312\363\030\246\001:\rLED HeartbeatB\224\001Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.' _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_AUTO_MUTE_DISABLED"]._options = None _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_AUTO_MUTE_DISABLED"]._serialized_options = b'\312\363\030\214\001:\030Disable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_RELAY_LATE"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_RELAY_LATE"]._serialized_options = b'\312\363\030v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_RELAY_FAVORITES"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_RELAY_FAVORITES"]._serialized_options = b'\312\363\030\205\001:\017Relay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_QUIET"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_QUIET"]._serialized_options = b'\312\363\030S:\005QuietBJClient: send nothing on a schedule, only answer and send what you ask for.' + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_LOST_AND_FOUND"]._options = None + _globals['_DEVICECONFIG_FLAGS'].values_by_name["DEVICE_LOST_AND_FOUND"]._serialized_options = b'\312\363\030f:\016Lost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.' _globals['_DEVICECONFIG'].fields_by_name['role']._options = None _globals['_DEVICECONFIG'].fields_by_name['role']._serialized_options = b'\312\363\030\r:\013Device Role' _globals['_DEVICECONFIG'].fields_by_name['button_gpio']._options = None @@ -306,73 +314,73 @@ _globals['_RELAYCONFIG'].fields_by_name['regions']._options = None _globals['_RELAYCONFIG'].fields_by_name['regions']._serialized_options = b'\222?\004\010\020\020\004' _globals['_DEVICECONFIG']._serialized_start=168 - _globals['_DEVICECONFIG']._serialized_end=3092 + _globals['_DEVICECONFIG']._serialized_end=3574 _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1140 - _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_end=2237 - _globals['_DEVICECONFIG_BUZZERMODE']._serialized_start=2239 - _globals['_DEVICECONFIG_BUZZERMODE']._serialized_end=2344 - _globals['_DEVICECONFIG_FLAGS']._serialized_start=2347 - _globals['_DEVICECONFIG_FLAGS']._serialized_end=3009 - _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_start=3011 - _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_end=3092 - _globals['_POSITIONCONFIG']._serialized_start=3095 - _globals['_POSITIONCONFIG']._serialized_end=4806 - _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=4280 - _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=4701 - _globals['_POSITIONCONFIG_GPSMODE']._serialized_start=4703 - _globals['_POSITIONCONFIG_GPSMODE']._serialized_end=4806 - _globals['_POWERCONFIG']._serialized_start=4809 - _globals['_POWERCONFIG']._serialized_end=5512 - _globals['_NETWORKCONFIG']._serialized_start=5515 - _globals['_NETWORKCONFIG']._serialized_end=6668 - _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_start=6125 - _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_end=6245 - _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_start=6247 - _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_end=6308 - _globals['_NETWORKCONFIG_FLAGS']._serialized_start=6311 - _globals['_NETWORKCONFIG_FLAGS']._serialized_end=6581 - _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=6583 - _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=6668 - _globals['_DISPLAYCONFIG']._serialized_start=6671 - _globals['_DISPLAYCONFIG']._serialized_end=8814 - _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_start=7425 - _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_end=7672 - _globals['_DISPLAYCONFIG_FLAGS']._serialized_start=7675 - _globals['_DISPLAYCONFIG_FLAGS']._serialized_end=8258 - _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=8261 - _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=8475 - _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=8478 - _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=8814 - _globals['_LORACONFIG']._serialized_start=8817 - _globals['_LORACONFIG']._serialized_end=10917 - _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_start=10155 - _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_end=10213 - _globals['_LORACONFIG_FLAGS']._serialized_start=10216 - _globals['_LORACONFIG_FLAGS']._serialized_end=10917 - _globals['_BLUETOOTHCONFIG']._serialized_start=10920 - _globals['_BLUETOOTHCONFIG']._serialized_end=11356 - _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11238 - _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11356 - _globals['_SECURITYCONFIG']._serialized_start=11359 - _globals['_SECURITYCONFIG']._serialized_end=13112 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=11972 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=12566 - _globals['_SECURITYCONFIG_FLAGS']._serialized_start=12569 - _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13025 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13027 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13112 - _globals['_SESSIONKEYCONFIG']._serialized_start=13114 - _globals['_SESSIONKEYCONFIG']._serialized_end=13132 - _globals['_GROUPCONFIG']._serialized_start=13135 - _globals['_GROUPCONFIG']._serialized_end=13292 - _globals['_GROUPCONFIG_GROUP']._serialized_start=13213 - _globals['_GROUPCONFIG_GROUP']._serialized_end=13292 - _globals['_RELAYCONFIG']._serialized_start=13295 - _globals['_RELAYCONFIG']._serialized_end=13706 - _globals['_RELAYCONFIG_RULE']._serialized_start=13530 - _globals['_RELAYCONFIG_RULE']._serialized_end=13646 - _globals['_RELAYCONFIG_ACTION']._serialized_start=13648 - _globals['_RELAYCONFIG_ACTION']._serialized_end=13706 - _globals['_CONFIGPAYLOAD']._serialized_start=13709 - _globals['_CONFIGPAYLOAD']._serialized_end=14342 + _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_end=2157 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_start=2159 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_end=2264 + _globals['_DEVICECONFIG_FLAGS']._serialized_start=2267 + _globals['_DEVICECONFIG_FLAGS']._serialized_end=3491 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_start=3493 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_end=3574 + _globals['_POSITIONCONFIG']._serialized_start=3577 + _globals['_POSITIONCONFIG']._serialized_end=5288 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=4762 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=5183 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_start=5185 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_end=5288 + _globals['_POWERCONFIG']._serialized_start=5291 + _globals['_POWERCONFIG']._serialized_end=5994 + _globals['_NETWORKCONFIG']._serialized_start=5997 + _globals['_NETWORKCONFIG']._serialized_end=7150 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_start=6607 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_end=6727 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_start=6729 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_end=6790 + _globals['_NETWORKCONFIG_FLAGS']._serialized_start=6793 + _globals['_NETWORKCONFIG_FLAGS']._serialized_end=7063 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=7065 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=7150 + _globals['_DISPLAYCONFIG']._serialized_start=7153 + _globals['_DISPLAYCONFIG']._serialized_end=9296 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_start=7907 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_end=8154 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_start=8157 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_end=8740 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=8743 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=8957 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=8960 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=9296 + _globals['_LORACONFIG']._serialized_start=9299 + _globals['_LORACONFIG']._serialized_end=11399 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_start=10637 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_end=10695 + _globals['_LORACONFIG_FLAGS']._serialized_start=10698 + _globals['_LORACONFIG_FLAGS']._serialized_end=11399 + _globals['_BLUETOOTHCONFIG']._serialized_start=11402 + _globals['_BLUETOOTHCONFIG']._serialized_end=11838 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11720 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11838 + _globals['_SECURITYCONFIG']._serialized_start=11841 + _globals['_SECURITYCONFIG']._serialized_end=13594 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12454 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=13048 + _globals['_SECURITYCONFIG_FLAGS']._serialized_start=13051 + _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13507 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13509 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13594 + _globals['_SESSIONKEYCONFIG']._serialized_start=13596 + _globals['_SESSIONKEYCONFIG']._serialized_end=13614 + _globals['_GROUPCONFIG']._serialized_start=13617 + _globals['_GROUPCONFIG']._serialized_end=13774 + _globals['_GROUPCONFIG_GROUP']._serialized_start=13695 + _globals['_GROUPCONFIG_GROUP']._serialized_end=13774 + _globals['_RELAYCONFIG']._serialized_start=13777 + _globals['_RELAYCONFIG']._serialized_end=14188 + _globals['_RELAYCONFIG_RULE']._serialized_start=14012 + _globals['_RELAYCONFIG_RULE']._serialized_end=14128 + _globals['_RELAYCONFIG_ACTION']._serialized_start=14130 + _globals['_RELAYCONFIG_ACTION']._serialized_end=14188 + _globals['_CONFIGPAYLOAD']._serialized_start=14191 + _globals['_CONFIGPAYLOAD']._serialized_end=14824 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index d75318abe..e2ad84b1f 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -42,8 +42,8 @@ class DeviceConfig(_message.Message): ALL_SKIP_DECODING: DeviceConfig._RebroadcastMode.ValueType # 1 """ Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node - that repeats everything it hears without looking inside. Available on the relaying - roles, ROUTER and ROUTER_LATE; on any other role it behaves as ALL. + that repeats everything it hears without looking inside. Available on a ROUTER; on + any other role it behaves as ALL. """ LOCAL_ONLY: DeviceConfig._RebroadcastMode.ValueType # 2 """ @@ -57,7 +57,7 @@ class DeviceConfig(_message.Message): """ NONE: DeviceConfig._RebroadcastMode.ValueType # 4 """ - Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. + Relay nothing. Refused on a ROUTER. """ CORE_PORTNUMS_ONLY: DeviceConfig._RebroadcastMode.ValueType # 5 """ @@ -78,8 +78,8 @@ class DeviceConfig(_message.Message): ALL_SKIP_DECODING: DeviceConfig.RebroadcastMode.ValueType # 1 """ Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node - that repeats everything it hears without looking inside. Available on the relaying - roles, ROUTER and ROUTER_LATE; on any other role it behaves as ALL. + that repeats everything it hears without looking inside. Available on a ROUTER; on + any other role it behaves as ALL. """ LOCAL_ONLY: DeviceConfig.RebroadcastMode.ValueType # 2 """ @@ -93,7 +93,7 @@ class DeviceConfig(_message.Message): """ NONE: DeviceConfig.RebroadcastMode.ValueType # 4 """ - Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. + Relay nothing. Refused on a ROUTER. """ CORE_PORTNUMS_ONLY: DeviceConfig.RebroadcastMode.ValueType # 5 """ @@ -184,6 +184,24 @@ class DeviceConfig(_message.Message): """Disable the default blinking LED (LED_PIN) behaviour""" DEVICE_AUTO_MUTE_DISABLED: DeviceConfig._Flags.ValueType # 8 """Turn client auto-mute off: a CLIENT keeps relaying broadcasts however many routers it hears""" + DEVICE_RELAY_LATE: DeviceConfig._Flags.ValueType # 16 + """ROUTER only: relay in the late rebroadcast window instead of early. Ignored on other roles.""" + DEVICE_RELAY_FAVORITES: DeviceConfig._Flags.ValueType # 32 + """ + CLIENT only: relay favourites' traffic like a router (never cancel, late window), count + as infrastructure for zero-cost hops, keep favourites on a node-DB reset, never + auto-favourite, no auto-mute. Advertised as NODE_FLAG_RELAYS_FAVORITES. Ignored on other roles. + """ + DEVICE_QUIET: DeviceConfig._Flags.ValueType # 64 + """ + CLIENT only: no routine broadcasts - node info, position, device telemetry, neighbour + info, mesh beacon. Ignored on other roles. + """ + DEVICE_LOST_AND_FOUND: DeviceConfig._Flags.ValueType # 128 + """ + TRACKER only: position every 5 minutes with a lost-and-found text, position replies not + throttled. Advertised as NODE_FLAG_LOST_AND_FOUND. Ignored on other roles. + """ class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ @@ -200,6 +218,24 @@ class DeviceConfig(_message.Message): """Disable the default blinking LED (LED_PIN) behaviour""" DEVICE_AUTO_MUTE_DISABLED: DeviceConfig.Flags.ValueType # 8 """Turn client auto-mute off: a CLIENT keeps relaying broadcasts however many routers it hears""" + DEVICE_RELAY_LATE: DeviceConfig.Flags.ValueType # 16 + """ROUTER only: relay in the late rebroadcast window instead of early. Ignored on other roles.""" + DEVICE_RELAY_FAVORITES: DeviceConfig.Flags.ValueType # 32 + """ + CLIENT only: relay favourites' traffic like a router (never cancel, late window), count + as infrastructure for zero-cost hops, keep favourites on a node-DB reset, never + auto-favourite, no auto-mute. Advertised as NODE_FLAG_RELAYS_FAVORITES. Ignored on other roles. + """ + DEVICE_QUIET: DeviceConfig.Flags.ValueType # 64 + """ + CLIENT only: no routine broadcasts - node info, position, device telemetry, neighbour + info, mesh beacon. Ignored on other roles. + """ + DEVICE_LOST_AND_FOUND: DeviceConfig.Flags.ValueType # 128 + """ + TRACKER only: position every 5 minutes with a lost-and-found text, position replies not + throttled. Advertised as NODE_FLAG_LOST_AND_FOUND. Ignored on other roles. + """ class _DiscoveryFlags: ValueType = _typing.NewType("ValueType", _builtins.int) @@ -317,7 +353,7 @@ class DeviceConfig(_message.Message): auto_mute_router_count: _builtins.int """ Client auto-mute, CLIENT role only. A client that hears at least auto_mute_router_count - ROUTER or ROUTER_LATE neighbours directly, at auto_mute_min_snr or better, within + ROUTER neighbours directly, at auto_mute_min_snr or better, within auto_mute_window_secs stops relaying broadcasts: those routers already reach everyone it would. Unicast it is asked to carry is relayed as before. It resumes once the condition has not held for a whole window. DEVICE_AUTO_MUTE_DISABLED turns it off. @@ -1757,8 +1793,8 @@ class RelayConfig(_message.Message): """ Relay Policy - How this node relays broadcast traffic, per channel hash. Evaluated on the relaying - roles, ROUTER and ROUTER_LATE, only; every other role ignores it. Keyed by the + How this node relays broadcast traffic, per channel hash. Evaluated on a ROUTER only; + every other role ignores it. Keyed by the header's one-byte `chan`, so a rule covers every channel that hashes to that byte, held or not - which is what lets an operator cap a channel whose key the node does not have. diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index 4d02950ca..f9e1b30d7 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -412,7 +412,7 @@ class NodeDatabase(_message.Message): """ Every known node, this node's own entry included. The own entry is kept on purpose as a recovery copy of the owner: when DeviceState fails to load, firmware - restores the owner's names, is_licensed and is_unmessagable from it, and when the + restores the owner's names and descriptive flags from it, and when the node database is lost, rebuilds it from DeviceState.owner, DeviceConfig and SecurityConfig. It is otherwise an ordinary row, so nothing has to treat this node as a special case. diff --git a/meshtastic/protobuf/discovery_pb2.pyi b/meshtastic/protobuf/discovery_pb2.pyi index 5789559d8..85f051505 100644 --- a/meshtastic/protobuf/discovery_pb2.pyi +++ b/meshtastic/protobuf/discovery_pb2.pyi @@ -84,7 +84,7 @@ class NodeRecord(_message.Message): The signed bytes are exactly, with no separators beyond the two terminators shown: "mnr1" || public_key || varint(seq) || long_name || 0x00 || short_name || 0x00 - || hw_model (2 bytes, little-endian) || role (1 byte) || flags (2 bytes, LE) + || hw_model (2 bytes, little-endian) || role (1 byte) || flags (4 bytes, LE) A verifier checks the signature first, then checks that CRC32 of public_key equals the NodeNum the record was filed under, and drops the record if either fails. @@ -137,9 +137,9 @@ class NodeRecord(_message.Message): """ flags: _builtins.int """ - A bitwise OR of NodeFlags values, limited to the bits that describe the node to others: - NODE_FLAG_IS_LICENSED, NODE_FLAG_IS_UNMESSAGABLE and NODE_FLAG_HAS_IS_UNMESSAGABLE. The - rest of NodeFlags is a receiver's own opinion - favourite, ignored, muted, verified - and + A bitwise OR of NodeFlags values, limited to the bits that describe the node to others, + as User.flags: NODE_FLAG_IS_LICENSED, NODE_FLAG_IS_UNMESSAGABLE, NODE_FLAG_HAS_IS_UNMESSAGABLE, + NODE_FLAG_RELAYS_FAVORITES and NODE_FLAG_LOST_AND_FOUND. The rest of NodeFlags is a receiver's own opinion - favourite, ignored, muted, verified - and a record that sets one of those is signed nonsense: a receiver ignores those bits rather than rejecting the record. """ diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index 91b9a6614..d34ea02a6 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\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 role\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -313,10 +313,14 @@ _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_interval_secs']._serialized_options = b'\312\363\030/*\001s:\010IntervalB How often a beacon is broadcast.' _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_targets']._options = None _globals['_MESHBEACONCONFIG'].fields_by_name['broadcast_targets']._serialized_options = b'\222?\002\020\004' + _globals['_TAKCONFIG_FLAGS'].values_by_name["TAK_ENABLED"]._options = None + _globals['_TAKCONFIG_FLAGS'].values_by_name["TAK_ENABLED"]._serialized_options = b'\312\363\030e:\013TAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.' _globals['_TAKCONFIG'].fields_by_name['team']._options = None _globals['_TAKCONFIG'].fields_by_name['team']._serialized_options = b'\312\363\030\026:\004TeamB\016TAK team color' _globals['_TAKCONFIG'].fields_by_name['role']._options = None _globals['_TAKCONFIG'].fields_by_name['role']._serialized_options = b'\312\363\030\027:\004RoleB\017TAK member role' + _globals['_TAKCONFIG'].fields_by_name['flags']._options = None + _globals['_TAKCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\010' _globals['_REMOTEHARDWAREPIN'].fields_by_name['gpio_pin']._options = None _globals['_REMOTEHARDWAREPIN'].fields_by_name['gpio_pin']._serialized_options = b'\222?\0028\010' _globals['_REMOTEHARDWAREPIN'].fields_by_name['name']._options = None @@ -329,8 +333,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14554 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14627 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14724 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14797 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -390,11 +394,13 @@ _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12932 _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13028 _globals['_TAKCONFIG']._serialized_start=13058 - _globals['_TAKCONFIG']._serialized_end=13214 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13216 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13339 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13341 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13435 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13438 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14552 + _globals['_TAKCONFIG']._serialized_end=13384 + _globals['_TAKCONFIG_FLAGS']._serialized_start=13239 + _globals['_TAKCONFIG_FLAGS']._serialized_end=13384 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13386 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13509 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13511 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13605 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13608 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14722 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index cc8cb7598..ff23a9396 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -1587,8 +1587,24 @@ class TAKConfig(_message.Message): DESCRIPTOR: _descriptor.Descriptor + class _Flags: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + + class _FlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[TAKConfig._Flags.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + TAK_NONE: TAKConfig._Flags.ValueType # 0 + TAK_ENABLED: TAKConfig._Flags.ValueType # 1 + """Run the ATAK plugin module; a TRACKER sends its position as ATAK PLI""" + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): ... + TAK_NONE: TAKConfig.Flags.ValueType # 0 + TAK_ENABLED: TAKConfig.Flags.ValueType # 1 + """Run the ATAK plugin module; a TRACKER sends its position as ATAK PLI""" + TEAM_FIELD_NUMBER: _builtins.int ROLE_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int team: _atak_pb2.Team.ValueType """ Team color. @@ -1599,15 +1615,20 @@ class TAKConfig(_message.Message): Member role. Default Unspecifed -> firmware uses TeamMember """ + flags: _builtins.int + """ + Bitwise OR of Flags values. + """ def __init__( self, *, team: _atak_pb2.Team.ValueType = ..., role: _atak_pb2.MemberRole.ValueType = ..., + flags: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["role", b"role", "team", b"team"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "role", b"role", "team", b"team"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/region_registry_pb2.pyi b/meshtastic/protobuf/region_registry_pb2.pyi index 804f5b526..b78bbe681 100644 --- a/meshtastic/protobuf/region_registry_pb2.pyi +++ b/meshtastic/protobuf/region_registry_pb2.pyi @@ -87,7 +87,7 @@ class RegionInfo(_message.Message): depends on the node's role is a firmware region hook, not data. """ power_limit_dbm: _builtins.int - """Maximum TX power in dBm. A licensed operator (User.is_licensed) may exceed it.""" + """Maximum TX power in dBm. A licensed operator (NODE_FLAG_IS_LICENSED) may exceed it.""" frequency_switching: _builtins.bool """Whether frequency hopping/switching is allowed""" wide_lora: _builtins.bool @@ -219,7 +219,7 @@ class RegionProfile(_message.Message): """Whether audio mode is permitted""" licensed_only: _builtins.bool """ - Only a licensed operator (User.is_licensed) may select a region using this + Only a licensed operator (NODE_FLAG_IS_LICENSED) may select a region using this profile; firmware rejects the region otherwise. """ position_throttle: _builtins.int diff --git a/meshtastic/protobuf/role_registry_pb2.py b/meshtastic/protobuf/role_registry_pb2.py new file mode 100644 index 000000000..1c973b3d1 --- /dev/null +++ b/meshtastic/protobuf/role_registry_pb2.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/role_registry.proto +# Protobuf Python Version: 4.25.1 +"""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 common_pb2 as meshtastic_dot_protobuf_dot_common__pb2 +from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/role_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\"W\n\x08RoleInfo\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xa4\x07\n\x0cRoleDefaults\x12\x17\n\x0freset_intervals\x18\x01 \x01(\x08\x12P\n\x10rebroadcast_mode\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeH\x00\x88\x01\x01\x12%\n\x18node_info_broadcast_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x12$\n\x17position_broadcast_secs\x18\x04 \x01(\rH\x02\x88\x01\x01\x12-\n position_broadcast_smart_enabled\x18\x05 \x01(\x08H\x03\x88\x01\x01\x12-\n broadcast_smart_minimum_distance\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x32\n%broadcast_smart_minimum_interval_secs\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eposition_flags\x18\x08 \x01(\rH\x06\x88\x01\x01\x12(\n\x1b\x64\x65vice_update_interval_secs\x18\t \x01(\rH\x07\x88\x01\x01\x12(\n\x1bsensor_update_interval_secs\x18\n \x01(\rH\x08\x88\x01\x01\x12$\n\x17\x65nvironment_measurement\x18\x0b \x01(\x08H\t\x88\x01\x01\x12/\n\"neighbor_info_update_interval_secs\x18\x0c \x01(\rH\n\x88\x01\x01\x12\x19\n\x0cunmessagable\x18\r \x01(\x08H\x0b\x88\x01\x01\x42\x13\n\x11_rebroadcast_modeB\x1b\n\x19_node_info_broadcast_secsB\x1a\n\x18_position_broadcast_secsB#\n!_position_broadcast_smart_enabledB#\n!_broadcast_smart_minimum_distanceB(\n&_broadcast_smart_minimum_interval_secsB\x11\n\x0f_position_flagsB\x1e\n\x1c_device_update_interval_secsB\x1e\n\x1c_sensor_update_interval_secsB\x1a\n\x18_environment_measurementB%\n#_neighbor_info_update_interval_secsB\x0f\n\r_unmessagable\"\xc5\x01\n\nRolePreset\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\'\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x0c\x64\x65vice_flags\x18\x05 \x01(\r\x12\x11\n\ttak_flags\x18\x06 \x01(\r\x12\x33\n\x08\x64\x65\x66\x61ults\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.RoleDefaults\"\x80\x01\n\x0cRoleRegistry\x12\x10\n\x08revision\x18\x01 \x01(\r\x12,\n\x05roles\x18\x02 \x03(\x0b\x32\x1d.meshtastic.protobuf.RoleInfo\x12\x30\n\x07presets\x18\x03 \x03(\x0b\x32\x1f.meshtastic.protobuf.RolePresetBh\n\x14org.meshtastic.protoB\x12RoleRegistryProtosZ\"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.role_registry_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\022RoleRegistryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_ROLEINFO']._serialized_start=132 + _globals['_ROLEINFO']._serialized_end=219 + _globals['_ROLEDEFAULTS']._serialized_start=222 + _globals['_ROLEDEFAULTS']._serialized_end=1154 + _globals['_ROLEPRESET']._serialized_start=1157 + _globals['_ROLEPRESET']._serialized_end=1354 + _globals['_ROLEREGISTRY']._serialized_start=1357 + _globals['_ROLEREGISTRY']._serialized_end=1485 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/role_registry_pb2.pyi b/meshtastic/protobuf/role_registry_pb2.pyi new file mode 100644 index 000000000..51ed74da0 --- /dev/null +++ b/meshtastic/protobuf/role_registry_pb2.pyi @@ -0,0 +1,256 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +from collections import abc as _abc +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf.internal import containers as _containers +from . import common_pb2 as _common_pb2 +from . import config_pb2 as _config_pb2 +import builtins as _builtins +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import TypeAlias as _TypeAlias, Never as _Never +else: + from typing_extensions import TypeAlias as _TypeAlias, Never as _Never + +DESCRIPTOR: _descriptor.FileDescriptor + +@_typing.final +class RoleInfo(_message.Message): + """ + Role Registry + + NOT used on-wire; consumed by clients and the firmware build. Labels for the four Role + values, and one row per configuration worth naming: a role, its switches, and the + defaults a device installs when it takes that configuration. A device that is set to a + role, or turns a switch on or off, installs the defaults of the row it now matches. + + Data lives in registry/roles.yaml. tools/gen_registry.py validates it and generates + registry/generated/roles.json, which `buf convert` serializes. + + + A base role as clients show it + """ + + DESCRIPTOR: _descriptor.Descriptor + + ROLE_FIELD_NUMBER: _builtins.int + LABEL_FIELD_NUMBER: _builtins.int + DESCRIPTION_FIELD_NUMBER: _builtins.int + role: _common_pb2.Role.ValueType + label: _builtins.str + """Display name""" + description: _builtins.str + """One-line explanation""" + def __init__( + self, + *, + role: _common_pb2.Role.ValueType = ..., + label: _builtins.str = ..., + description: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["description", b"description", "label", b"label", "role", b"role"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RoleInfo: _TypeAlias = RoleInfo # noqa: Y015 + +@_typing.final +class RoleDefaults(_message.Message): + """ + What a device sets when it takes a configuration, beyond the role and its switches. A + field left unset leaves the device's current value alone. + """ + + DESCRIPTOR: _descriptor.Descriptor + + RESET_INTERVALS_FIELD_NUMBER: _builtins.int + REBROADCAST_MODE_FIELD_NUMBER: _builtins.int + NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + POSITION_BROADCAST_SECS_FIELD_NUMBER: _builtins.int + POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: _builtins.int + BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: _builtins.int + BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + POSITION_FLAGS_FIELD_NUMBER: _builtins.int + DEVICE_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + SENSOR_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + ENVIRONMENT_MEASUREMENT_FIELD_NUMBER: _builtins.int + NEIGHBOR_INFO_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + UNMESSAGABLE_FIELD_NUMBER: _builtins.int + reset_intervals: _builtins.bool + """Restore every broadcast, telemetry and power interval to its default before the values below""" + rebroadcast_mode: _config_pb2.DeviceConfig.RebroadcastMode.ValueType + node_info_broadcast_secs: _builtins.int + position_broadcast_secs: _builtins.int + position_broadcast_smart_enabled: _builtins.bool + broadcast_smart_minimum_distance: _builtins.int + broadcast_smart_minimum_interval_secs: _builtins.int + position_flags: _builtins.int + """Bitwise OR of PositionConfig.PositionFlags values""" + device_update_interval_secs: _builtins.int + sensor_update_interval_secs: _builtins.int + environment_measurement: _builtins.bool + """TelemetryConfig environment measurement on or off""" + neighbor_info_update_interval_secs: _builtins.int + unmessagable: _builtins.bool + """Advertise the node as not taking direct messages (NODE_FLAG_IS_UNMESSAGABLE)""" + def __init__( + self, + *, + reset_intervals: _builtins.bool = ..., + rebroadcast_mode: _config_pb2.DeviceConfig.RebroadcastMode.ValueType | None = ..., + node_info_broadcast_secs: _builtins.int | None = ..., + position_broadcast_secs: _builtins.int | None = ..., + position_broadcast_smart_enabled: _builtins.bool | None = ..., + broadcast_smart_minimum_distance: _builtins.int | None = ..., + broadcast_smart_minimum_interval_secs: _builtins.int | None = ..., + position_flags: _builtins.int | None = ..., + device_update_interval_secs: _builtins.int | None = ..., + sensor_update_interval_secs: _builtins.int | None = ..., + environment_measurement: _builtins.bool | None = ..., + neighbor_info_update_interval_secs: _builtins.int | None = ..., + unmessagable: _builtins.bool | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "neighbor_info_update_interval_secs", b"neighbor_info_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "neighbor_info_update_interval_secs", b"neighbor_info_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "reset_intervals", b"reset_intervals", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance"] # noqa: Y015 + _WhichOneofArgType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance"] # noqa: Y015 + _WhichOneofReturnType__broadcast_smart_minimum_interval_secs: _TypeAlias = _typing.Literal["broadcast_smart_minimum_interval_secs"] # noqa: Y015 + _WhichOneofArgType__broadcast_smart_minimum_interval_secs: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs"] # noqa: Y015 + _WhichOneofReturnType__device_update_interval_secs: _TypeAlias = _typing.Literal["device_update_interval_secs"] # noqa: Y015 + _WhichOneofArgType__device_update_interval_secs: _TypeAlias = _typing.Literal["_device_update_interval_secs", b"_device_update_interval_secs"] # noqa: Y015 + _WhichOneofReturnType__environment_measurement: _TypeAlias = _typing.Literal["environment_measurement"] # noqa: Y015 + _WhichOneofArgType__environment_measurement: _TypeAlias = _typing.Literal["_environment_measurement", b"_environment_measurement"] # noqa: Y015 + _WhichOneofReturnType__neighbor_info_update_interval_secs: _TypeAlias = _typing.Literal["neighbor_info_update_interval_secs"] # noqa: Y015 + _WhichOneofArgType__neighbor_info_update_interval_secs: _TypeAlias = _typing.Literal["_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs"] # noqa: Y015 + _WhichOneofReturnType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["node_info_broadcast_secs"] # noqa: Y015 + _WhichOneofArgType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["_node_info_broadcast_secs", b"_node_info_broadcast_secs"] # noqa: Y015 + _WhichOneofReturnType__position_broadcast_secs: _TypeAlias = _typing.Literal["position_broadcast_secs"] # noqa: Y015 + _WhichOneofArgType__position_broadcast_secs: _TypeAlias = _typing.Literal["_position_broadcast_secs", b"_position_broadcast_secs"] # noqa: Y015 + _WhichOneofReturnType__position_broadcast_smart_enabled: _TypeAlias = _typing.Literal["position_broadcast_smart_enabled"] # noqa: Y015 + _WhichOneofArgType__position_broadcast_smart_enabled: _TypeAlias = _typing.Literal["_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled"] # noqa: Y015 + _WhichOneofReturnType__position_flags: _TypeAlias = _typing.Literal["position_flags"] # noqa: Y015 + _WhichOneofArgType__position_flags: _TypeAlias = _typing.Literal["_position_flags", b"_position_flags"] # noqa: Y015 + _WhichOneofReturnType__rebroadcast_mode: _TypeAlias = _typing.Literal["rebroadcast_mode"] # noqa: Y015 + _WhichOneofArgType__rebroadcast_mode: _TypeAlias = _typing.Literal["_rebroadcast_mode", b"_rebroadcast_mode"] # noqa: Y015 + _WhichOneofReturnType__sensor_update_interval_secs: _TypeAlias = _typing.Literal["sensor_update_interval_secs"] # noqa: Y015 + _WhichOneofArgType__sensor_update_interval_secs: _TypeAlias = _typing.Literal["_sensor_update_interval_secs", b"_sensor_update_interval_secs"] # noqa: Y015 + _WhichOneofReturnType__unmessagable: _TypeAlias = _typing.Literal["unmessagable"] # noqa: Y015 + _WhichOneofArgType__unmessagable: _TypeAlias = _typing.Literal["_unmessagable", b"_unmessagable"] # noqa: Y015 + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__broadcast_smart_minimum_distance) -> _WhichOneofReturnType__broadcast_smart_minimum_distance | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__broadcast_smart_minimum_interval_secs) -> _WhichOneofReturnType__broadcast_smart_minimum_interval_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__device_update_interval_secs) -> _WhichOneofReturnType__device_update_interval_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__environment_measurement) -> _WhichOneofReturnType__environment_measurement | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__neighbor_info_update_interval_secs) -> _WhichOneofReturnType__neighbor_info_update_interval_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__node_info_broadcast_secs) -> _WhichOneofReturnType__node_info_broadcast_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__position_broadcast_secs) -> _WhichOneofReturnType__position_broadcast_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__position_broadcast_smart_enabled) -> _WhichOneofReturnType__position_broadcast_smart_enabled | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__position_flags) -> _WhichOneofReturnType__position_flags | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__rebroadcast_mode) -> _WhichOneofReturnType__rebroadcast_mode | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__sensor_update_interval_secs) -> _WhichOneofReturnType__sensor_update_interval_secs | None: ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__unmessagable) -> _WhichOneofReturnType__unmessagable | None: ... + +Global___RoleDefaults: _TypeAlias = RoleDefaults # noqa: Y015 + +@_typing.final +class RolePreset(_message.Message): + """ + One configuration: a role, its switches and the defaults that go with them. No two rows + share a role, switches and TAK flags, and every role has a row without switches. + """ + + DESCRIPTOR: _descriptor.Descriptor + + NAME_FIELD_NUMBER: _builtins.int + LABEL_FIELD_NUMBER: _builtins.int + DESCRIPTION_FIELD_NUMBER: _builtins.int + ROLE_FIELD_NUMBER: _builtins.int + DEVICE_FLAGS_FIELD_NUMBER: _builtins.int + TAK_FLAGS_FIELD_NUMBER: _builtins.int + DEFAULTS_FIELD_NUMBER: _builtins.int + name: _builtins.str + """Stable identifier: the role and its switches, e.g. "ROUTER_RELAY_LATE" """ + label: _builtins.str + """Display name""" + description: _builtins.str + """One-line explanation""" + role: _common_pb2.Role.ValueType + device_flags: _builtins.int + """Bitwise OR of DeviceConfig.Flags role switches; each applies to this role""" + tak_flags: _builtins.int + """Bitwise OR of TAKConfig.Flags values""" + @_builtins.property + def defaults(self) -> Global___RoleDefaults: ... + def __init__( + self, + *, + name: _builtins.str = ..., + label: _builtins.str = ..., + description: _builtins.str = ..., + role: _common_pb2.Role.ValueType = ..., + device_flags: _builtins.int = ..., + tak_flags: _builtins.int = ..., + defaults: Global___RoleDefaults | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["defaults", b"defaults"] # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["defaults", b"defaults", "description", b"description", "device_flags", b"device_flags", "label", b"label", "name", b"name", "role", b"role", "tak_flags", b"tak_flags"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RolePreset: _TypeAlias = RolePreset # noqa: Y015 + +@_typing.final +class RoleRegistry(_message.Message): + """ + Root container for the role registry + """ + + DESCRIPTOR: _descriptor.Descriptor + + REVISION_FIELD_NUMBER: _builtins.int + ROLES_FIELD_NUMBER: _builtins.int + PRESETS_FIELD_NUMBER: _builtins.int + revision: _builtins.int + """Raised on every change to the data""" + @_builtins.property + def roles(self) -> _containers.RepeatedCompositeFieldContainer[Global___RoleInfo]: + """One entry per Role value""" + + @_builtins.property + def presets(self) -> _containers.RepeatedCompositeFieldContainer[Global___RolePreset]: ... + def __init__( + self, + *, + revision: _builtins.int = ..., + roles: _abc.Iterable[Global___RoleInfo] | None = ..., + presets: _abc.Iterable[Global___RolePreset] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["presets", b"presets", "revision", b"revision", "roles", b"roles"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RoleRegistry: _TypeAlias = RoleRegistry # noqa: Y015 diff --git a/meshtastic/protobuf/wire_pb2.py b/meshtastic/protobuf/wire_pb2.py index ec3b77359..f93b9c8bc 100644 --- a/meshtastic/protobuf/wire_pb2.py +++ b/meshtastic/protobuf/wire_pb2.py @@ -17,7 +17,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xf4\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x13\n\x0bis_licensed\x18\x04 \x01(\x08\x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\x07 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\x0bratchet_key\x18\x08 \x01(\x0c\x42\x05\x92?\x02\x08 B\x12\n\x10_is_unmessagable\"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"\x9a\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\x1b\n\x0cneighbor_ids\x18\x04 \x03(\x07\x42\x05\x92?\x02\x10\n\x12\x1d\n\x0cneighbor_snr\x18\x05 \x03(\x11\x42\x07\x92?\x04\x10\n8\x08\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"\x9a\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\x1b\n\x0cneighbor_ids\x18\x04 \x03(\x07\x42\x05\x92?\x02\x10\n\x12\x1d\n\x0cneighbor_snr\x18\x05 \x03(\x11\x42\x07\x92?\x04\x10\n8\x08\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -39,6 +39,8 @@ _globals['_USER'].fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' _globals['_USER'].fields_by_name['short_name']._options = None _globals['_USER'].fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _globals['_USER'].fields_by_name['flags']._options = None + _globals['_USER'].fields_by_name['flags']._serialized_options = b'\222?\0028 ' _globals['_USER'].fields_by_name['public_key']._options = None _globals['_USER'].fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' _globals['_USER'].fields_by_name['ratchet_key']._options = None @@ -94,39 +96,39 @@ _globals['_POSITION']._serialized_start=160 _globals['_POSITION']._serialized_end=864 _globals['_USER']._serialized_start=867 - _globals['_USER']._serialized_end=1111 - _globals['_ROUTING']._serialized_start=1114 - _globals['_ROUTING']._serialized_end=1582 - _globals['_ROUTING_ERROR']._serialized_start=1212 - _globals['_ROUTING_ERROR']._serialized_end=1571 - _globals['_DATA']._serialized_start=1585 - _globals['_DATA']._serialized_end=1876 - _globals['_DATA_BITFIELD']._serialized_start=1781 - _globals['_DATA_BITFIELD']._serialized_end=1863 - _globals['_KEYVERIFICATION']._serialized_start=1878 - _globals['_KEYVERIFICATION']._serialized_end=1954 - _globals['_HEADEROPTIONS']._serialized_start=1957 - _globals['_HEADEROPTIONS']._serialized_end=2119 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=2045 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2119 - _globals['_REMOTESHELL']._serialized_start=2122 - _globals['_REMOTESHELL']._serialized_end=2591 - _globals['_REMOTESHELL_OPCODE']._serialized_start=2379 - _globals['_REMOTESHELL_OPCODE']._serialized_end=2522 - _globals['_REMOTESHELL_FLAGS']._serialized_start=2524 - _globals['_REMOTESHELL_FLAGS']._serialized_end=2591 - _globals['_BOUNDINGBOX']._serialized_start=2593 - _globals['_BOUNDINGBOX']._serialized_end=2710 - _globals['_WAYPOINT']._serialized_start=2713 - _globals['_WAYPOINT']._serialized_end=3154 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=3008 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3106 - _globals['_STATUSMESSAGE']._serialized_start=3156 - _globals['_STATUSMESSAGE']._serialized_end=3194 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3197 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3328 - _globals['_INJECTEDFRAME']._serialized_start=3330 - _globals['_INJECTEDFRAME']._serialized_end=3414 - _globals['_NEIGHBORINFO']._serialized_start=3417 - _globals['_NEIGHBORINFO']._serialized_end=3571 + _globals['_USER']._serialized_end=1062 + _globals['_ROUTING']._serialized_start=1065 + _globals['_ROUTING']._serialized_end=1533 + _globals['_ROUTING_ERROR']._serialized_start=1163 + _globals['_ROUTING_ERROR']._serialized_end=1522 + _globals['_DATA']._serialized_start=1536 + _globals['_DATA']._serialized_end=1827 + _globals['_DATA_BITFIELD']._serialized_start=1732 + _globals['_DATA_BITFIELD']._serialized_end=1814 + _globals['_KEYVERIFICATION']._serialized_start=1829 + _globals['_KEYVERIFICATION']._serialized_end=1905 + _globals['_HEADEROPTIONS']._serialized_start=1908 + _globals['_HEADEROPTIONS']._serialized_end=2070 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=1996 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2070 + _globals['_REMOTESHELL']._serialized_start=2073 + _globals['_REMOTESHELL']._serialized_end=2542 + _globals['_REMOTESHELL_OPCODE']._serialized_start=2330 + _globals['_REMOTESHELL_OPCODE']._serialized_end=2473 + _globals['_REMOTESHELL_FLAGS']._serialized_start=2475 + _globals['_REMOTESHELL_FLAGS']._serialized_end=2542 + _globals['_BOUNDINGBOX']._serialized_start=2544 + _globals['_BOUNDINGBOX']._serialized_end=2661 + _globals['_WAYPOINT']._serialized_start=2664 + _globals['_WAYPOINT']._serialized_end=3105 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=2959 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3057 + _globals['_STATUSMESSAGE']._serialized_start=3107 + _globals['_STATUSMESSAGE']._serialized_end=3145 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3148 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3279 + _globals['_INJECTEDFRAME']._serialized_start=3281 + _globals['_INJECTEDFRAME']._serialized_end=3365 + _globals['_NEIGHBORINFO']._serialized_start=3368 + _globals['_NEIGHBORINFO']._serialized_end=3522 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index 9beffb704..5d506ae1e 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -243,10 +243,9 @@ class User(_message.Message): LONG_NAME_FIELD_NUMBER: _builtins.int SHORT_NAME_FIELD_NUMBER: _builtins.int HW_MODEL_FIELD_NUMBER: _builtins.int - IS_LICENSED_FIELD_NUMBER: _builtins.int + FLAGS_FIELD_NUMBER: _builtins.int ROLE_FIELD_NUMBER: _builtins.int PUBLIC_KEY_FIELD_NUMBER: _builtins.int - IS_UNMESSAGABLE_FIELD_NUMBER: _builtins.int RATCHET_KEY_FIELD_NUMBER: _builtins.int long_name: _builtins.str """ @@ -265,11 +264,12 @@ class User(_message.Message): Hardware model, packed as (vendor_id << 8 | device_id). Names live in the hardware registry, not in this schema. """ - is_licensed: _builtins.bool + flags: _builtins.int """ - In some regions Ham radio operators have different bandwidth limitations than others. - If this user is a licensed operator, set this flag. - Also, "long_name" should be their licence number. + Bitwise OR of NodeFlags values, limited to the bits that describe the node to others: + NODE_FLAG_IS_LICENSED (a licensed amateur operator, whose long_name should be their call + sign), NODE_FLAG_IS_UNMESSAGABLE with NODE_FLAG_HAS_IS_UNMESSAGABLE, NODE_FLAG_RELAYS_FAVORITES + and NODE_FLAG_LOST_AND_FOUND. A receiver ignores any other bit. """ role: _common_pb2.Role.ValueType """ @@ -282,10 +282,6 @@ class User(_message.Message): The public key of the user's device. This is sent out to other nodes on the mesh to allow them to compute a shared secret key. """ - is_unmessagable: _builtins.bool - """ - Whether or not the node can be messaged - """ ratchet_key: _builtins.bytes """ Current X25519 ratchet public key, present only while this node has forward secrecy @@ -301,19 +297,16 @@ class User(_message.Message): long_name: _builtins.str = ..., short_name: _builtins.str = ..., hw_model: _builtins.int = ..., - is_licensed: _builtins.bool = ..., + flags: _builtins.int = ..., role: _common_pb2.Role.ValueType = ..., public_key: _builtins.bytes = ..., - is_unmessagable: _builtins.bool | None = ..., ratchet_key: _builtins.bytes = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "public_key", b"public_key", "ratchet_key", b"ratchet_key", "role", b"role", "short_name", b"short_name"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["flags", b"flags", "hw_model", b"hw_model", "long_name", b"long_name", "public_key", b"public_key", "ratchet_key", b"ratchet_key", "role", b"role", "short_name", b"short_name"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType__is_unmessagable: _TypeAlias = _typing.Literal["is_unmessagable"] # noqa: Y015 - _WhichOneofArgType__is_unmessagable: _TypeAlias = _typing.Literal["_is_unmessagable", b"_is_unmessagable"] # noqa: Y015 - def WhichOneof(self, oneof_group: _WhichOneofArgType__is_unmessagable) -> _WhichOneofReturnType__is_unmessagable | None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... Global___User: _TypeAlias = User # noqa: Y015 diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 6f23e4d7b..776d459e5 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -392,8 +392,7 @@ def test_link_payload_restores_padding_and_reads_the_add_form(): "hwModel": 9, # RAK4631 "role": "ROUTER", "publicKey": "Rx8XD96uBAiFGoFusdqwti3eBT4DLyGuG7g5Wcg9Bw==", - "isLicensed": True, - "isUnmessagable": False, + "flags": common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED | common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE, }, }, True, @@ -424,7 +423,6 @@ def test_link_payload_restores_padding_and_reads_the_add_form(): "hwModel": 43, # HELTEC_V3 "role": "CLIENT", "publicKey": "AAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", - "isLicensed": False, }, }, True, @@ -439,7 +437,7 @@ def test_link_payload_restores_padding_and_reads_the_add_form(): "longName": "Minimal Contact", "shortName": "MC", "hwModel": 0, - "role": "CLIENT_MUTE", + "role": "SENSOR", }, }, False, @@ -454,8 +452,7 @@ def test_link_payload_restores_padding_and_reads_the_add_form(): "longName": "Licensed Node", "shortName": "LN", "hwModel": 14, # NANO_G1 - "isLicensed": True, - "isUnmessagable": True, + "flags": common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED | common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE | common_pb2.NodeFlags.NODE_FLAG_IS_UNMESSAGABLE, }, }, False, @@ -494,10 +491,7 @@ def capture_send(p, *_args, **_kwargs): assert contact.user.role == common_pb2.Role.Value(u["role"]) if u.get("publicKey"): assert contact.user.public_key == base64.b64decode(u["publicKey"]) - if u.get("isLicensed"): - assert contact.user.is_licensed is True - if u.get("isUnmessagable") is not None: - assert contact.user.is_unmessagable == u["isUnmessagable"] + assert contact.user.flags == u.get("flags", 0) assert contact.should_ignore == should_ignore assert contact.manually_verified == manually_verified @@ -532,8 +526,7 @@ def contact_url_roundtrip_params(draw): )) public_key_b64 = base64.b64encode(pk_bytes).decode("ascii") - is_licensed = draw(st.booleans()) - is_unmessagable = draw(st.booleans()) + flags = draw(st.sampled_from([0, common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED, common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE, common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED | common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE, common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED | common_pb2.NodeFlags.NODE_FLAG_HAS_IS_UNMESSAGABLE | common_pb2.NodeFlags.NODE_FLAG_IS_UNMESSAGABLE])) node_data = { "num": node_num, @@ -541,8 +534,7 @@ def contact_url_roundtrip_params(draw): "longName": long_name, "shortName": short_name, "hwModel": hw_model, - "isLicensed": is_licensed, - "isUnmessagable": is_unmessagable, + "flags": flags, }, } if role is not None: @@ -590,8 +582,7 @@ def capture_send(p, *_args, **_kwargs): assert contact.user.role == common_pb2.Role.Value(u["role"]) if "publicKey" in u: assert contact.user.public_key == base64.b64decode(u["publicKey"]) - assert contact.user.is_licensed == u["isLicensed"] - assert contact.user.is_unmessagable == u["isUnmessagable"] + assert contact.user.flags == u["flags"] assert contact.should_ignore == should_ignore assert contact.manually_verified == manually_verified diff --git a/protobufs b/protobufs index 959127211..8a2eb79fa 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 95912721194939d7770060b458dbce7f3265fb0d +Subproject commit 8a2eb79fa58c61008c5abe3ba9c12b004861e038 From 244caedd13b3c5a97def6f9799471dc0a8660dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 15:56:37 +0200 Subject: [PATCH 13/24] Admin goes to the node over PKI only; protobufs at f69d9fa --- meshtastic/node.py | 35 +--- meshtastic/protobuf/bitfields.py | 7 +- meshtastic/protobuf/config_pb2.py | 38 ++-- meshtastic/protobuf/config_pb2.pyi | 4 - meshtastic/protobuf/module_config_pb2.py | 30 ++-- meshtastic/protobuf/module_config_pb2.pyi | 12 -- meshtastic/tests/test_main.py | 3 - meshtastic/tests/test_node.py | 203 +--------------------- protobufs | 2 +- 9 files changed, 43 insertions(+), 291 deletions(-) diff --git a/meshtastic/node.py b/meshtastic/node.py index 844a7a431..2f8d048db 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -192,9 +192,7 @@ def onResponseRequestSettings(self, p): ) config_values = getattr(self.moduleConfig, config_type.name) else: - print( - "Did not receive a valid response. Make sure to have a shared channel named 'admin'." - ) + print("Did not receive a valid response.") return if config_values is not None: raw_config = getattr(getattr(adminMessage['raw'], oneof), camel_to_snake(field)) @@ -253,12 +251,12 @@ def writeConfig(self, config_name): onResponse = self.onAckNak self._sendAdmin(p, onResponse=onResponse) - def writeChannel(self, channelIndex, adminIndex=0): + def writeChannel(self, channelIndex): """Write the current (edited) channel to the device""" self.ensureSessionKey() p = admin_pb2.AdminMessage() p.set_channel.CopyFrom(self.channels[channelIndex]) - self._sendAdmin(p, adminIndex=adminIndex) + self._sendAdmin(p) logger.debug(f"Wrote channel {channelIndex}") def getChannelByChannelIndex(self, channelIndex): @@ -276,10 +274,6 @@ def deleteChannel(self, channelIndex): if channelIndex == 0: our_exit("Warning: Only SECONDARY channels can be deleted") - # we are careful here because if we move the "admin" channel the channelIndex we need to use - # for sending admin channels will also change - adminIndex = self.iface.localNode._getAdminChannelIndex() - # Snapshot serialized channel payloads from channelIndex onward so we # can avoid writing slots whose protobuf content did not change after # the shift. Use bytes (not message objects), because _fixupChannels() @@ -295,16 +289,9 @@ def deleteChannel(self, channelIndex): index = channelIndex for old_ch in old_channels: if self.channels[index].SerializeToString() != old_ch: - self.writeChannel(index, adminIndex=adminIndex) + self.writeChannel(index) index += 1 - # if we are updating the local node, we might end up - # *moving* the admin channel index as we are writing - if (self.iface.localNode == self) and index >= adminIndex: - # We've now passed the old location for admin index - # (and written it), so we can start finding it by name again - adminIndex = 0 - def getChannelByName(self, name): """Try to find the named channel or return None""" for c in self.channels or []: @@ -319,13 +306,6 @@ def getDisabledChannel(self): return c return None - def _getAdminChannelIndex(self): - """Return the channel number of the admin channel, or 0 if no reserved channel""" - for c in self.channels or []: - if c.settings and c.settings.name.lower() == "admin": - return c.index - return 0 - def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: bool=False, is_unmessagable: Optional[bool]=None): """Set device owner name""" logger.debug(f"in setOwner nodeNum:{self.nodeNum}") @@ -1062,7 +1042,6 @@ def _sendAdmin( p: admin_pb2.AdminMessage, wantResponse: bool=True, onResponse=None, - adminIndex: int=0, ): """Send an admin message to the specified node (or the local node if destNodeNum is zero)""" @@ -1071,11 +1050,6 @@ def _sendAdmin( f"Not sending packet because protocol use is disabled by noProto" ) else: - if ( - adminIndex == 0 - ): # unless a special channel index was used, we want to use the admin index - adminIndex = self.iface.localNode._getAdminChannelIndex() - logger.debug(f"adminIndex:{adminIndex}") nodeid = to_node_num(self.nodeNum) if "adminSessionPassKey" in self.iface._getOrCreateByNum(nodeid): p.session_passkey = self.iface._getOrCreateByNum(nodeid).get("adminSessionPassKey") @@ -1086,7 +1060,6 @@ def _sendAdmin( wantAck=True, wantResponse=wantResponse, onResponse=onResponse, - channelIndex=adminIndex, pkiEncrypted=True, ) diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py index 63475b276..8d946822a 100644 --- a/meshtastic/protobuf/bitfields.py +++ b/meshtastic/protobuf/bitfields.py @@ -92,9 +92,7 @@ 'map_reporting': ('flags', 16), 'proxy_to_client': ('flags', 8), 'tls': ('flags', 4)}, - 'MeshBeaconConfig': {'broadcast_enabled': ('flags', 2), - 'listen_enabled': ('flags', 1), - 'text_split': ('flags', 4)}, + 'MeshBeaconConfig': {'broadcast_enabled': ('flags', 2), 'listen_enabled': ('flags', 1)}, 'MeshPacket': {'anycast': ('flags', 128), 'pki_encrypted': ('flags', 16), 'ratchet_encrypted': ('flags', 64), @@ -187,8 +185,7 @@ 'seq_no': ('position_flags', 64), 'speed': ('position_flags', 512)}, 'RolePreset': {'tak_enabled': ('tak_flags', 1)}, - 'SecurityConfig': {'admin_channel_enabled': ('flags', 8), - 'debug_log_api_enabled': ('flags', 4), + 'SecurityConfig': {'debug_log_api_enabled': ('flags', 4), 'enabled': ('ratchet_flags', 1), 'is_managed': ('flags', 1), 'require_when_known': ('ratchet_flags', 2), diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index a15448f3b..2e47f6185 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\x1a\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xd9\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xc8\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\"\n\x1eSECURITY_ADMIN_CHANNEL_ENABLED\x10\x08\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\x1a\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -362,25 +362,25 @@ _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11720 _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11838 _globals['_SECURITYCONFIG']._serialized_start=11841 - _globals['_SECURITYCONFIG']._serialized_end=13594 + _globals['_SECURITYCONFIG']._serialized_end=13558 _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12454 _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=13048 _globals['_SECURITYCONFIG_FLAGS']._serialized_start=13051 - _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13507 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13509 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13594 - _globals['_SESSIONKEYCONFIG']._serialized_start=13596 - _globals['_SESSIONKEYCONFIG']._serialized_end=13614 - _globals['_GROUPCONFIG']._serialized_start=13617 - _globals['_GROUPCONFIG']._serialized_end=13774 - _globals['_GROUPCONFIG_GROUP']._serialized_start=13695 - _globals['_GROUPCONFIG_GROUP']._serialized_end=13774 - _globals['_RELAYCONFIG']._serialized_start=13777 - _globals['_RELAYCONFIG']._serialized_end=14188 - _globals['_RELAYCONFIG_RULE']._serialized_start=14012 - _globals['_RELAYCONFIG_RULE']._serialized_end=14128 - _globals['_RELAYCONFIG_ACTION']._serialized_start=14130 - _globals['_RELAYCONFIG_ACTION']._serialized_end=14188 - _globals['_CONFIGPAYLOAD']._serialized_start=14191 - _globals['_CONFIGPAYLOAD']._serialized_end=14824 + _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13471 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13473 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13558 + _globals['_SESSIONKEYCONFIG']._serialized_start=13560 + _globals['_SESSIONKEYCONFIG']._serialized_end=13578 + _globals['_GROUPCONFIG']._serialized_start=13581 + _globals['_GROUPCONFIG']._serialized_end=13738 + _globals['_GROUPCONFIG_GROUP']._serialized_start=13659 + _globals['_GROUPCONFIG_GROUP']._serialized_end=13738 + _globals['_RELAYCONFIG']._serialized_start=13741 + _globals['_RELAYCONFIG']._serialized_end=14152 + _globals['_RELAYCONFIG_RULE']._serialized_start=13976 + _globals['_RELAYCONFIG_RULE']._serialized_end=14092 + _globals['_RELAYCONFIG_ACTION']._serialized_start=14094 + _globals['_RELAYCONFIG_ACTION']._serialized_end=14152 + _globals['_CONFIGPAYLOAD']._serialized_start=14155 + _globals['_CONFIGPAYLOAD']._serialized_end=14788 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index e2ad84b1f..f6a041a14 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -1565,8 +1565,6 @@ class SecurityConfig(_message.Message): Keep live debug logging on over serial or bluetooth. By default logging stops as soon as an API client connects, to keep a shared serial link quiet. """ - SECURITY_ADMIN_CHANNEL_ENABLED: SecurityConfig._Flags.ValueType # 8 - """Allow incoming device control over the insecure admin channel""" class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ @@ -1584,8 +1582,6 @@ class SecurityConfig(_message.Message): Keep live debug logging on over serial or bluetooth. By default logging stops as soon as an API client connects, to keep a shared serial link quiet. """ - SECURITY_ADMIN_CHANNEL_ENABLED: SecurityConfig.Flags.ValueType # 8 - """Allow incoming device control over the insecure admin channel""" class _RatchetFlags: ValueType = _typing.NewType("ValueType", _builtins.int) diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index d34ea02a6..e7447e4f9 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xc9\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"`\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\x13\n\x0f\x46LAG_TEXT_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xb4\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"K\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\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -333,8 +333,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14724 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14797 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14703 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14776 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -388,19 +388,19 @@ _globals['_STATUSMESSAGECONFIG']._serialized_start=12162 _globals['_STATUSMESSAGECONFIG']._serialized_end=12211 _globals['_MESHBEACONCONFIG']._serialized_start=12214 - _globals['_MESHBEACONCONFIG']._serialized_end=13055 + _globals['_MESHBEACONCONFIG']._serialized_end=13034 _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12731 _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12930 _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12932 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13028 - _globals['_TAKCONFIG']._serialized_start=13058 - _globals['_TAKCONFIG']._serialized_end=13384 - _globals['_TAKCONFIG_FLAGS']._serialized_start=13239 - _globals['_TAKCONFIG_FLAGS']._serialized_end=13384 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13386 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13509 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13511 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13605 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13608 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14722 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13007 + _globals['_TAKCONFIG']._serialized_start=13037 + _globals['_TAKCONFIG']._serialized_end=13363 + _globals['_TAKCONFIG_FLAGS']._serialized_start=13218 + _globals['_TAKCONFIG_FLAGS']._serialized_end=13363 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13365 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13488 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13490 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13584 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13587 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14701 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index ff23a9396..72344bb53 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -1431,12 +1431,6 @@ class MeshBeaconConfig(_message.Message): """ Enable periodically broadcasting MESH_BEACON_APP packets from this node. """ - FLAG_TEXT_SPLIT: 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 a receiver - that only decodes TEXT_MESSAGE_APP still gets the human-readable text. - """ class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ @@ -1458,12 +1452,6 @@ class MeshBeaconConfig(_message.Message): """ Enable periodically broadcasting MESH_BEACON_APP packets from this node. """ - FLAG_TEXT_SPLIT: 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 a receiver - that only decodes TEXT_MESSAGE_APP still gets the human-readable text. - """ @_typing.final class BroadcastTarget(_message.Message): diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 552942c01..948725395 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -905,9 +905,6 @@ def test_main_sendtext_with_dest(mock_findPorts, mock_serial, mocked_open, mock_ assert not re.search( r"Warning: 0 is not a valid channel", out, re.MULTILINE ) - assert not re.search( - r"There is a SECONDARY channel named 'admin'", out, re.MULTILINE - ) print(out) assert re.search(r"Not sending packet because", caplog.text, re.MULTILINE) assert re.search(r"Warning: There were no self.nodes.", caplog.text, re.MULTILINE) diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 776d459e5..44f2f6c74 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -706,16 +706,12 @@ def test_delete_channel_writes_only_changed_suffix( writes = [] - def fake_write(channel_index, adminIndex=0): - writes.append((channel_index, adminIndex)) - - anode.writeChannel = fake_write + anode.writeChannel = writes.append anode.deleteChannel(delete_index) - written_indices = [idx for idx, _ in writes] + written_indices = writes assert written_indices == expected_writes - assert all(admin_idx == 0 for _, admin_idx in writes) assert 0 not in written_indices assert all(idx < 4 for idx in written_indices) @@ -819,148 +815,6 @@ def test_delete_channel_rejects_primary(): # assert channels[7].settings.name == '' -# TODO -# @pytest.mark.unit -# def test_deleteChannel_secondary_with_admin_channel_after_testing(): -# """Try to delete a secondary channel where there is an admin channel.""" -# -# channel1 = Channel(index=1) -# channel1.settings.modem_config = 3 -# channel1.settings.psk = b'\x01' -# -# channel2 = Channel(index=2) -# channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' -# channel2.settings.name = 'testing' -# -# channel3 = Channel(index=3) -# channel3.settings.name = 'admin' -# -# channel4 = Channel(index=4) -# channel5 = Channel(index=5) -# channel6 = Channel(index=6) -# channel7 = Channel(index=7) -# channel8 = Channel(index=8) -# -# channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] -# -# -# iface = MagicMock(autospec=SerialInterface) -# with patch('meshtastic.serial_interface.SerialInterface', return_value=iface) as mo: -# mo.localNode.getChannelByName.return_value = None -# mo.myInfo.max_channels = 8 -# anode = Node(mo, 'bar', noProto=True) -# -# # Note: Have to do this next line because every call to MagicMock object/method returns a new magic mock -# mo.localNode = anode -# -# assert mo.localNode == anode -# -# anode.channels = channels -# assert len(anode.channels) == 8 -# assert channels[0].settings.modem_config == 3 -# assert channels[1].settings.name == 'testing' -# assert channels[2].settings.name == 'admin' -# assert channels[3].settings.name == '' -# assert channels[4].settings.name == '' -# assert channels[5].settings.name == '' -# assert channels[6].settings.name == '' -# assert channels[7].settings.name == '' -# -# anode.deleteChannel(1) -# -# assert len(anode.channels) == 8 -# assert channels[0].settings.modem_config == 3 -# assert channels[1].settings.name == 'admin' -# assert channels[2].settings.name == '' -# assert channels[3].settings.name == '' -# assert channels[4].settings.name == '' -# assert channels[5].settings.name == '' -# assert channels[6].settings.name == '' -# assert channels[7].settings.name == '' - - -# TODO -# @pytest.mark.unit -# def test_deleteChannel_secondary_with_admin_channel_before_testing(): -# """Try to delete a secondary channel where there is an admin channel.""" -# -# channel1 = Channel(index=1) -# channel1.settings.modem_config = 3 -# channel1.settings.psk = b'\x01' -# -# channel2 = Channel(index=2) -# channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' -# channel2.settings.name = 'admin' -# -# channel3 = Channel(index=3) -# channel3.settings.name = 'testing' -# -# channel4 = Channel(index=4) -# channel5 = Channel(index=5) -# channel6 = Channel(index=6) -# channel7 = Channel(index=7) -# channel8 = Channel(index=8) -# -# channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] -# -# -# iface = MagicMock(autospec=SerialInterface) -# with patch('meshtastic.serial_interface.SerialInterface', return_value=iface) as mo: -# mo.localNode.getChannelByName.return_value = None -# mo.myInfo.max_channels = 8 -# anode = Node(mo, 'bar', noProto=True) -# -# anode.channels = channels -# assert len(anode.channels) == 8 -# assert channels[0].settings.modem_config == 3 -# assert channels[1].settings.name == 'admin' -# assert channels[2].settings.name == 'testing' -# assert channels[3].settings.name == '' -# assert channels[4].settings.name == '' -# assert channels[5].settings.name == '' -# assert channels[6].settings.name == '' -# assert channels[7].settings.name == '' -# -# anode.deleteChannel(2) -# -# assert len(anode.channels) == 8 -# assert channels[0].settings.modem_config == 3 -# assert channels[1].settings.name == 'admin' -# assert channels[2].settings.name == '' -# assert channels[3].settings.name == '' -# assert channels[4].settings.name == '' -# assert channels[5].settings.name == '' -# assert channels[6].settings.name == '' -# assert channels[7].settings.name == '' -# -# -# @pytest.mark.unit -# def test_getChannelByName(): -# """Get a channel by the name.""" -# anode = Node('foo', 'bar') -# -# channel1 = Channel(index=1) -# channel1.settings.modem_config = 3 -# channel1.settings.psk = b'\x01' -# -# channel2 = Channel(index=2) -# channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' -# channel2.settings.name = 'admin' -# -# channel3 = Channel(index=3) -# channel4 = Channel(index=4) -# channel5 = Channel(index=5) -# channel6 = Channel(index=6) -# channel7 = Channel(index=7) -# channel8 = Channel(index=8) -# -# channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] -# -# anode.channels = channels -# ch = anode.getChannelByName('admin') -# assert ch.index == 2 - - # TODO # @pytest.mark.unit # def test_getChannelByName_invalid_name(): @@ -1044,59 +898,6 @@ def test_delete_channel_rejects_primary(): # assert ch is None -# TODO -# @pytest.mark.unit -# def test_getAdminChannelIndex(): -# """Get the 'admin' channel index.""" -# anode = Node('foo', 'bar') -# -# channel1 = Channel(index=1) -# channel1.settings.modem_config = 3 -# channel1.settings.psk = b'\x01' -# -# channel2 = Channel(index=2) -# channel2.settings.psk = b'\x8a\x94y\x0e\xc6\xc9\x1e5\x91\x12@\xa60\xa8\xb43\x87\x00\xf2K\x0e\xe7\x7fAz\xcd\xf5\xb0\x900\xa84' -# channel2.settings.name = 'admin' -# -# channel3 = Channel(index=3) -# channel4 = Channel(index=4) -# channel5 = Channel(index=5) -# channel6 = Channel(index=6) -# channel7 = Channel(index=7) -# channel8 = Channel(index=8) -# -# channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] -# -# anode.channels = channels -# i = anode._getAdminChannelIndex() -# assert i == 2 - - -# TODO -# @pytest.mark.unit -# def test_getAdminChannelIndex_when_no_admin_named_channel(): -# """Get the 'admin' channel when there is not one.""" -# anode = Node('foo', 'bar') -# -# channel1 = Channel(index=1) -# channel1.settings.modem_config = 3 -# channel1.settings.psk = b'\x01' -# -# channel2 = Channel(index=2) -# channel3 = Channel(index=3) -# channel4 = Channel(index=4) -# channel5 = Channel(index=5) -# channel6 = Channel(index=6) -# channel7 = Channel(index=7) -# channel8 = Channel(index=8) -# -# channels = [ channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8 ] -# -# anode.channels = channels -# i = anode._getAdminChannelIndex() -# assert i == 0 - - # TODO # TODO: should we check if we need to turn it off? # @pytest.mark.unit diff --git a/protobufs b/protobufs index 8a2eb79fa..f69d9fa5b 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 8a2eb79fa58c61008c5abe3ba9c12b004861e038 +Subproject commit f69d9fa5b9e1760d793b401bc481556793ce75dd From c287969a4ff3efd8031557b1fe3446f9f6f6d13b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 22:42:57 +0200 Subject: [PATCH 14/24] Send remote hardware requests as PKI direct messages, without a gpio channel --- meshtastic/remote_hardware.py | 14 +++----------- meshtastic/tests/test_main.py | 19 ------------------- meshtastic/tests/test_remote_hardware.py | 19 ++++++++----------- 3 files changed, 11 insertions(+), 41 deletions(-) diff --git a/meshtastic/remote_hardware.py b/meshtastic/remote_hardware.py index 41534a02a..c901753a1 100644 --- a/meshtastic/remote_hardware.py +++ b/meshtastic/remote_hardware.py @@ -42,18 +42,10 @@ def __init__(self, iface) -> None: """ Constructor - iface is the already open MeshInterface instance + iface is the already open MeshInterface instance. The target node accepts a request only + from a public key listed in its remote_hardware.authorized_key. """ self.iface = iface - ch = iface.localNode.getChannelByName("gpio") - if not ch: - our_exit( - "Warning: No channel named 'gpio' was found.\n" - "On the sending and receive nodes create a channel named 'gpio'.\n" - "For example, run '--ch-add gpio' on one device, then '--seturl' on\n" - "the other devices using the url from the device where the channel was added." - ) - self.channelIndex = ch.index pub.subscribe(onGPIOreceive, "meshtastic.receive.remotehw") @@ -67,9 +59,9 @@ def _sendHardware(self, nodeid, r, wantResponse=False, onResponse=None): nodeid, portnums_pb2.REMOTE_HARDWARE_APP, wantAck=True, - channelIndex=self.channelIndex, wantResponse=wantResponse, onResponse=onResponse, + pkiEncrypted=True, ) def writeGPIOs(self, nodeid, mask, vals): diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 948725395..6e686a314 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -2714,25 +2714,6 @@ def test_set_missing_flags_false(): assert config["security"]["serialEnabled"] is False assert config["mqtt"]["encryptionEnabled"] is False -@pytest.mark.unit -@pytest.mark.usefixtures("reset_mt_config") -def test_main_gpio_rd_no_gpio_channel(capsys): - """Test --gpio_rd with no named gpio channel""" - sys.argv = ["", "--gpio-rd", "0x10", "--dest", "!foo"] - mt_config.args = sys.argv - - iface = MagicMock(autospec=SerialInterface) - iface.localNode.getChannelByName.return_value = None - with patch("meshtastic.serial_interface.SerialInterface", return_value=iface): - with pytest.raises(SystemExit) as pytest_wrapped_e: - main() - assert pytest_wrapped_e.type == SystemExit - assert pytest_wrapped_e.value.code == 1 - out, err = capsys.readouterr() - assert re.search(r"Warning: No channel named", out) - assert err == "" - - @pytest.mark.unit @pytest.mark.usefixtures("reset_mt_config") def test_main_gpio_rd_no_dest(capsys): diff --git a/meshtastic/tests/test_remote_hardware.py b/meshtastic/tests/test_remote_hardware.py index 7d4cf6f1a..29685338e 100644 --- a/meshtastic/tests/test_remote_hardware.py +++ b/meshtastic/tests/test_remote_hardware.py @@ -31,18 +31,15 @@ def test_onGPIOreceive(capsys): @pytest.mark.unit -def test_RemoteHardwareClient_no_gpio_channel(capsys): - """Test that we can instantiate a RemoteHardwareClient instance but there is no channel named channel 'gpio'""" +def test_sendHardware_is_a_pki_direct_message(): + """A request goes to the node as a PKI direct message; the node authorizes by the sender's key""" iface = MagicMock(autospec=SerialInterface) - with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: - mo.localNode.getChannelByName.return_value = None - with pytest.raises(SystemExit) as pytest_wrapped_e: - RemoteHardwareClient(mo) - assert pytest_wrapped_e.type == SystemExit - assert pytest_wrapped_e.value.code == 1 - out, err = capsys.readouterr() - assert re.search(r"Warning: No channel named", out) - assert err == "" + rhw = RemoteHardwareClient(iface) + rhw.readGPIOs("0x10", 123) + kwargs = iface.sendData.call_args.kwargs + assert kwargs["pkiEncrypted"] is True + assert "channelIndex" not in kwargs + iface.close() @pytest.mark.unit From ed725808bb5c8194026712c70bff8b616278ba8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 23:17:10 +0200 Subject: [PATCH 15/24] Fix channel hashing, owner writes and CLI help for 3.0 - generate_channel_hash: empty name hashes as the preset name (Custom without one), key index 0 means no key, a secondary without a key uses the primary's - setOwner keeps the node's licensed state unless told otherwise; --clear-ham leaves licensed mode - --ch-add allows 11-byte names, as the firmware does - Help text for --traceroute, --request-telemetry, --request-position, --reply, --ota-update, --seriallog and --power-stress - Test helpers set REGION_US --- meshtastic/__main__.py | 34 ++++++++++++++++++++++------------ meshtastic/node.py | 20 +++++++++++++++----- meshtastic/tests/conftest.py | 4 ++-- meshtastic/tests/fw_helpers.py | 2 +- meshtastic/tests/test_main.py | 17 ++++++++++++++++- meshtastic/tests/test_node.py | 15 +++++++++++++++ meshtastic/tests/test_util.py | 7 +++++++ meshtastic/util.py | 26 ++++++++++++++++++++++---- 8 files changed, 100 insertions(+), 25 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index bc4153c9b..7c3015610 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -494,6 +494,11 @@ def onConnected(interface): # Must turn off encryption on primary channel interface.getNode(args.dest, **getNode_kwargs).turnOffEncryptionOnPrimaryChannel() + if args.clear_ham: + closeNow = True + print("Leaving licensed (ham) mode; channel keys stay as they are") + interface.getNode(args.dest, **getNode_kwargs).setOwner(is_licensed=False) + if args.reboot: closeNow = True waitForAckNak = True @@ -930,9 +935,9 @@ def _seed_config(section: str, is_module: bool) -> Optional[Any]: "Warning: '--ch-add' and '--ch-index' are incompatible. Channel not added." ) closeNow = True - if len(args.ch_add) > 10: + if len(args.ch_add.encode("utf-8")) > 11: meshtastic.util.our_exit( - "Warning: Channel name must be shorter. Channel not added." + "Warning: Channel name must be at most 11 bytes. Channel not added." ) n = interface.getNode(args.dest, **getNode_kwargs) ch = n.getChannelByName(args.ch_add) @@ -2053,6 +2058,12 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: "--set-ham", help="Set licensed Ham ID and turn off encryption", action="store" ) + group.add_argument( + "--clear-ham", + help="Leave licensed (ham) mode. Channel keys that licensed mode removed are not restored.", + action="store_true", + ) + group.add_argument( "--set-is-unmessageable", "--set-is-unmessagable", help="Set if a node is messageable or not", action="store" @@ -2261,7 +2272,7 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar help="Trace the route back to the connected node from a destination. " "You need pass the destination ID as argument, like " "this: '--traceroute !ba4bf9d0' | '--traceroute 0xba4bf9d0'. " - "Only nodes with a shared channel can be traced.", + "The request is a direct message, so this node needs the destination's public key.", metavar="!xxxxxxxx", ) @@ -2269,8 +2280,7 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar "--request-telemetry", help="Request telemetry from a node. With an argument, requests that specific type of telemetry: " "device, sensors (environment, air quality, power and health), local_stats, host or traffic. " - "You need to pass the destination ID as argument with '--dest'. " - "For repeaters, the nodeNum is required.", + "You need to pass the destination ID as argument with '--dest'.", action="store", nargs="?", default=None, @@ -2281,15 +2291,14 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar group.add_argument( "--request-position", help="Request the position from a node. " - "You need to pass the destination ID as an argument with '--dest'. " - "For repeaters, the nodeNum is required.", + "You need to pass the destination ID as an argument with '--dest'.", action="store_true", ) group.add_argument( "--reply", - help="Reply to received messages on the channel they were received. " - "If '--ch-index' is set, only messages on that channel are replied to.", + help="Reply to received text messages on the channel '--ch-index' names (0, the primary, by default). " + "Messages on other channels are ignored.", action="store_true", ) @@ -2319,7 +2328,7 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars group.add_argument( "--ota-update", - help="Perform an OTA update on the local node (ESP32, firmware version >=2.7.18, WiFi/TCP only for now). " + help="Perform an OTA update on the local node (ESP32, over a Wi-Fi/TCP connection). " "Specify the path to the firmware file.", metavar="FIRMWARE_FILE", action="store", @@ -2454,7 +2463,7 @@ def initParser(): group.add_argument( "--seriallog", - help="Log device serial output to either 'none' or a filename to append to. Defaults to '%(const)s' if no filename specified.", + help="Log device serial output to either 'none' or a filename, which is overwritten. Defaults to '%(const)s' if no filename specified.", nargs="?", const="stdout", default=None, @@ -2559,7 +2568,8 @@ def initParser(): power_group.add_argument( "--power-stress", - help="Perform power monitor stress testing, to capture a power consumption profile for the device (also requires --power-mon)", + help="Perform power monitor stress testing, to capture a power consumption profile for the device " + "(also requires a power meter: --power-riden, --power-ppk2-meter, --power-ppk2-supply or --power-sim)", action="store_true", ) diff --git a/meshtastic/node.py b/meshtastic/node.py index 2f8d048db..641b4104e 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -306,8 +306,8 @@ def getDisabledChannel(self): return c return None - def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: bool=False, is_unmessagable: Optional[bool]=None): - """Set device owner name""" + def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: Optional[bool]=None, is_unmessagable: Optional[bool]=None): + """Set device owner name. is_licensed None keeps the node's current licensed state.""" logger.debug(f"in setOwner nodeNum:{self.nodeNum}") self.ensureSessionKey() p = admin_pb2.AdminMessage() @@ -324,8 +324,13 @@ def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None long_name = truncated print(f"Maximum is 24 bytes, truncated to {long_name}") p.set_owner.long_name = long_name - if is_licensed: - p.set_owner.flags |= common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED + if is_licensed is None: + # The node takes the licensed bit as its whole state, so an owner write without it would end licensed mode + nodes = getattr(self.iface, "nodesByNum", None) + user = nodes.get(to_node_num(self.nodeNum), {}).get("user", {}) if isinstance(nodes, dict) else {} + is_licensed = bool(user.get("isLicensed")) + if is_licensed: + p.set_owner.flags |= common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED if short_name is not None: short_name = short_name.strip() # Validate that short_name is not empty or whitespace-only @@ -1078,9 +1083,14 @@ def get_channels_with_hash(self): """Return a list of dicts with channel info and hash.""" result = [] if self.channels: + lora = self.localConfig.lora + preset = lora.modem_preset if lora.flags & config_pb2.LoRaConfig.Flags.LORA_USE_PRESET else None + primary_psk = self.channels[0].settings.psk for c in self.channels: if c.settings and hasattr(c.settings, "name") and hasattr(c.settings, "psk"): - hash_val = generate_channel_hash(c.settings.name, c.settings.psk) + # A secondary channel with no key uses the primary's key + psk = c.settings.psk if c.settings.psk or c.index == 0 else primary_psk + hash_val = generate_channel_hash(c.settings.name, psk, preset) else: hash_val = None result.append({ diff --git a/meshtastic/tests/conftest.py b/meshtastic/tests/conftest.py index adbe7457e..9e71b527d 100644 --- a/meshtastic/tests/conftest.py +++ b/meshtastic/tests/conftest.py @@ -50,7 +50,7 @@ def firmware_node(): mesh = SimMesh(n_nodes=1, base_port=SINGLE_NODE_BASE_PORT) mesh.start() node = mesh.get_node(0) - set_region(node.port, "US") + set_region(node.port, "REGION_US") # The region commit restarts the TCP listener, so reconnect the harness # interface in case a test wants to use it directly. if node.iface is not None: @@ -76,7 +76,7 @@ def firmware_mesh(): mesh = SimMesh(n_nodes=3, topology=CHAIN_TOPOLOGY) mesh.start() for node in mesh.nodes: - set_region(node.port, "US") + set_region(node.port, "REGION_US") # The region commit restarts each node's TCP listener, so reconnect the # harness interfaces before waiting for convergence. for node in mesh.nodes: diff --git a/meshtastic/tests/fw_helpers.py b/meshtastic/tests/fw_helpers.py index 6c97daf60..35bf9ce6b 100644 --- a/meshtastic/tests/fw_helpers.py +++ b/meshtastic/tests/fw_helpers.py @@ -317,7 +317,7 @@ def subscribe_positions(iface: TCPInterface) -> PacketCollector: return _subscribe_topic(iface, "meshtastic.receive.position") -def set_region(port: int, region: str = "US") -> None: +def set_region(port: int, region: str = "REGION_US") -> None: """Set the LoRa region on a sim node via the CLI. The node briefly restarts its TCP listener while committing the radio diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 6e686a314..59c00fa71 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -1313,7 +1313,7 @@ def test_main_ch_add_invalid_name_too_long(capsys): assert pytest_wrapped_e.value.code == 1 out, err = capsys.readouterr() assert re.search(r"Connected to radio", out, re.MULTILINE) - assert re.search(r"Warning: Channel name must be shorter", out, re.MULTILINE) + assert re.search(r"Warning: Channel name must be at most 11 bytes", out, re.MULTILINE) assert err == "" mo.assert_called() @@ -2714,6 +2714,21 @@ def test_set_missing_flags_false(): assert config["security"]["serialEnabled"] is False assert config["mqtt"]["encryptionEnabled"] is False +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_clear_ham_sends_owner_without_licensed_bit(): + """--clear-ham writes the owner with the licensed bit off and leaves the names alone""" + sys.argv = ["", "--clear-ham"] + mt_config.args = sys.argv + + mocked_node = MagicMock(autospec=Node) + iface = MagicMock(autospec=SerialInterface) + iface.getNode.return_value = mocked_node + with patch("meshtastic.serial_interface.SerialInterface", return_value=iface): + main() + mocked_node.setOwner.assert_called_once_with(is_licensed=False) + + @pytest.mark.unit @pytest.mark.usefixtures("reset_mt_config") def test_main_gpio_rd_no_dest(capsys): diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 44f2f6c74..6f6751cf1 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1679,6 +1679,21 @@ def test_setOwner_truncates_long_name_at_a_character_boundary(capsys): assert "truncated" in capsys.readouterr().out +@pytest.mark.unit +def test_setOwner_keeps_the_nodes_licensed_state(): + """An owner write carries the node's current licensed bit unless the caller sets it""" + iface = MagicMock(autospec=MeshInterface) + iface.nodesByNum = {123: {"num": 123, "user": {"longName": "K1ABC", "isLicensed": True}}} + anode = Node(iface, 123, noProto=True) + anode._sendAdmin = MagicMock() + + anode.setOwner(short_name="AB") + assert anode._sendAdmin.call_args[0][0].set_owner.flags & common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED + + anode.setOwner(short_name="AB", is_licensed=False) + assert not anode._sendAdmin.call_args[0][0].set_owner.flags & common_pb2.NodeFlags.NODE_FLAG_IS_LICENSED + + @pytest.mark.unit def test_setOwner_empty_long_name(capsys): """Test setOwner with empty long name""" diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index df995bb4f..7ccb22718 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -794,6 +794,13 @@ def test_generate_channel_hash_basics(): assert generate_channel_hash("LongFast", DEFAULT_KEY) == 8 assert generate_channel_hash("MediumFast", DEFAULT_KEY) == 31 +def test_generate_channel_hash_matches_firmware_name_and_key_rules(): + "An empty name hashes as the preset's name (Custom without one), and key index 0 means no key" + long_fast = common_pb2.ModemPreset.Value("MODEM_LONG_FAST") + assert generate_channel_hash("", bytes([1]), long_fast) == generate_channel_hash("LongFast", bytes([1])) + assert generate_channel_hash("", bytes([1])) == generate_channel_hash("Custom", bytes([1])) + assert generate_channel_hash("LongFast", bytes([0])) == generate_channel_hash("LongFast", b"") + @given(st.text(min_size=1, max_size=12)) def test_generate_channel_hash_fuzz_default_key(channel_name): "Test generate_channel_hash with fuzzed channel names and the default key, ensuring it produces single-byte values" diff --git a/meshtastic/util.py b/meshtastic/util.py index 590bc5153..81696bf43 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -23,7 +23,7 @@ import serial # type: ignore[import-untyped] import serial.tools.list_ports # type: ignore[import-untyped] -from meshtastic.protobuf import telemetry_pb2 +from meshtastic.protobuf import common_pb2, telemetry_pb2 from meshtastic.protobuf.bitfields import BITFIELDS from meshtastic.supported_device import supported_devices from meshtastic.version import get_active_version @@ -378,18 +378,36 @@ def channel_hash(data: bytes) -> int: result ^= char return result -def generate_channel_hash(name: Union[str, bytes], key: Union[str, bytes]) -> int: - """generate the channel number by hashing the channel name and psk (accepts str or bytes for both)""" +@functools.lru_cache(maxsize=None) +def _modem_preset_names() -> Dict[int, str]: + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "protobuf", "modem_presets.json") + with open(path, encoding="utf-8") as f: + return {common_pb2.ModemPreset.Value(p["preset"]): p["name"] for p in json.load(f)["presets"]} + + +def modem_preset_name(preset: int) -> str: + """The display name a modem preset has in the preset registry, such as "LongFast".""" + return _modem_preset_names().get(preset, "Invalid") + + +def generate_channel_hash(name: Union[str, bytes], key: Union[str, bytes], preset: Optional[int] = None) -> int: + """The one-byte channel hash: XOR of the channel name and the expanded key, as the firmware computes it. + + An empty name hashes as the modem preset's name, or "Custom" when the node uses no preset (preset None). + A one-byte key is a default-key index, and index 0 means no key. + """ # Handle key as str or bytes if isinstance(key, str): key = base64.b64decode(key.replace("-", "+").replace("_", "/").encode("utf-8")) if len(key) == 1: - key = DEFAULT_KEY[:-1] + key + key = b"" if key[0] == 0 else DEFAULT_KEY[:-1] + key # Handle name as str or bytes if isinstance(name, str): name = name.encode("utf-8") + if not name: + name = (modem_preset_name(preset) if preset is not None else "Custom").encode("utf-8") h_name = channel_hash(name) h_key = channel_hash(key) From 65e4b7402045bacf3b6943145f584eb47b82530b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 5 Oct 2026 23:17:57 +0200 Subject: [PATCH 16/24] Track the protobufs branch for this schema instead of the latest release tag --- .github/workflows/update_protobufs.yml | 9 ++++++++- .gitmodules | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml index b3f1feeee..ea941f3eb 100644 --- a/.github/workflows/update_protobufs.yml +++ b/.github/workflows/update_protobufs.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: version: - description: "Protobufs version tag to sync to (e.g., v2.7.26). Defaults to the latest protobufs release." + description: "Protobufs tag to sync to. Defaults to the tip of the branch .gitmodules tracks, or the latest release tag without one." required: false default: "" type: string @@ -42,6 +42,7 @@ jobs: INPUT_VERSION: ${{ github.event.inputs.version }} PAYLOAD_VERSION: ${{ github.event.client_payload.version }} run: | + branch=$(git config -f .gitmodules submodule.protobufs.branch || true) cd protobufs git fetch --tags @@ -49,6 +50,12 @@ jobs: target="${INPUT_VERSION}" elif [ -n "${PAYLOAD_VERSION}" ]; then target="${PAYLOAD_VERSION}" + elif [ -n "${branch}" ]; then + # A branch whose schema is not the released one tracks its own protobufs branch, never a release tag + git fetch origin "${branch}" + printf 'version=%s\n' "$(git rev-parse --short FETCH_HEAD)" >> "$GITHUB_OUTPUT" + echo "Target protobufs: tip of ${branch}" + exit 0 else target=$(git tag --list 'v*' --sort=-version:refname | head -n1) if [ -z "${target}" ]; then diff --git a/.gitmodules b/.gitmodules index d155a849a..01017650a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "protobufs"] path = protobufs url = http://github.com/meshtastic/protobufs + branch = trident From d7782efb7a99bcfa6fbe8eca4f5ef702f8d85b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Tue, 6 Oct 2026 11:11:12 +0200 Subject: [PATCH 17/24] Update protobufs: client-only NeighborInfo, serial modes and store and forward announce interval --- meshtastic/protobuf/config_pb2.py | 146 +++++++++--------- meshtastic/protobuf/config_pb2.pyi | 25 ++- meshtastic/protobuf/mesh_beacon_pb2.py | 4 +- meshtastic/protobuf/module_config_pb2.py | 130 ++++++++-------- meshtastic/protobuf/module_config_pb2.pyi | 76 +++------ meshtastic/protobuf/portnums_pb2.pyi | 12 +- meshtastic/protobuf/region_registry_pb2.pyi | 2 +- meshtastic/protobuf/role_registry_pb2.py | 12 +- meshtastic/protobuf/role_registry_pb2.pyi | 11 +- meshtastic/protobuf/storeforward_pb2.py | 22 +-- meshtastic/protobuf/storeforward_pb2.pyi | 8 +- meshtastic/protobuf/wire_pb2.py | 14 +- meshtastic/protobuf/wire_pb2.pyi | 92 ++++++----- .../tests/test_inject_nanopb_options.py | 7 +- protobufs | 2 +- 15 files changed, 266 insertions(+), 297 deletions(-) diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index 2e47f6185..69a8f2c77 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\x1a\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x05 \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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbd\x19\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x96\x01\n\x18node_info_broadcast_secs\x18\x05 \x01(\rBt\xca\xf3\x18p*\x01s:\x1cNode Info Broadcast IntervalBMHow often node information is sent. Defaults to 10800 seconds, at least 3600.\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x05tzdef\x18\x07 \x01(\tB6\x92?\x02\x08\x41\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12S\n\x0b\x62uzzer_mode\x18\x08 \x01(\x0e\x32,.meshtastic.protobuf.DeviceConfig.BuzzerModeB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.7.0\x12\x17\n\x0f\x64iscovery_flags\x18\t \x01(\r\x12 \n\x18\x64iscovery_node_threshold\x18\n \x01(\r\x12\x14\n\x0ctaper_factor\x18\x0b \x01(\r\x12\x1a\n\x12\x66ull_announce_secs\x18\x0c \x01(\r\x12\x41\n\x16\x61uto_mute_router_count\x18\r \x01(\rB!\x92?\x02\x38\x08\xca\xf3\x18\x18:\x16\x41uto-mute Router Count\x12;\n\x11\x61uto_mute_min_snr\x18\x0e \x01(\x11\x42 \x92?\x02\x38\x08\xca\xf3\x18\x17:\x15\x41uto-mute Minimum SNR\x12\x35\n\x15\x61uto_mute_window_secs\x18\x0f \x01(\rB\x16\xca\xf3\x18\x12:\x10\x41uto-mute Window\"\xd7\x06\n\x0fRebroadcastMode\x12\x8a\x01\n\x03\x41LL\x10\x00\x1a\x80\x01\xca\xf3\x18|:\x03\x41llBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.\x12?\n\x11\x41LL_SKIP_DECODING\x10\x01\x1a(\xca\xf3\x18$:\x11\x41ll Skip DecodingB\x0fTreated as ALL.\x12\xcd\x01\n\nLOCAL_ONLY\x10\x02\x1a\xbc\x01\xca\xf3\x18\xb7\x01:\nLocal OnlyB\xa8\x01Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.\x12\xc8\x01\n\nKNOWN_ONLY\x10\x03\x1a\xb7\x01\xca\xf3\x18\xb2\x01:\nKnown OnlyB\xa3\x01Ignores 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.\x12\x43\n\x04NONE\x10\x04\x1a\x39\xca\xf3\x18\x35:\x04NoneB-Never rebroadcast. Not available on a router.\x12\x95\x01\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a}\xca\xf3\x18y:\x12\x43ore Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.\"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\"\xc8\t\n\x05\x46lags\x12\x0f\n\x0b\x44\x45VICE_NONE\x10\x00\x12\x87\x01\n!DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS\x10\x01\x1a`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12l\n\x1b\x44\x45VICE_DISABLE_TRIPLE_CLICK\x10\x02\x1aK\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12\xcf\x01\n\x1d\x44\x45VICE_LED_HEARTBEAT_DISABLED\x10\x04\x1a\xab\x01\xca\xf3\x18\xa6\x01:\rLED HeartbeatB\x94\x01\x43ontrols the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.\x12\xb1\x01\n\x19\x44\x45VICE_AUTO_MUTE_DISABLED\x10\x08\x1a\x91\x01\xca\xf3\x18\x8c\x01:\x18\x44isable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.\x12\x91\x01\n\x11\x44\x45VICE_RELAY_LATE\x10\x10\x1az\xca\xf3\x18v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.\x12\xa7\x01\n\x16\x44\x45VICE_RELAY_FAVORITES\x10 \x1a\x8a\x01\xca\xf3\x18\x85\x01:\x0fRelay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.\x12i\n\x0c\x44\x45VICE_QUIET\x10@\x1aW\xca\xf3\x18S:\x05QuietBJClient: send nothing on a schedule, only answer and send what you ask for.\x12\x86\x01\n\x15\x44\x45VICE_LOST_AND_FOUND\x10\x80\x01\x1aj\xca\xf3\x18\x66:\x0eLost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.\"Q\n\x0e\x44iscoveryFlags\x12\x12\n\x0e\x44ISCOVERY_NONE\x10\x00\x12\x13\n\x0f\x44ISCOVERY_SERVE\x10\x01\x12\x16\n\x12\x44ISCOVERY_NO_TAPER\x10\x02\"\xaf\r\n\x0ePositionConfig\x12y\n\x17position_broadcast_secs\x18\x01 \x01(\rBX\xca\xf3\x18T*\x01s:\x12\x42roadcast IntervalB;The longest a node will go without broadcasting a position.\x12>\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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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.@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -28,7 +28,7 @@ _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["ALL"]._options = None _globals['_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.' _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["ALL_SKIP_DECODING"]._options = None - _globals['_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.' + _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["ALL_SKIP_DECODING"]._serialized_options = b'\312\363\030$:\021All Skip DecodingB\017Treated as ALL.' _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["LOCAL_ONLY"]._options = None _globals['_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.' _globals['_DEVICECONFIG_REBROADCASTMODE'].values_by_name["KNOWN_ONLY"]._options = None @@ -62,7 +62,7 @@ _globals['_DEVICECONFIG'].fields_by_name['rebroadcast_mode']._options = None _globals['_DEVICECONFIG'].fields_by_name['rebroadcast_mode']._serialized_options = b'\312\363\030\022:\020Rebroadcast Mode' _globals['_DEVICECONFIG'].fields_by_name['node_info_broadcast_secs']._options = None - _globals['_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' _globals['_LORACONFIG'].fields_by_name['channel_num']._options = None @@ -314,73 +314,73 @@ _globals['_RELAYCONFIG'].fields_by_name['regions']._options = None _globals['_RELAYCONFIG'].fields_by_name['regions']._serialized_options = b'\222?\004\010\020\020\004' _globals['_DEVICECONFIG']._serialized_start=168 - _globals['_DEVICECONFIG']._serialized_end=3574 - _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1140 - _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_end=2157 - _globals['_DEVICECONFIG_BUZZERMODE']._serialized_start=2159 - _globals['_DEVICECONFIG_BUZZERMODE']._serialized_end=2264 - _globals['_DEVICECONFIG_FLAGS']._serialized_start=2267 - _globals['_DEVICECONFIG_FLAGS']._serialized_end=3491 - _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_start=3493 - _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_end=3574 - _globals['_POSITIONCONFIG']._serialized_start=3577 - _globals['_POSITIONCONFIG']._serialized_end=5288 - _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=4762 - _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=5183 - _globals['_POSITIONCONFIG_GPSMODE']._serialized_start=5185 - _globals['_POSITIONCONFIG_GPSMODE']._serialized_end=5288 - _globals['_POWERCONFIG']._serialized_start=5291 - _globals['_POWERCONFIG']._serialized_end=5994 - _globals['_NETWORKCONFIG']._serialized_start=5997 - _globals['_NETWORKCONFIG']._serialized_end=7150 - _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_start=6607 - _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_end=6727 - _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_start=6729 - _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_end=6790 - _globals['_NETWORKCONFIG_FLAGS']._serialized_start=6793 - _globals['_NETWORKCONFIG_FLAGS']._serialized_end=7063 - _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=7065 - _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=7150 - _globals['_DISPLAYCONFIG']._serialized_start=7153 - _globals['_DISPLAYCONFIG']._serialized_end=9296 - _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_start=7907 - _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_end=8154 - _globals['_DISPLAYCONFIG_FLAGS']._serialized_start=8157 - _globals['_DISPLAYCONFIG_FLAGS']._serialized_end=8740 - _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=8743 - _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=8957 - _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=8960 - _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=9296 - _globals['_LORACONFIG']._serialized_start=9299 - _globals['_LORACONFIG']._serialized_end=11399 - _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_start=10637 - _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_end=10695 - _globals['_LORACONFIG_FLAGS']._serialized_start=10698 - _globals['_LORACONFIG_FLAGS']._serialized_end=11399 - _globals['_BLUETOOTHCONFIG']._serialized_start=11402 - _globals['_BLUETOOTHCONFIG']._serialized_end=11838 - _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11720 - _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11838 - _globals['_SECURITYCONFIG']._serialized_start=11841 - _globals['_SECURITYCONFIG']._serialized_end=13558 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12454 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=13048 - _globals['_SECURITYCONFIG_FLAGS']._serialized_start=13051 - _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13471 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13473 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13558 - _globals['_SESSIONKEYCONFIG']._serialized_start=13560 - _globals['_SESSIONKEYCONFIG']._serialized_end=13578 - _globals['_GROUPCONFIG']._serialized_start=13581 - _globals['_GROUPCONFIG']._serialized_end=13738 - _globals['_GROUPCONFIG_GROUP']._serialized_start=13659 - _globals['_GROUPCONFIG_GROUP']._serialized_end=13738 - _globals['_RELAYCONFIG']._serialized_start=13741 - _globals['_RELAYCONFIG']._serialized_end=14152 - _globals['_RELAYCONFIG_RULE']._serialized_start=13976 - _globals['_RELAYCONFIG_RULE']._serialized_end=14092 - _globals['_RELAYCONFIG_ACTION']._serialized_start=14094 - _globals['_RELAYCONFIG_ACTION']._serialized_end=14152 - _globals['_CONFIGPAYLOAD']._serialized_start=14155 - _globals['_CONFIGPAYLOAD']._serialized_end=14788 + _globals['_DEVICECONFIG']._serialized_end=3429 + _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1157 + _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_end=2012 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_start=2014 + _globals['_DEVICECONFIG_BUZZERMODE']._serialized_end=2119 + _globals['_DEVICECONFIG_FLAGS']._serialized_start=2122 + _globals['_DEVICECONFIG_FLAGS']._serialized_end=3346 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_start=3348 + _globals['_DEVICECONFIG_DISCOVERYFLAGS']._serialized_end=3429 + _globals['_POSITIONCONFIG']._serialized_start=3432 + _globals['_POSITIONCONFIG']._serialized_end=5143 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=4617 + _globals['_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=5038 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_start=5040 + _globals['_POSITIONCONFIG_GPSMODE']._serialized_end=5143 + _globals['_POWERCONFIG']._serialized_start=5146 + _globals['_POWERCONFIG']._serialized_end=5849 + _globals['_NETWORKCONFIG']._serialized_start=5852 + _globals['_NETWORKCONFIG']._serialized_end=7005 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_start=6462 + _globals['_NETWORKCONFIG_IPV4CONFIG']._serialized_end=6582 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_start=6584 + _globals['_NETWORKCONFIG_ADDRESSMODE']._serialized_end=6645 + _globals['_NETWORKCONFIG_FLAGS']._serialized_start=6648 + _globals['_NETWORKCONFIG_FLAGS']._serialized_end=6918 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=6920 + _globals['_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=7005 + _globals['_DISPLAYCONFIG']._serialized_start=7008 + _globals['_DISPLAYCONFIG']._serialized_end=9151 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_start=7762 + _globals['_DISPLAYCONFIG_OLEDTYPE']._serialized_end=8009 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_start=8012 + _globals['_DISPLAYCONFIG_FLAGS']._serialized_end=8595 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=8598 + _globals['_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=8812 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=8815 + _globals['_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=9151 + _globals['_LORACONFIG']._serialized_start=9154 + _globals['_LORACONFIG']._serialized_end=11254 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_start=10492 + _globals['_LORACONFIG_FEM_LNA_MODE']._serialized_end=10550 + _globals['_LORACONFIG_FLAGS']._serialized_start=10553 + _globals['_LORACONFIG_FLAGS']._serialized_end=11254 + _globals['_BLUETOOTHCONFIG']._serialized_start=11257 + _globals['_BLUETOOTHCONFIG']._serialized_end=11693 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11575 + _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11693 + _globals['_SECURITYCONFIG']._serialized_start=11696 + _globals['_SECURITYCONFIG']._serialized_end=13413 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12309 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=12903 + _globals['_SECURITYCONFIG_FLAGS']._serialized_start=12906 + _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13326 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13328 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13413 + _globals['_SESSIONKEYCONFIG']._serialized_start=13415 + _globals['_SESSIONKEYCONFIG']._serialized_end=13433 + _globals['_GROUPCONFIG']._serialized_start=13436 + _globals['_GROUPCONFIG']._serialized_end=13593 + _globals['_GROUPCONFIG_GROUP']._serialized_start=13514 + _globals['_GROUPCONFIG_GROUP']._serialized_end=13593 + _globals['_RELAYCONFIG']._serialized_start=13596 + _globals['_RELAYCONFIG']._serialized_end=14007 + _globals['_RELAYCONFIG_RULE']._serialized_start=13831 + _globals['_RELAYCONFIG_RULE']._serialized_end=13947 + _globals['_RELAYCONFIG_ACTION']._serialized_start=13949 + _globals['_RELAYCONFIG_ACTION']._serialized_end=14007 + _globals['_CONFIGPAYLOAD']._serialized_start=14010 + _globals['_CONFIGPAYLOAD']._serialized_end=14643 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index f6a041a14..6f942324c 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -41,9 +41,7 @@ class DeviceConfig(_message.Message): """ ALL_SKIP_DECODING: DeviceConfig._RebroadcastMode.ValueType # 1 """ - Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node - that repeats everything it hears without looking inside. Available on a ROUTER; on - any other role it behaves as ALL. + Rebroadcast everything without decoding it first. The firmware treats it as ALL on every role. """ LOCAL_ONLY: DeviceConfig._RebroadcastMode.ValueType # 2 """ @@ -77,9 +75,7 @@ class DeviceConfig(_message.Message): """ ALL_SKIP_DECODING: DeviceConfig.RebroadcastMode.ValueType # 1 """ - Same behaviour as ALL, but skips packet decoding and simply rebroadcasts: a node - that repeats everything it hears without looking inside. Available on a ROUTER; on - any other role it behaves as ALL. + Rebroadcast everything without decoding it first. The firmware treats it as ALL on every role. """ LOCAL_ONLY: DeviceConfig.RebroadcastMode.ValueType # 2 """ @@ -313,8 +309,7 @@ class DeviceConfig(_message.Message): """ node_info_broadcast_secs: _builtins.int """ - Send our nodeinfo this often - Defaults to 900 Seconds (15 minutes) + Send our nodeinfo this often. 0 for the default of 10800 seconds (3 hours); never more often than every 3600. """ flags: _builtins.int """ @@ -541,8 +536,8 @@ class PositionConfig(_message.Message): GPS_MODE_FIELD_NUMBER: _builtins.int position_broadcast_secs: _builtins.int """ - We should send our position this often (but only if it has changed significantly) - Defaults to 15 minutes + We should send our position this often (but only if it has changed significantly). + 0 for the default of 3600 seconds, or 43200 on infrastructure. """ position_broadcast_smart_enabled: _builtins.bool """ @@ -557,7 +552,7 @@ class PositionConfig(_message.Message): gps_update_interval_secs: _builtins.int """ How often should we try to get GPS position (in seconds) - or zero for the default of once every 30 seconds + or zero for the default of once every 120 seconds (once a day on infrastructure) or a very large value (maxint) to update only once at boot. """ position_flags: _builtins.int @@ -656,13 +651,13 @@ class PowerConfig(_message.Message): """ Super Deep Sleep Seconds While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep - for this value (default 1 year) or a button press - 0 for default of one year + for this value or until a button press. 0 for the default: until a button press (one day on + infrastructure). One sleep lasts at most about 24.8 days. """ ls_secs: _builtins.int """ Description: In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on - Technical Details: ESP32 Only 0 for default of 300 + Technical Details: ESP32 Only 0 for default of 300 (one day on infrastructure) """ min_wake_secs: _builtins.int """ @@ -1138,7 +1133,7 @@ class DisplayConfig(_message.Message): screen_on_secs: _builtins.int """ Number of seconds the screen stays on after pressing the user button or receiving a message - 0 for default of one minute MAXUINT for always on + 0 for the default of 600 seconds, MAXUINT for always on """ auto_screen_carousel_secs: _builtins.int """ diff --git a/meshtastic/protobuf/mesh_beacon_pb2.py b/meshtastic/protobuf/mesh_beacon_pb2.py index 92e7ddb11..b8420392f 100644 --- a/meshtastic/protobuf/mesh_beacon_pb2.py +++ b/meshtastic/protobuf/mesh_beacon_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb0\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\x12<\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12\x42\n\x0coffer_preset\x18\x04 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\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') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/mesh_beacon.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb0\x02\n\nMeshBeacon\x12\x16\n\x07message\x18\x01 \x01(\tB\x05\x92?\x02\x08\x65\x12;\n\roffer_channel\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12<\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12\x42\n\x0coffer_preset\x18\x04 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\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) @@ -26,7 +26,7 @@ _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\n\024org.meshtastic.protoB\020MeshBeaconProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_MESHBEACON'].fields_by_name['message']._options = None - _globals['_MESHBEACON'].fields_by_name['message']._serialized_options = b'\222?\002\010=' + _globals['_MESHBEACON'].fields_by_name['message']._serialized_options = b'\222?\002\010e' _globals['_MESHBEACON'].fields_by_name['offer_region']._options = None _globals['_MESHBEACON'].fields_by_name['offer_region']._serialized_options = b'\222?\0028\010' _globals['_MESHBEACON'].fields_by_name['offer_preset']._options = None diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index e7447e4f9..8fee692f3 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\xe6\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.\x12]\n\x14update_interval_secs\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.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xce\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xb4\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"K\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\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\x9f\x02\n\x12NeighborInfoConfig\x12\x94\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x82\x01\xca\xf3\x18~:\x15Neighbor Info EnabledBeReport the directly heard neighbors to the connected client. The report never goes over LoRa or MQTT.\x12r\n\x14update_interval_secs\x18\x02 \x01(\rBT\xca\xf3\x18P*\x01s:\x0fUpdate IntervalB:How often to report neighbor info to the connected client.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xa9\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd5\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\tMS_CONFIG\x10\x07\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xb4\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"K\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\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -56,11 +56,9 @@ _globals['_REMOTEHARDWARECONFIG'].fields_by_name['authorized_key']._options = None _globals['_REMOTEHARDWARECONFIG'].fields_by_name['authorized_key']._serialized_options = b'\222?\004\010 \020\003' _globals['_NEIGHBORINFOCONFIG'].fields_by_name['enabled']._options = None - _globals['_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.' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['enabled']._serialized_options = b'\312\363\030~:\025Neighbor Info EnabledBeReport the directly heard neighbors to the connected client. The report never goes over LoRa or MQTT.' _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval_secs']._options = None - _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval_secs']._serialized_options = b'\312\363\030;*\001s:\017Update IntervalB%How often to broadcast neighbor info.' - _globals['_NEIGHBORINFOCONFIG'].fields_by_name['transmit_over_lora']._options = None - _globals['_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.' + _globals['_NEIGHBORINFOCONFIG'].fields_by_name['update_interval_secs']._serialized_options = b'\312\363\030P*\001s:\017Update IntervalB:How often to report neighbor info to the connected client.' _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_LOW"]._options = None _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_LOW"]._serialized_options = b'\312\363\030\005:\003Low' _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE'].values_by_name["LOGIC_HIGH"]._options = None @@ -333,8 +331,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14703 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14776 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14467 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14540 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -344,63 +342,63 @@ _globals['_REMOTEHARDWARECONFIG']._serialized_start=1572 _globals['_REMOTEHARDWARECONFIG']._serialized_end=1751 _globals['_NEIGHBORINFOCONFIG']._serialized_start=1754 - _globals['_NEIGHBORINFOCONFIG']._serialized_end=2240 - _globals['_DETECTIONSENSORCONFIG']._serialized_start=2243 - _globals['_DETECTIONSENSORCONFIG']._serialized_end=3719 - _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2871 - _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=3116 - _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_start=3119 - _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_end=3719 - _globals['_AUDIOCONFIG']._serialized_start=3722 - _globals['_AUDIOCONFIG']._serialized_end=4584 - _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=4275 - _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=4584 - _globals['_PAXCOUNTERCONFIG']._serialized_start=4587 - _globals['_PAXCOUNTERCONFIG']._serialized_end=5145 - _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=5148 - _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5645 - _globals['_SERIALCONFIG']._serialized_start=5648 - _globals['_SERIALCONFIG']._serialized_end=7134 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=6115 - _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6661 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6664 - _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=6914 - _globals['_SERIALCONFIG_FLAGS']._serialized_start=6917 - _globals['_SERIALCONFIG_FLAGS']._serialized_end=7134 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=7137 - _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=8888 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7737 - _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=8888 - _globals['_STOREFORWARDCONFIG']._serialized_start=8891 - _globals['_STOREFORWARDCONFIG']._serialized_end=9561 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=9140 - _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9561 - _globals['_TELEMETRYCONFIG']._serialized_start=9564 - _globals['_TELEMETRYCONFIG']._serialized_end=10595 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9797 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10595 - _globals['_CANNEDMESSAGECONFIG']._serialized_start=10598 - _globals['_CANNEDMESSAGECONFIG']._serialized_end=11542 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11307 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11542 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11545 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=12160 - _globals['_STATUSMESSAGECONFIG']._serialized_start=12162 - _globals['_STATUSMESSAGECONFIG']._serialized_end=12211 - _globals['_MESHBEACONCONFIG']._serialized_start=12214 - _globals['_MESHBEACONCONFIG']._serialized_end=13034 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12731 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12930 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12932 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=13007 - _globals['_TAKCONFIG']._serialized_start=13037 - _globals['_TAKCONFIG']._serialized_end=13363 - _globals['_TAKCONFIG_FLAGS']._serialized_start=13218 - _globals['_TAKCONFIG_FLAGS']._serialized_end=13363 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13365 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13488 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13490 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13584 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13587 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14701 + _globals['_NEIGHBORINFOCONFIG']._serialized_end=2041 + _globals['_DETECTIONSENSORCONFIG']._serialized_start=2044 + _globals['_DETECTIONSENSORCONFIG']._serialized_end=3520 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2672 + _globals['_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=2917 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_start=2920 + _globals['_DETECTIONSENSORCONFIG_FLAGS']._serialized_end=3520 + _globals['_AUDIOCONFIG']._serialized_start=3523 + _globals['_AUDIOCONFIG']._serialized_end=4385 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=4076 + _globals['_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=4385 + _globals['_PAXCOUNTERCONFIG']._serialized_start=4388 + _globals['_PAXCOUNTERCONFIG']._serialized_end=4946 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_start=4949 + _globals['_TRAFFICMANAGEMENTCONFIG']._serialized_end=5446 + _globals['_SERIALCONFIG']._serialized_start=5449 + _globals['_SERIALCONFIG']._serialized_end=6898 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_start=5916 + _globals['_SERIALCONFIG_SERIAL_BAUD']._serialized_end=6462 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_start=6465 + _globals['_SERIALCONFIG_SERIAL_MODE']._serialized_end=6678 + _globals['_SERIALCONFIG_FLAGS']._serialized_start=6681 + _globals['_SERIALCONFIG_FLAGS']._serialized_end=6898 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_start=6901 + _globals['_EXTERNALNOTIFICATIONCONFIG']._serialized_end=8652 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_start=7501 + _globals['_EXTERNALNOTIFICATIONCONFIG_ALERTFLAGS']._serialized_end=8652 + _globals['_STOREFORWARDCONFIG']._serialized_start=8655 + _globals['_STOREFORWARDCONFIG']._serialized_end=9325 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=8904 + _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9325 + _globals['_TELEMETRYCONFIG']._serialized_start=9328 + _globals['_TELEMETRYCONFIG']._serialized_end=10359 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9561 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10359 + _globals['_CANNEDMESSAGECONFIG']._serialized_start=10362 + _globals['_CANNEDMESSAGECONFIG']._serialized_end=11306 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11071 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11306 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11309 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=11924 + _globals['_STATUSMESSAGECONFIG']._serialized_start=11926 + _globals['_STATUSMESSAGECONFIG']._serialized_end=11975 + _globals['_MESHBEACONCONFIG']._serialized_start=11978 + _globals['_MESHBEACONCONFIG']._serialized_end=12798 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12495 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12694 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12696 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=12771 + _globals['_TAKCONFIG']._serialized_start=12801 + _globals['_TAKCONFIG']._serialized_end=13127 + _globals['_TAKCONFIG_FLAGS']._serialized_start=12982 + _globals['_TAKCONFIG_FLAGS']._serialized_end=13127 + _globals['_REMOTEHARDWAREPIN']._serialized_start=13129 + _globals['_REMOTEHARDWAREPIN']._serialized_end=13252 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13254 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13348 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13351 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14465 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 72344bb53..40b51ff71 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -80,9 +80,8 @@ class MQTTConfig(_message.Message): """ MQTT_ENCRYPTION: MQTTConfig._Flags.ValueType # 2 """ - Send encrypted rather than decrypted packets. Only honoured when a custom - server is set; the default mqtt.meshtastic.org server handles encrypted - packets. Decrypted packets suit external systems consuming meshtastic traffic. + Send encrypted rather than decrypted packets, on any server. Decrypted packets + suit external systems consuming meshtastic traffic. """ MQTT_TLS: MQTTConfig._Flags.ValueType # 4 """Establish the connection using TLS""" @@ -105,9 +104,8 @@ class MQTTConfig(_message.Message): """ MQTT_ENCRYPTION: MQTTConfig.Flags.ValueType # 2 """ - Send encrypted rather than decrypted packets. Only honoured when a custom - server is set; the default mqtt.meshtastic.org server handles encrypted - packets. Decrypted packets suit external systems consuming meshtastic traffic. + Send encrypted rather than decrypted packets, on any server. Decrypted packets + suit external systems consuming meshtastic traffic. """ MQTT_TLS: MQTTConfig.Flags.ValueType # 4 """Establish the connection using TLS""" @@ -133,15 +131,13 @@ class MQTTConfig(_message.Message): """ username: _builtins.str """ - MQTT username to use (most useful for a custom MQTT server). - If using a custom server, this will be honoured even if empty. - If using the default server, this will only be honoured if set, otherwise the device will use the default username + MQTT username to use. With an address set, the node uses this username, even an empty one; + with no address it connects to the default server with that server's default username. """ password: _builtins.str """ - MQTT password to use (most useful for a custom MQTT server). - If using a custom server, this will be honoured even if empty. - If using the default server, this will only be honoured if set, otherwise the device will use the default password + MQTT password to use. With an address set, the node uses this password, even an empty one; + with no address it connects to the default server with that server's default password. """ root: _builtins.str """ @@ -189,7 +185,8 @@ class MapReportSettings(_message.Message): """ position_precision: _builtins.int """ - Bits of precision for the location sent (default of 32 is full precision). + Bits of precision for the location in a map report, 12 to 15. 0, or a value outside that + range, means the default of 14. """ should_report_location: _builtins.bool """ @@ -276,31 +273,23 @@ class NeighborInfoConfig(_message.Message): ENABLED_FIELD_NUMBER: _builtins.int UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int - TRANSMIT_OVER_LORA_FIELD_NUMBER: _builtins.int enabled: _builtins.bool """ Whether the Module is enabled """ update_interval_secs: _builtins.int """ - Interval in seconds of how often we should try to send our - Neighbor Info (minimum is 14400, i.e., 4 hours) - """ - transmit_over_lora: _builtins.bool - """ - Whether in addition to sending it to MQTT and the PhoneAPI, our NeighborInfo should be transmitted over LoRa. - Note that this is not available on a channel with default key and name. + Seconds between reports to the connected client. 0 uses the default of 6 hours. """ def __init__( self, *, enabled: _builtins.bool = ..., update_interval_secs: _builtins.int = ..., - transmit_over_lora: _builtins.bool = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "transmit_over_lora", b"transmit_over_lora", "update_interval_secs", b"update_interval_secs"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["enabled", b"enabled", "update_interval_secs", b"update_interval_secs"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -626,7 +615,7 @@ class TrafficManagementConfig(_message.Message): """ 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. + Firmware default: 18000 (5 hours), installed when this config is first created. """ rate_limit_window_secs: _builtins.int """ @@ -640,9 +629,9 @@ class TrafficManagementConfig(_message.Message): """ unknown_packet_threshold: _builtins.int """ - Maximum unknown/undecryptable packets per rate window before the source - is dropped. A non-zero value implicitly enables unknown-packet filtering; - 0 disables it. + Maximum unknown/undecryptable packets per five-minute window before the + source is dropped. A non-zero value implicitly enables unknown-packet + filtering; 0 disables it. """ def __init__( self, @@ -728,20 +717,10 @@ class SerialConfig(_message.Message): """NMEA messages specifically tailored for CalTopo""" WS85: SerialConfig._Serial_Mode.ValueType # 6 """Ecowitt WS85 weather station""" - VE_DIRECT: SerialConfig._Serial_Mode.ValueType # 7 - """VE.Direct is a serial protocol used by Victron Energy products - https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable - """ - MS_CONFIG: SerialConfig._Serial_Mode.ValueType # 8 + MS_CONFIG: SerialConfig._Serial_Mode.ValueType # 7 """Used to configure and view some parameters of MeshSolar. https://heltec.org/project/meshsolar/ """ - LOG: SerialConfig._Serial_Mode.ValueType # 9 - """Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. - includes other packets - """ - LOGTEXT: SerialConfig._Serial_Mode.ValueType # 10 - """only text (channel & DM)""" class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper): """ @@ -757,20 +736,10 @@ class SerialConfig(_message.Message): """NMEA messages specifically tailored for CalTopo""" WS85: SerialConfig.Serial_Mode.ValueType # 6 """Ecowitt WS85 weather station""" - VE_DIRECT: SerialConfig.Serial_Mode.ValueType # 7 - """VE.Direct is a serial protocol used by Victron Energy products - https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable - """ - MS_CONFIG: SerialConfig.Serial_Mode.ValueType # 8 + MS_CONFIG: SerialConfig.Serial_Mode.ValueType # 7 """Used to configure and view some parameters of MeshSolar. https://heltec.org/project/meshsolar/ """ - LOG: SerialConfig.Serial_Mode.ValueType # 9 - """Logs mesh traffic to the serial pins, ideal for logging via openLog or similar. - includes other packets - """ - LOGTEXT: SerialConfig.Serial_Mode.ValueType # 10 - """only text (channel & DM)""" class _Flags: ValueType = _typing.NewType("ValueType", _builtins.int) @@ -955,7 +924,7 @@ class ExternalNotificationConfig(_message.Message): output_buzzer: _builtins.int """ Optional: GPIO an active (on/off) buzzer is connected to, driven when - ALERT_USE_PWM is clear. 0 is GPIO0, not "unset": the ALERT_*_BUZZER flags say + ALERT_USE_PWM is clear. 0 means no buzzer pin is set. The ALERT_*_BUZZER flags say whether it sounds. In standalone devices it matches the UI. """ nag_timeout_secs: _builtins.int @@ -1060,7 +1029,7 @@ class StoreForwardConfig(_message.Message): """ storage_bytes: _builtins.int """ - Bytes of backing store to use. 0 takes everything the platform offers. + Bytes of backing store to use. 0 for the platform default: 1 MiB on ESP32, 4 MiB on Linux. """ max_per_sync: _builtins.int """ @@ -1074,7 +1043,8 @@ class StoreForwardConfig(_message.Message): """ Node discovery records to hold, when DeviceConfig sets DISCOVERY_SERVE. A record is about 135 bytes encoded and 150 with the index, so 1000 records is 150 kB of the same backing - store the frame log uses. 0 takes what the platform offers. + store the frame log uses. 0 for the default of 1000; an ESP32 holds no more than a quarter + of its free PSRAM fits. """ record_ttl_secs: _builtins.int """ @@ -1510,7 +1480,7 @@ class MeshBeaconConfig(_message.Message): BROADCAST_TARGETS_FIELD_NUMBER: _builtins.int flags: _builtins.int """ - Bitwise OR of Flags values (listen, broadcast and text-split toggles). + Bitwise OR of Flags values (listen and broadcast toggles). """ broadcast_message: _builtins.str """ diff --git a/meshtastic/protobuf/portnums_pb2.pyi b/meshtastic/protobuf/portnums_pb2.pyi index 28d37afe6..237f647fb 100644 --- a/meshtastic/protobuf/portnums_pb2.pyi +++ b/meshtastic/protobuf/portnums_pb2.pyi @@ -119,7 +119,7 @@ class _PortNumEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_PortNum.Value Node Status module 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. + Broadcasts two minutes after boot, then every 12 hours. """ MESH_BEACON_APP: _PortNum.ValueType # 36 """ @@ -181,8 +181,8 @@ class _PortNumEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_PortNum.Value """ NEIGHBORINFO_APP: _PortNum.ValueType # 69 """ - Aggregates edge info for the network by sending out a list of each node's neighbors - ENCODING: Protobuf + A node's directly heard neighbors, between a node and its own client only; never sent over LoRa or MQTT + ENCODING: Protobuf NeighborInfo """ MAP_REPORT_APP: _PortNum.ValueType # 70 """ @@ -352,7 +352,7 @@ NODE_STATUS_APP: PortNum.ValueType # 35 Node Status module 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. +Broadcasts two minutes after boot, then every 12 hours. """ MESH_BEACON_APP: PortNum.ValueType # 36 """ @@ -414,8 +414,8 @@ ENCODING: Protobuf """ NEIGHBORINFO_APP: PortNum.ValueType # 69 """ -Aggregates edge info for the network by sending out a list of each node's neighbors -ENCODING: Protobuf +A node's directly heard neighbors, between a node and its own client only; never sent over LoRa or MQTT +ENCODING: Protobuf NeighborInfo """ MAP_REPORT_APP: PortNum.ValueType # 70 """ diff --git a/meshtastic/protobuf/region_registry_pb2.pyi b/meshtastic/protobuf/region_registry_pb2.pyi index b78bbe681..36292618d 100644 --- a/meshtastic/protobuf/region_registry_pb2.pyi +++ b/meshtastic/protobuf/region_registry_pb2.pyi @@ -230,7 +230,7 @@ class RegionProfile(_message.Message): """ Hop budget a node launches with on this profile's regions, 1 to 15. This is the "region default" that ChannelSettings.scope caps SCOPE_REGIONAL at; SCOPE_LOCAL caps - at 2 regardless and SCOPE_GLOBAL at the full 15. Congestion control may raise a + at 1 regardless and SCOPE_GLOBAL at the full 15. Congestion control may raise a REGIONAL launch to this value and no further. """ def __init__( diff --git a/meshtastic/protobuf/role_registry_pb2.py b/meshtastic/protobuf/role_registry_pb2.py index 1c973b3d1..6b382e940 100644 --- a/meshtastic/protobuf/role_registry_pb2.py +++ b/meshtastic/protobuf/role_registry_pb2.py @@ -16,7 +16,7 @@ from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/role_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\"W\n\x08RoleInfo\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xa4\x07\n\x0cRoleDefaults\x12\x17\n\x0freset_intervals\x18\x01 \x01(\x08\x12P\n\x10rebroadcast_mode\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeH\x00\x88\x01\x01\x12%\n\x18node_info_broadcast_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x12$\n\x17position_broadcast_secs\x18\x04 \x01(\rH\x02\x88\x01\x01\x12-\n position_broadcast_smart_enabled\x18\x05 \x01(\x08H\x03\x88\x01\x01\x12-\n broadcast_smart_minimum_distance\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x32\n%broadcast_smart_minimum_interval_secs\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eposition_flags\x18\x08 \x01(\rH\x06\x88\x01\x01\x12(\n\x1b\x64\x65vice_update_interval_secs\x18\t \x01(\rH\x07\x88\x01\x01\x12(\n\x1bsensor_update_interval_secs\x18\n \x01(\rH\x08\x88\x01\x01\x12$\n\x17\x65nvironment_measurement\x18\x0b \x01(\x08H\t\x88\x01\x01\x12/\n\"neighbor_info_update_interval_secs\x18\x0c \x01(\rH\n\x88\x01\x01\x12\x19\n\x0cunmessagable\x18\r \x01(\x08H\x0b\x88\x01\x01\x42\x13\n\x11_rebroadcast_modeB\x1b\n\x19_node_info_broadcast_secsB\x1a\n\x18_position_broadcast_secsB#\n!_position_broadcast_smart_enabledB#\n!_broadcast_smart_minimum_distanceB(\n&_broadcast_smart_minimum_interval_secsB\x11\n\x0f_position_flagsB\x1e\n\x1c_device_update_interval_secsB\x1e\n\x1c_sensor_update_interval_secsB\x1a\n\x18_environment_measurementB%\n#_neighbor_info_update_interval_secsB\x0f\n\r_unmessagable\"\xc5\x01\n\nRolePreset\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\'\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x0c\x64\x65vice_flags\x18\x05 \x01(\r\x12\x11\n\ttak_flags\x18\x06 \x01(\r\x12\x33\n\x08\x64\x65\x66\x61ults\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.RoleDefaults\"\x80\x01\n\x0cRoleRegistry\x12\x10\n\x08revision\x18\x01 \x01(\r\x12,\n\x05roles\x18\x02 \x03(\x0b\x32\x1d.meshtastic.protobuf.RoleInfo\x12\x30\n\x07presets\x18\x03 \x03(\x0b\x32\x1f.meshtastic.protobuf.RolePresetBh\n\x14org.meshtastic.protoB\x12RoleRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/role_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\"W\n\x08RoleInfo\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xcc\x06\n\x0cRoleDefaults\x12\x17\n\x0freset_intervals\x18\x01 \x01(\x08\x12P\n\x10rebroadcast_mode\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeH\x00\x88\x01\x01\x12%\n\x18node_info_broadcast_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x12$\n\x17position_broadcast_secs\x18\x04 \x01(\rH\x02\x88\x01\x01\x12-\n position_broadcast_smart_enabled\x18\x05 \x01(\x08H\x03\x88\x01\x01\x12-\n broadcast_smart_minimum_distance\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x32\n%broadcast_smart_minimum_interval_secs\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eposition_flags\x18\x08 \x01(\rH\x06\x88\x01\x01\x12(\n\x1b\x64\x65vice_update_interval_secs\x18\t \x01(\rH\x07\x88\x01\x01\x12(\n\x1bsensor_update_interval_secs\x18\n \x01(\rH\x08\x88\x01\x01\x12$\n\x17\x65nvironment_measurement\x18\x0b \x01(\x08H\t\x88\x01\x01\x12\x19\n\x0cunmessagable\x18\x0c \x01(\x08H\n\x88\x01\x01\x42\x13\n\x11_rebroadcast_modeB\x1b\n\x19_node_info_broadcast_secsB\x1a\n\x18_position_broadcast_secsB#\n!_position_broadcast_smart_enabledB#\n!_broadcast_smart_minimum_distanceB(\n&_broadcast_smart_minimum_interval_secsB\x11\n\x0f_position_flagsB\x1e\n\x1c_device_update_interval_secsB\x1e\n\x1c_sensor_update_interval_secsB\x1a\n\x18_environment_measurementB\x0f\n\r_unmessagable\"\xc5\x01\n\nRolePreset\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\'\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x0c\x64\x65vice_flags\x18\x05 \x01(\r\x12\x11\n\ttak_flags\x18\x06 \x01(\r\x12\x33\n\x08\x64\x65\x66\x61ults\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.RoleDefaults\"\x80\x01\n\x0cRoleRegistry\x12\x10\n\x08revision\x18\x01 \x01(\r\x12,\n\x05roles\x18\x02 \x03(\x0b\x32\x1d.meshtastic.protobuf.RoleInfo\x12\x30\n\x07presets\x18\x03 \x03(\x0b\x32\x1f.meshtastic.protobuf.RolePresetBh\n\x14org.meshtastic.protoB\x12RoleRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -27,9 +27,9 @@ _globals['_ROLEINFO']._serialized_start=132 _globals['_ROLEINFO']._serialized_end=219 _globals['_ROLEDEFAULTS']._serialized_start=222 - _globals['_ROLEDEFAULTS']._serialized_end=1154 - _globals['_ROLEPRESET']._serialized_start=1157 - _globals['_ROLEPRESET']._serialized_end=1354 - _globals['_ROLEREGISTRY']._serialized_start=1357 - _globals['_ROLEREGISTRY']._serialized_end=1485 + _globals['_ROLEDEFAULTS']._serialized_end=1066 + _globals['_ROLEPRESET']._serialized_start=1069 + _globals['_ROLEPRESET']._serialized_end=1266 + _globals['_ROLEREGISTRY']._serialized_start=1269 + _globals['_ROLEREGISTRY']._serialized_end=1397 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/role_registry_pb2.pyi b/meshtastic/protobuf/role_registry_pb2.pyi index 51ed74da0..34729b1e5 100644 --- a/meshtastic/protobuf/role_registry_pb2.pyi +++ b/meshtastic/protobuf/role_registry_pb2.pyi @@ -82,7 +82,6 @@ class RoleDefaults(_message.Message): DEVICE_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int SENSOR_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int ENVIRONMENT_MEASUREMENT_FIELD_NUMBER: _builtins.int - NEIGHBOR_INFO_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int UNMESSAGABLE_FIELD_NUMBER: _builtins.int reset_intervals: _builtins.bool """Restore every broadcast, telemetry and power interval to its default before the values below""" @@ -98,7 +97,6 @@ class RoleDefaults(_message.Message): sensor_update_interval_secs: _builtins.int environment_measurement: _builtins.bool """TelemetryConfig environment measurement on or off""" - neighbor_info_update_interval_secs: _builtins.int unmessagable: _builtins.bool """Advertise the node as not taking direct messages (NODE_FLAG_IS_UNMESSAGABLE)""" def __init__( @@ -115,12 +113,11 @@ class RoleDefaults(_message.Message): device_update_interval_secs: _builtins.int | None = ..., sensor_update_interval_secs: _builtins.int | None = ..., environment_measurement: _builtins.bool | None = ..., - neighbor_info_update_interval_secs: _builtins.int | None = ..., unmessagable: _builtins.bool | None = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "neighbor_info_update_interval_secs", b"neighbor_info_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "neighbor_info_update_interval_secs", b"neighbor_info_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "reset_intervals", b"reset_intervals", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "reset_intervals", b"reset_intervals", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... _WhichOneofReturnType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance"] # noqa: Y015 _WhichOneofArgType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance"] # noqa: Y015 @@ -130,8 +127,6 @@ class RoleDefaults(_message.Message): _WhichOneofArgType__device_update_interval_secs: _TypeAlias = _typing.Literal["_device_update_interval_secs", b"_device_update_interval_secs"] # noqa: Y015 _WhichOneofReturnType__environment_measurement: _TypeAlias = _typing.Literal["environment_measurement"] # noqa: Y015 _WhichOneofArgType__environment_measurement: _TypeAlias = _typing.Literal["_environment_measurement", b"_environment_measurement"] # noqa: Y015 - _WhichOneofReturnType__neighbor_info_update_interval_secs: _TypeAlias = _typing.Literal["neighbor_info_update_interval_secs"] # noqa: Y015 - _WhichOneofArgType__neighbor_info_update_interval_secs: _TypeAlias = _typing.Literal["_neighbor_info_update_interval_secs", b"_neighbor_info_update_interval_secs"] # noqa: Y015 _WhichOneofReturnType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["node_info_broadcast_secs"] # noqa: Y015 _WhichOneofArgType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["_node_info_broadcast_secs", b"_node_info_broadcast_secs"] # noqa: Y015 _WhichOneofReturnType__position_broadcast_secs: _TypeAlias = _typing.Literal["position_broadcast_secs"] # noqa: Y015 @@ -155,8 +150,6 @@ class RoleDefaults(_message.Message): @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__environment_measurement) -> _WhichOneofReturnType__environment_measurement | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType__neighbor_info_update_interval_secs) -> _WhichOneofReturnType__neighbor_info_update_interval_secs | None: ... - @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__node_info_broadcast_secs) -> _WhichOneofReturnType__node_info_broadcast_secs | None: ... @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__position_broadcast_secs) -> _WhichOneofReturnType__position_broadcast_secs | None: ... diff --git a/meshtastic/protobuf/storeforward_pb2.py b/meshtastic/protobuf/storeforward_pb2.py index 528bf666d..d354e0729 100644 --- a/meshtastic/protobuf/storeforward_pb2.py +++ b/meshtastic/protobuf/storeforward_pb2.py @@ -15,7 +15,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\"\xee\x01\n\x0bStoredFrame\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02id\x18\x02 \x01(\x07\x12 \n\x0c\x63hannel_hash\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x0f\n\x02to\x18\x04 \x01(\x07H\x01\x88\x01\x01\x12\x18\n\thop_start\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0eheader_options\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\nciphertext\x18\x08 \x01(\x0c\x42\x06\x92?\x03\x08\xf0\x01\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x42\x0f\n\r_channel_hashB\x05\n\x03_to\"\xf0\x07\n\x0fStoreAndForward\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.StoreAndForward.Type\x12\x41\n\x08\x61nnounce\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.AnnounceH\x00\x12\x39\n\x04sync\x18\x03 \x01(\x0b\x32).meshtastic.protobuf.StoreAndForward.SyncH\x00\x12\x31\n\x05\x66rame\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.StoredFrameH\x00\x12\x42\n\tsync_done\x18\x05 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.SyncDoneH\x00\x12\x18\n\tremaining\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x1a`\n\x06\x43ursor\x12 \n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x12\n\nsince_time\x18\x02 \x01(\x07\x12\x0f\n\x07last_id\x18\x03 \x01(\x07\x42\x0f\n\r_channel_hash\x1a\xd2\x01\n\x08\x41nnounce\x12\x0e\n\x06server\x18\x06 \x01(\x07\x12\x1e\n\rserved_hashes\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x16\n\x0eoldest_rx_time\x18\x02 \x01(\x07\x12\x14\n\x0cmax_per_sync\x18\x03 \x01(\r\x12\x10\n\x08\x63\x61pacity\x18\x04 \x01(\r\x12\x0c\n\x04held\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"9\n\x05\x46lags\x12\x11\n\rANNOUNCE_NONE\x10\x00\x12\x1d\n\x19\x41NNOUNCE_SERVES_DISCOVERY\x10\x01\x1au\n\x04Sync\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nmax_frames\x18\x02 \x01(\r\x12\x14\n\x0c\x66lagged_only\x18\x03 \x01(\x08\x1a\x7f\n\x08SyncDone\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\x1b\n\ngap_hashes\x18\x03 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"[\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41NNOUNCE\x10\x01\x12\x08\n\x04SYNC\x10\x02\x12\t\n\x05\x46RAME\x10\x03\x12\r\n\tSYNC_DONE\x10\x04\x12\t\n\x05\x41\x42ORT\x10\x05\x12\x0b\n\x07REFUSED\x10\x06\x42\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\"\xee\x01\n\x0bStoredFrame\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02id\x18\x02 \x01(\x07\x12 \n\x0c\x63hannel_hash\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x0f\n\x02to\x18\x04 \x01(\x07H\x01\x88\x01\x01\x12\x18\n\thop_start\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0eheader_options\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\nciphertext\x18\x08 \x01(\x0c\x42\x06\x92?\x03\x08\xf0\x01\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x42\x0f\n\r_channel_hashB\x05\n\x03_to\"\x87\x08\n\x0fStoreAndForward\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.StoreAndForward.Type\x12\x41\n\x08\x61nnounce\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.AnnounceH\x00\x12\x39\n\x04sync\x18\x03 \x01(\x0b\x32).meshtastic.protobuf.StoreAndForward.SyncH\x00\x12\x31\n\x05\x66rame\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.StoredFrameH\x00\x12\x42\n\tsync_done\x18\x05 \x01(\x0b\x32-.meshtastic.protobuf.StoreAndForward.SyncDoneH\x00\x12\x18\n\tremaining\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x1a`\n\x06\x43ursor\x12 \n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x12\n\nsince_time\x18\x02 \x01(\x07\x12\x0f\n\x07last_id\x18\x03 \x01(\x07\x42\x0f\n\r_channel_hash\x1a\xe9\x01\n\x08\x41nnounce\x12\x0e\n\x06server\x18\x06 \x01(\x07\x12\x1e\n\rserved_hashes\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x16\n\x0eoldest_rx_time\x18\x02 \x01(\x07\x12\x14\n\x0cmax_per_sync\x18\x03 \x01(\r\x12\x10\n\x08\x63\x61pacity\x18\x04 \x01(\r\x12\x0c\n\x04held\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\x12\x15\n\rannounce_secs\x18\x08 \x01(\r\"9\n\x05\x46lags\x12\x11\n\rANNOUNCE_NONE\x10\x00\x12\x1d\n\x19\x41NNOUNCE_SERVES_DISCOVERY\x10\x01\x1au\n\x04Sync\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nmax_frames\x18\x02 \x01(\r\x12\x14\n\x0c\x66lagged_only\x18\x03 \x01(\x08\x1a\x7f\n\x08SyncDone\x12\x43\n\x07\x63ursors\x18\x01 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\x1b\n\ngap_hashes\x18\x03 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"[\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41NNOUNCE\x10\x01\x12\x08\n\x04SYNC\x10\x02\x12\t\n\x05\x46RAME\x10\x03\x12\r\n\tSYNC_DONE\x10\x04\x12\t\n\x05\x41\x42ORT\x10\x05\x12\x0b\n\x07REFUSED\x10\x06\x42\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) @@ -48,17 +48,17 @@ _globals['_STOREDFRAME']._serialized_start=98 _globals['_STOREDFRAME']._serialized_end=336 _globals['_STOREANDFORWARD']._serialized_start=339 - _globals['_STOREANDFORWARD']._serialized_end=1347 + _globals['_STOREANDFORWARD']._serialized_end=1370 _globals['_STOREANDFORWARD_CURSOR']._serialized_start=686 _globals['_STOREANDFORWARD_CURSOR']._serialized_end=782 _globals['_STOREANDFORWARD_ANNOUNCE']._serialized_start=785 - _globals['_STOREANDFORWARD_ANNOUNCE']._serialized_end=995 - _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_start=938 - _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_end=995 - _globals['_STOREANDFORWARD_SYNC']._serialized_start=997 - _globals['_STOREANDFORWARD_SYNC']._serialized_end=1114 - _globals['_STOREANDFORWARD_SYNCDONE']._serialized_start=1116 - _globals['_STOREANDFORWARD_SYNCDONE']._serialized_end=1243 - _globals['_STOREANDFORWARD_TYPE']._serialized_start=1245 - _globals['_STOREANDFORWARD_TYPE']._serialized_end=1336 + _globals['_STOREANDFORWARD_ANNOUNCE']._serialized_end=1018 + _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_start=961 + _globals['_STOREANDFORWARD_ANNOUNCE_FLAGS']._serialized_end=1018 + _globals['_STOREANDFORWARD_SYNC']._serialized_start=1020 + _globals['_STOREANDFORWARD_SYNC']._serialized_end=1137 + _globals['_STOREANDFORWARD_SYNCDONE']._serialized_start=1139 + _globals['_STOREANDFORWARD_SYNCDONE']._serialized_end=1266 + _globals['_STOREANDFORWARD_TYPE']._serialized_start=1268 + _globals['_STOREANDFORWARD_TYPE']._serialized_end=1359 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/storeforward_pb2.pyi b/meshtastic/protobuf/storeforward_pb2.pyi index 8092dda02..ea4ff3950 100644 --- a/meshtastic/protobuf/storeforward_pb2.pyi +++ b/meshtastic/protobuf/storeforward_pb2.pyi @@ -280,6 +280,7 @@ class StoreAndForward(_message.Message): CAPACITY_FIELD_NUMBER: _builtins.int HELD_FIELD_NUMBER: _builtins.int FLAGS_FIELD_NUMBER: _builtins.int + ANNOUNCE_SECS_FIELD_NUMBER: _builtins.int server: _builtins.int """ The server to sync with. Explicit because a MINI frame has no `from` field. @@ -305,6 +306,10 @@ class StoreAndForward(_message.Message): """ Bitwise OR of Flags values. """ + announce_secs: _builtins.int + """ + Seconds between this server's announces, so a client can tell how many it missed. + """ @_builtins.property def served_hashes(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ @@ -321,10 +326,11 @@ class StoreAndForward(_message.Message): capacity: _builtins.int = ..., held: _builtins.int = ..., flags: _builtins.int = ..., + announce_secs: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["capacity", b"capacity", "flags", b"flags", "held", b"held", "max_per_sync", b"max_per_sync", "oldest_rx_time", b"oldest_rx_time", "served_hashes", b"served_hashes", "server", b"server"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["announce_secs", b"announce_secs", "capacity", b"capacity", "flags", b"flags", "held", b"held", "max_per_sync", b"max_per_sync", "oldest_rx_time", b"oldest_rx_time", "served_hashes", b"served_hashes", "server", b"server"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/wire_pb2.py b/meshtastic/protobuf/wire_pb2.py index f93b9c8bc..7311168e5 100644 --- a/meshtastic/protobuf/wire_pb2.py +++ b/meshtastic/protobuf/wire_pb2.py @@ -17,7 +17,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"\x9a\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\x1b\n\x0cneighbor_ids\x18\x04 \x03(\x07\x42\x05\x92?\x02\x10\n\x12\x1d\n\x0cneighbor_snr\x18\x05 \x03(\x11\x42\x07\x92?\x04\x10\n8\x08\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"~\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x02 \x01(\r\x12\x37\n\tneighbors\x18\x03 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\">\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x0b\n\x03snr\x18\x02 \x01(\x11\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -89,10 +89,8 @@ _globals['_MQTTCLIENTPROXYMESSAGE'].fields_by_name['text']._serialized_options = b'\222?\003\010\263\003' _globals['_INJECTEDFRAME'].fields_by_name['data']._options = None _globals['_INJECTEDFRAME'].fields_by_name['data']._serialized_options = b'\222?\003\010\200\002' - _globals['_NEIGHBORINFO'].fields_by_name['neighbor_ids']._options = None - _globals['_NEIGHBORINFO'].fields_by_name['neighbor_ids']._serialized_options = b'\222?\002\020\n' - _globals['_NEIGHBORINFO'].fields_by_name['neighbor_snr']._options = None - _globals['_NEIGHBORINFO'].fields_by_name['neighbor_snr']._serialized_options = b'\222?\004\020\n8\010' + _globals['_NEIGHBORINFO'].fields_by_name['neighbors']._options = None + _globals['_NEIGHBORINFO'].fields_by_name['neighbors']._serialized_options = b'\222?\002\020\n' _globals['_POSITION']._serialized_start=160 _globals['_POSITION']._serialized_end=864 _globals['_USER']._serialized_start=867 @@ -129,6 +127,8 @@ _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3279 _globals['_INJECTEDFRAME']._serialized_start=3281 _globals['_INJECTEDFRAME']._serialized_end=3365 - _globals['_NEIGHBORINFO']._serialized_start=3368 - _globals['_NEIGHBORINFO']._serialized_end=3522 + _globals['_NEIGHBORINFO']._serialized_start=3367 + _globals['_NEIGHBORINFO']._serialized_end=3493 + _globals['_NEIGHBOR']._serialized_start=3495 + _globals['_NEIGHBOR']._serialized_end=3557 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index 5d506ae1e..9db05ca7d 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -500,8 +500,8 @@ class Routing(_message.Message): Optional proof that this ack or nak was produced by the node that actually received the packet named by Data.request_id, rather than by anyone holding the channel key. - An explicit ack usually travels on the channel, and a channel frame is encrypted but not - authenticated, so any listener holding the PSK can forge one. When the acknowledged + An explicit ack on a channel is authenticated only to the channel: its AEAD tag proves a + member sent it, so any member holding the PSK can forge one. When the acknowledged packet was PKI encrypted the two endpoints already share a Curve25519 secret, so the receiver proves receipt with a MAC rather than a signature: @@ -1299,71 +1299,79 @@ Global___InjectedFrame: _TypeAlias = InjectedFrame # noqa: Y015 @_typing.final class NeighborInfo(_message.Message): """ - Full info on edges for a single node + A node's directly heard neighbors, built from its node database. A node reports it to + its own client only, periodically and in reply to a request from that client; it never + goes over LoRa or MQTT. """ DESCRIPTOR: _descriptor.Descriptor NODE_ID_FIELD_NUMBER: _builtins.int - LAST_SENT_BY_ID_FIELD_NUMBER: _builtins.int NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _builtins.int - NEIGHBOR_IDS_FIELD_NUMBER: _builtins.int - NEIGHBOR_SNR_FIELD_NUMBER: _builtins.int + NEIGHBORS_FIELD_NUMBER: _builtins.int node_id: _builtins.int """ - The node ID of the node sending info on its neighbors - """ - last_sent_by_id: _builtins.int - """ - Field to pass neighbor info for the next sending cycle + The reporting node """ node_broadcast_interval_secs: _builtins.int """ - Broadcast interval of the represented node (in seconds) + Seconds between the node's periodic reports """ @_builtins.property - def neighbor_ids(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: - """ - The out edges from this node, as two parallel columns: edge N is - (neighbor_ids[N], neighbor_snr[N]), and the two columns MUST stay the same - length. - - Columns rather than one submessage per edge: a submessage costs a tag and a - length byte per neighbour plus a tag on each field inside it, where the - columns pay the field framing once and nothing per edge. That is around a - third of the message at ten neighbours, and roughly twice as many edges in - one frame. - - A node's view of when it last heard a neighbour, and that neighbour's own - broadcast interval, belong to that node's table rather than to a message - about the edge, so neither is a column here. - """ - - @_builtins.property - def neighbor_snr(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: + def neighbors(self) -> _containers.RepeatedCompositeFieldContainer[Global___Neighbor]: """ - SNR of the last message heard from each neighbour, in dB scaled by 2. - - Half-dB steps because this is the one SNR field that goes on the air, once per - neighbour: the whole practical range of -32 to +31.5 dB is a single zigzag byte, - where the radio's own quarter-dB quantum needs two below -16 dB - exactly the - weak links a neighbour table is about. Rounding a quarter-dB reading to halves - loses nothing a link decision uses. + The direct neighbors heard within twice the report interval """ def __init__( self, *, node_id: _builtins.int = ..., - last_sent_by_id: _builtins.int = ..., node_broadcast_interval_secs: _builtins.int = ..., - neighbor_ids: _abc.Iterable[_builtins.int] | None = ..., - neighbor_snr: _abc.Iterable[_builtins.int] | None = ..., + neighbors: _abc.Iterable[Global___Neighbor] | None = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["last_sent_by_id", b"last_sent_by_id", "neighbor_ids", b"neighbor_ids", "neighbor_snr", b"neighbor_snr", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["neighbors", b"neighbors", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... Global___NeighborInfo: _TypeAlias = NeighborInfo # noqa: Y015 + +@_typing.final +class Neighbor(_message.Message): + """ + One directly heard neighbor + """ + + DESCRIPTOR: _descriptor.Descriptor + + NODE_ID_FIELD_NUMBER: _builtins.int + SNR_FIELD_NUMBER: _builtins.int + LAST_RX_TIME_FIELD_NUMBER: _builtins.int + node_id: _builtins.int + """ + Node number of the neighbor + """ + snr: _builtins.int + """ + SNR of the last message heard from the neighbor, in dB scaled by 2 + """ + last_rx_time: _builtins.int + """ + When the neighbor was last heard, in seconds since 1970 + """ + def __init__( + self, + *, + node_id: _builtins.int = ..., + snr: _builtins.int = ..., + last_rx_time: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["last_rx_time", b"last_rx_time", "node_id", b"node_id", "snr", b"snr"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___Neighbor: _TypeAlias = Neighbor # noqa: Y015 diff --git a/meshtastic/tests/test_inject_nanopb_options.py b/meshtastic/tests/test_inject_nanopb_options.py index 56bcf504d..a86fb4bd7 100644 --- a/meshtastic/tests/test_inject_nanopb_options.py +++ b/meshtastic/tests/test_inject_nanopb_options.py @@ -792,13 +792,12 @@ def test_descriptor_meshpacket_hop_limit(): @pytest.mark.unit -def test_descriptor_neighborinfo_neighbor_snr(): - """NeighborInfo.neighbor_snr has max_count = 10 and int_size = IS_8 from wire.options.""" +def test_descriptor_neighborinfo_neighbors(): + """NeighborInfo.neighbors has max_count = 10 from wire.options.""" opts = _field_opts( - wire_pb2.DESCRIPTOR.message_types_by_name["NeighborInfo"], "neighbor_snr" + wire_pb2.DESCRIPTOR.message_types_by_name["NeighborInfo"], "neighbors" ) assert opts.max_count == 10 - assert opts.int_size == nanopb_pb2.IS_8 @pytest.mark.unit diff --git a/protobufs b/protobufs index f69d9fa5b..157c34d20 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit f69d9fa5b9e1760d793b401bc481556793ce75dd +Subproject commit 157c34d2072ba213dc559b6ea5a0191bd8b24945 From 770c3faf5a4700a1ab71c0dee0d2f5f2529f0f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Tue, 6 Oct 2026 22:05:33 +0200 Subject: [PATCH 18/24] Send to anycast groups and manage group keys sendData/sendText take anycast=True. Node gains setGroup, deleteGroup, listGroups and groupId; an ACK to an anycast send names the member. The CLI adds --group-new, --group-add, --group-priv, --group-uplink, --group-del, --groups and --dest-group. X25519 key generation is pure Python. --- meshtastic/__main__.py | 96 +++++++++++++++++++++++++++++- meshtastic/anycast.py | 72 ++++++++++++++++++++++ meshtastic/mesh_interface.py | 13 +++- meshtastic/node.py | 75 ++++++++++++++++++++++- meshtastic/protobuf/config_pb2.pyi | 7 ++- meshtastic/protobuf/packet_pb2.pyi | 6 +- meshtastic/protobuf/wire_pb2.py | 52 ++++++++-------- meshtastic/protobuf/wire_pb2.pyi | 27 ++++++--- meshtastic/tests/test_anycast.py | 84 ++++++++++++++++++++++++++ protobufs | 2 +- 10 files changed, 392 insertions(+), 42 deletions(-) create mode 100644 meshtastic/anycast.py create mode 100644 meshtastic/tests/test_anycast.py diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 7c3015610..9eb547649 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -11,6 +11,7 @@ from decimal import Decimal import argparse +import base64 argcomplete: Union[None, ModuleType] = None try: @@ -38,6 +39,7 @@ except ImportError as e: have_test = False +import meshtastic.anycast import meshtastic.ota import meshtastic.util import meshtastic.serial_interface @@ -499,6 +501,38 @@ def onConnected(interface): print("Leaving licensed (ham) mode; channel keys stay as they are") interface.getNode(args.dest, **getNode_kwargs).setOwner(is_licensed=False) + if args.group_new: + closeNow = True + priv, pub = meshtastic.anycast.generate_keypair() + interface.getNode(args.dest, **getNode_kwargs).setGroup(args.group_new, pub, priv, uplink=args.group_uplink) + print(f"Created group {args.group_new} (!{meshtastic.anycast.group_id(pub):08x}); this node is a member") + print(f"Public key for the nodes that send to it: base64:{base64.b64encode(pub).decode()}") + print(f"Private key for other members: base64:{base64.b64encode(priv).decode()}") + + if args.group_add: + closeNow = True + name, pubStr = args.group_add + pub = meshtastic.util.fromStr(pubStr) + priv = meshtastic.util.fromStr(args.group_priv) if args.group_priv else None + if not isinstance(pub, bytes) or (priv is not None and not isinstance(priv, bytes)): + meshtastic.util.our_exit("ERROR: give group keys as base64:... or 0x...") + interface.getNode(args.dest, **getNode_kwargs).setGroup(name, pub, priv, uplink=args.group_uplink) + print(f"Added group {name} (!{meshtastic.anycast.group_id(pub):08x}){', this node is a member' if priv else ''}") + + if args.group_del: + closeNow = True + interface.getNode(args.dest, **getNode_kwargs).deleteGroup(args.group_del) + print(f"Removed group {args.group_del}") + + if args.groups: + closeNow = True + node = interface.getNode(args.dest, **getNode_kwargs) + node._loadGroupConfig() # pylint: disable=W0212 + for g in node.listGroups(): + role = "member" if g["member"] else "sender" + uplink = ", uplink" if g["uplink"] else "" + print(f"{g['name']}: !{g['id']:08x} ({role}{uplink})") + if args.reboot: closeNow = True waitForAckNak = True @@ -611,7 +645,22 @@ def onConnected(interface): args.add_contact ) - if args.sendtext: + if args.sendtext and args.dest_group: + closeNow = True + groupNum = interface.localNode.groupId(args.dest_group) + if groupNum is None: + meshtastic.util.our_exit(f"ERROR: the connected node knows no group named {args.dest_group}") + print(f"Sending text message {args.sendtext} to group {args.dest_group} (!{groupNum:08x})") + interface.sendText( + args.sendtext, + groupNum, + wantAck=True, + channelIndex=mt_config.channel_index or 0, + onResponse=interface.localNode.onAckNak, + portNum=portnums_pb2.PortNum.PRIVATE_APP if args.private else portnums_pb2.PortNum.TEXT_MESSAGE_APP, + anycast=True, + ) + elif args.sendtext: closeNow = True channelIndex = mt_config.channel_index or 0 if checkChannel(interface, channelIndex): @@ -1896,6 +1945,13 @@ def addSelectionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser metavar="!xxxxxxxx", ) + group.add_argument( + "--dest-group", + help="Send '--sendtext' to an anycast group the connected node knows: the nearest member delivers it.", + default=None, + metavar="NAME", + ) + group.add_argument( "--ch-index", help="Set the specified channel index for channel-specific commands. Channels start at 0 (0 is the PRIMARY channel).", @@ -2064,6 +2120,44 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: action="store_true", ) + group.add_argument( + "--group-new", + help="Create an anycast group with a fresh key pair and make this node a member. " + "Prints the public key to give to the nodes that send to it.", + metavar="NAME", + ) + + group.add_argument( + "--group-add", + help="Add an anycast group by its public key, to send to it. With '--group-priv' this node is a member.", + nargs=2, + metavar=("NAME", "PUBLIC_KEY"), + ) + + group.add_argument( + "--group-priv", + help="The group's private key, with '--group-add': this node delivers what is sent to the group.", + metavar="PRIVATE_KEY", + ) + + group.add_argument( + "--group-uplink", + help="With '--group-new' or '--group-add': a member hands what it delivers to MQTT.", + action="store_true", + ) + + group.add_argument( + "--group-del", + help="Remove an anycast group; a member also drops its private key.", + metavar="NAME", + ) + + group.add_argument( + "--groups", + help="List the anycast groups this node knows.", + action="store_true", + ) + group.add_argument( "--set-is-unmessageable", "--set-is-unmessagable", help="Set if a node is messageable or not", action="store" diff --git a/meshtastic/anycast.py b/meshtastic/anycast.py new file mode 100644 index 000000000..597ce2595 --- /dev/null +++ b/meshtastic/anycast.py @@ -0,0 +1,72 @@ +"""Anycast groups (protobufs SCHEMA.md section 8, "Anycast"). + +A group is an X25519 key pair whose id, crc32 of the public key, lives in the node number +space. A sender holds the public half; a member also holds the private half and delivers what +is sent to the group. Key generation is pure Python (RFC 7748), so no crypto dependency. +""" + +import os +import zlib +from typing import Tuple + +_P = 2**255 - 19 +_A24 = 121665 +_BASE_POINT = (9).to_bytes(32, "little") + +# Node numbers 0-3 are reserved and 0xFFFFFFFF is the broadcast address: firmware refuses them. +RESERVED_IDS = {0, 1, 2, 3, 0xFFFFFFFF} + + +def group_id(public_key: bytes) -> int: + """The group's id in the node number space.""" + return zlib.crc32(public_key) & 0xFFFFFFFF + + +def _clamp(scalar: bytes) -> int: + k = bytearray(scalar) + k[0] &= 248 + k[31] &= 127 + k[31] |= 64 + return int.from_bytes(k, "little") + + +def x25519(scalar: bytes, u_point: bytes) -> bytes: + """RFC 7748 X25519: scalar times the point with u-coordinate u_point.""" + k = _clamp(scalar) + x1 = int.from_bytes(u_point, "little") & ((1 << 255) - 1) + x2, z2, x3, z3, swap = 1, 0, x1, 1, 0 + for t in reversed(range(255)): + bit = (k >> t) & 1 + swap ^= bit + if swap: + x2, x3, z2, z3 = x3, x2, z3, z2 + swap = bit + a, b = (x2 + z2) % _P, (x2 - z2) % _P + aa, bb = a * a % _P, b * b % _P + e = (aa - bb) % _P + c, d = (x3 + z3) % _P, (x3 - z3) % _P + da, cb = d * a % _P, c * b % _P + x3 = (da + cb) ** 2 % _P + z3 = x1 * (da - cb) ** 2 % _P + x2 = aa * bb % _P + z2 = e * (aa + _A24 * e) % _P + if swap: + x2, z2 = x3, z3 + return (x2 * pow(z2, _P - 2, _P) % _P).to_bytes(32, "little") + + +def public_key(private_key: bytes) -> bytes: + """The public half of an X25519 private key.""" + return x25519(private_key, _BASE_POINT) + + +def generate_keypair() -> Tuple[bytes, bytes]: + """A fresh group key pair, (private, public), whose id firmware accepts.""" + while True: + priv = bytearray(os.urandom(32)) + priv[0] &= 248 + priv[31] &= 127 + priv[31] |= 64 + pub = public_key(bytes(priv)) + if group_id(pub) not in RESERVED_IDS: + return bytes(priv), pub diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index cc40f3f4c..6d7ec0eda 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -14,7 +14,7 @@ import traceback from datetime import datetime from decimal import Decimal -from typing import Any, Callable, Dict, List, Optional, Union +from typing import Any, Callable, Dict, List, Optional, Set, Union try: @@ -127,6 +127,7 @@ def __init__( ) self._timeout: Timeout = Timeout(maxSecs=timeout) self._acknowledgment: Acknowledgment = Acknowledgment() + self.anycastRequests: Set[int] = set() # ids of packets sent to an anycast group self.heartbeatTimer: Optional[threading.Timer] = None random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it self.currentPacketId: int = random.randint(0, 0xFFFFFFFF) @@ -419,6 +420,7 @@ def sendText( portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.TEXT_MESSAGE_APP, replyId: Optional[int]=None, hopLimit: Optional[int]=None, + anycast: bool=False, ): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. @@ -437,6 +439,7 @@ def sendText( of the destination, see portnums.proto for a list replyId -- the ID of the message that this packet is a response to hopLimit {int} -- hop limit to use + anycast -- destinationId is an anycast group id: the nearest member delivers it Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -452,6 +455,7 @@ def sendText( channelIndex=channelIndex, replyId=replyId, hopLimit=hopLimit, + anycast=anycast, ) @@ -519,6 +523,7 @@ def sendData( priority: packet_pb2.MeshPacket.Priority.ValueType=packet_pb2.MeshPacket.Priority.RELIABLE, replyId: Optional[int]=None, recordPath: bool=False, + anycast: bool=False, ): # pylint: disable=R0913 """Send a data packet to some other node @@ -545,6 +550,8 @@ def sendData( hopLimit -- hop limit to use replyId -- the ID of the message that this packet is a response to recordPath -- ask relays to record the path this packet takes + anycast -- destinationId is an anycast group id: the nearest member delivers it, + and acks from its own node number Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -572,7 +579,11 @@ def sendData( meshPacket.decoded.bitfield = wire_pb2.Data.BITFIELD_WANT_RESPONSE if recordPath: meshPacket.flags |= packet_pb2.MeshPacket.PACKET_RECORD_PATH + if anycast: + meshPacket.flags |= packet_pb2.MeshPacket.PACKET_ANYCAST meshPacket.id = self._generatePacketId() + if anycast: + self.anycastRequests.add(meshPacket.id) if replyId is not None: meshPacket.decoded.reply_id = replyId if priority is not None: diff --git a/meshtastic/node.py b/meshtastic/node.py index 641b4104e..22d20e1d5 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -8,6 +8,7 @@ from typing import Optional, Union, List +from meshtastic import anycast from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, common_pb2, config_pb2, localonly_pb2, portnums_pb2, wire_pb2 from meshtastic.util import ( Timeout, @@ -306,6 +307,74 @@ def getDisabledChannel(self): return c return None + def _loadGroupConfig(self): + """A remote node's group and security config, which nothing loads by default.""" + if self != self.iface.localNode: + for name in ("group", "security"): + self.requestConfig(self.localConfig.DESCRIPTOR.fields_by_name.get(name)) + + def listGroups(self) -> List[dict]: + """The anycast groups this node knows: name, id, whether it is a member, and uplink.""" + memberKeys = {anycast.public_key(k) for k in self.localConfig.security.group_private_key if len(k) == 32} + return [ + { + "name": g.name, + "id": anycast.group_id(g.public_key), + "member": g.public_key in memberKeys, + "uplink": g.uplink_enabled, + } + for g in self.localConfig.group.groups + ] + + def groupId(self, name: str) -> Optional[int]: + """The id of anycast group `name`, or None when this node does not know it.""" + for g in self.localConfig.group.groups: + if g.name == name: + return anycast.group_id(g.public_key) + return None + + def setGroup(self, name: str, publicKey: bytes, privateKey: Optional[bytes] = None, uplink: bool = False): + """Add or replace anycast group `name`. With privateKey this node is a member: it delivers + what is sent to the group and, with uplink, hands it to MQTT.""" + if len(publicKey) != 32 or (privateKey is not None and len(privateKey) != 32): + our_exit("Error: group keys are 32 bytes") + if privateKey is not None and anycast.public_key(privateKey) != publicKey: + our_exit("Error: the private key does not belong to that public key") + if anycast.group_id(publicKey) in anycast.RESERVED_IDS: + our_exit("Error: that key gives a reserved group id, generate another") + self.ensureSessionKey() + self._loadGroupConfig() + kept = [g for g in self.localConfig.group.groups if g.name != name] + if len(kept) >= 4: + our_exit("Error: a node holds at most 4 groups") + del self.localConfig.group.groups[:] + self.localConfig.group.groups.extend(kept) + g = self.localConfig.group.groups.add() + g.name = name + g.public_key = publicKey + g.uplink_enabled = uplink + self.writeConfig("group") + if privateKey is not None and privateKey not in self.localConfig.security.group_private_key: + if self != self.iface.localNode: + print("Warning: a remote node does not return its group keys, so this replaces them") + self.localConfig.security.group_private_key.append(privateKey) + self.writeConfig("security") + + def deleteGroup(self, name: str): + """Remove anycast group `name`; the node drops its private key with it.""" + self.ensureSessionKey() + self._loadGroupConfig() + removed = [g.public_key for g in self.localConfig.group.groups if g.name == name] + if not removed: + our_exit(f"Error: no group named {name}") + kept = [g for g in self.localConfig.group.groups if g.name != name] + del self.localConfig.group.groups[:] + self.localConfig.group.groups.extend(kept) + self.writeConfig("group") + keys = [k for k in self.localConfig.security.group_private_key if anycast.public_key(k) not in removed] + del self.localConfig.security.group_private_key[:] + self.localConfig.security.group_private_key.extend(keys) + def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: Optional[bool]=None, is_unmessagable: Optional[bool]=None): """Set device owner name. is_licensed None keeps the node's current licensed state.""" logger.debug(f"in setOwner nodeNum:{self.nodeNum}") @@ -1017,7 +1086,11 @@ def onAckNak(self, p): ) self.iface._acknowledgment.receivedImplAck = True else: - print(f"Received an ACK.") + # Any member of a group may answer: say which one did + if p["decoded"].get("requestId") in self.iface.anycastRequests: + print(f"Received an ACK from !{int(p['from']):08x}.") + else: + print(f"Received an ACK.") self.iface._acknowledgment.receivedAck = True def _requestChannel(self, channelNum: int): diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index 6f942324c..3f3b29064 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -1659,7 +1659,8 @@ class SecurityConfig(_message.Message): Held here rather than in GroupConfig because this is where private key material lives, with the same handling as private_key: never returned to a client that did not set it. Firmware derives each key's public half to match it against a GroupConfig.Group entry, - so nothing indexes one list into the other. + so nothing indexes one list into the other. A security set carrying no group key keeps + the stored ones; a group set drops the key of a group it removes. """ def __init__( @@ -1718,7 +1719,9 @@ class GroupConfig(_message.Message): A frame to a group is an ordinary UCAST frame with HOP_ANYCAST set, so it is delivered to the nearest reachable member by the same next-hop learning as a direct message, and - it never becomes a broadcast. + it never becomes a broadcast. A group is an X25519 key pair; nothing signs as the group. + Firmware refuses a group whose key is not 32 bytes, whose id is 0-3 or 0xFFFFFFFF, or + whose id repeats another group's. """ DESCRIPTOR: _descriptor.Descriptor diff --git a/meshtastic/protobuf/packet_pb2.pyi b/meshtastic/protobuf/packet_pb2.pyi index c83708f6c..c5562b925 100644 --- a/meshtastic/protobuf/packet_pb2.pyi +++ b/meshtastic/protobuf/packet_pb2.pyi @@ -297,7 +297,8 @@ class MeshPacket(_message.Message): """ PACKET_ANYCAST: MeshPacket._Flags.ValueType # 128 """ - `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. + `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. A client sets + it to send to a group; a `to` that matches a configured group without it is a node. """ class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): @@ -328,7 +329,8 @@ class MeshPacket(_message.Message): """ PACKET_ANYCAST: MeshPacket.Flags.ValueType # 128 """ - `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. + `to` is an anycast group, mirroring the header's HOP_ANYCAST for clients. A client sets + it to send to a group; a `to` that matches a configured group without it is a node. """ class _AckProofStatus: diff --git a/meshtastic/protobuf/wire_pb2.py b/meshtastic/protobuf/wire_pb2.py index 7311168e5..1015b83ff 100644 --- a/meshtastic/protobuf/wire_pb2.py +++ b/meshtastic/protobuf/wire_pb2.py @@ -17,7 +17,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xa2\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"~\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x02 \x01(\r\x12\x37\n\tneighbors\x18\x03 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\">\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x0b\n\x03snr\x18\x02 \x01(\x11\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xb9\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\ranycast_reply\x18\x04 \x01(\x07\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"~\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x02 \x01(\r\x12\x37\n\tneighbors\x18\x03 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\">\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x0b\n\x03snr\x18\x02 \x01(\x11\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -106,29 +106,29 @@ _globals['_KEYVERIFICATION']._serialized_start=1829 _globals['_KEYVERIFICATION']._serialized_end=1905 _globals['_HEADEROPTIONS']._serialized_start=1908 - _globals['_HEADEROPTIONS']._serialized_end=2070 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=1996 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2070 - _globals['_REMOTESHELL']._serialized_start=2073 - _globals['_REMOTESHELL']._serialized_end=2542 - _globals['_REMOTESHELL_OPCODE']._serialized_start=2330 - _globals['_REMOTESHELL_OPCODE']._serialized_end=2473 - _globals['_REMOTESHELL_FLAGS']._serialized_start=2475 - _globals['_REMOTESHELL_FLAGS']._serialized_end=2542 - _globals['_BOUNDINGBOX']._serialized_start=2544 - _globals['_BOUNDINGBOX']._serialized_end=2661 - _globals['_WAYPOINT']._serialized_start=2664 - _globals['_WAYPOINT']._serialized_end=3105 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=2959 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3057 - _globals['_STATUSMESSAGE']._serialized_start=3107 - _globals['_STATUSMESSAGE']._serialized_end=3145 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3148 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3279 - _globals['_INJECTEDFRAME']._serialized_start=3281 - _globals['_INJECTEDFRAME']._serialized_end=3365 - _globals['_NEIGHBORINFO']._serialized_start=3367 - _globals['_NEIGHBORINFO']._serialized_end=3493 - _globals['_NEIGHBOR']._serialized_start=3495 - _globals['_NEIGHBOR']._serialized_end=3557 + _globals['_HEADEROPTIONS']._serialized_end=2093 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=2019 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2093 + _globals['_REMOTESHELL']._serialized_start=2096 + _globals['_REMOTESHELL']._serialized_end=2565 + _globals['_REMOTESHELL_OPCODE']._serialized_start=2353 + _globals['_REMOTESHELL_OPCODE']._serialized_end=2496 + _globals['_REMOTESHELL_FLAGS']._serialized_start=2498 + _globals['_REMOTESHELL_FLAGS']._serialized_end=2565 + _globals['_BOUNDINGBOX']._serialized_start=2567 + _globals['_BOUNDINGBOX']._serialized_end=2684 + _globals['_WAYPOINT']._serialized_start=2687 + _globals['_WAYPOINT']._serialized_end=3128 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=2982 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3080 + _globals['_STATUSMESSAGE']._serialized_start=3130 + _globals['_STATUSMESSAGE']._serialized_end=3168 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3171 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3302 + _globals['_INJECTEDFRAME']._serialized_start=3304 + _globals['_INJECTEDFRAME']._serialized_end=3388 + _globals['_NEIGHBORINFO']._serialized_start=3390 + _globals['_NEIGHBORINFO']._serialized_end=3516 + _globals['_NEIGHBOR']._serialized_start=3518 + _globals['_NEIGHBOR']._serialized_end=3580 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index 9db05ca7d..77a84908a 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -509,7 +509,9 @@ class Routing(_message.Message): "ack" | LE32(from) | LE32(to) | LE32(request_id) | routing)[0..8) where shared_key is the SHA256(X25519(sender_private, receiver_public)) that PKI packet - encryption uses, and `routing` is this encoded Routing message without this field. + encryption uses, and `routing` is this encoded Routing message without this field. On a + reply to an anycast request it is the key the request was sealed with, + SHA256(X25519(group_private, sender_public)), and `from` is the member that answered. Every input earns its place. request_id stops a captured proof being replayed against a different outstanding packet. The Routing bytes stop a bit flip turning a proven success @@ -735,9 +737,9 @@ class HeaderOptions(_message.Message): HOP_ANYCAST: HeaderOptions._HopFlags.ValueType # 4 """ `to` is a group identity rather than a node. Any node holding the group's private - key may deliver and acknowledge it. A relay keys its next-hop and dedup tables on - (this bit, to) and otherwise treats the frame as ordinary unicast. Meaningless on - a broadcast, where a relay ignores it. + key may deliver and acknowledge it. A relay keys its next-hop table on (this bit, + to) and otherwise treats the frame as ordinary unicast. Meaningless on a broadcast, + where a relay ignores it. """ class HopFlags(_HopFlags, metaclass=_HopFlagsEnumTypeWrapper): @@ -767,14 +769,15 @@ class HeaderOptions(_message.Message): HOP_ANYCAST: HeaderOptions.HopFlags.ValueType # 4 """ `to` is a group identity rather than a node. Any node holding the group's private - key may deliver and acknowledge it. A relay keys its next-hop and dedup tables on - (this bit, to) and otherwise treats the frame as ordinary unicast. Meaningless on - a broadcast, where a relay ignores it. + key may deliver and acknowledge it. A relay keys its next-hop table on (this bit, + to) and otherwise treats the frame as ordinary unicast. Meaningless on a broadcast, + where a relay ignores it. """ FRAGMENT_FIELD_NUMBER: _builtins.int HOP_FLAGS_FIELD_NUMBER: _builtins.int SCOPE_CODE_FIELD_NUMBER: _builtins.int + ANYCAST_REPLY_FIELD_NUMBER: _builtins.int fragment: _builtins.int """ Fragmentation state, packed as msg_id(8) | index(3) | total(3). @@ -820,16 +823,24 @@ class HeaderOptions(_message.Message): Region traffic still carries a channel (BCAST) or a destination (UCAST): this filters, it does not address. """ + anycast_reply: _builtins.int + """ + On an ack, nak or response to an anycast request: that request's id. Hop-by-hop. A + relay that carried the request learns its next hop toward the request's group from + the first frame carrying it, and the requester uses it to pick the group key the + reply is sealed with. fixed32 because packet ids are random 32-bit values. + """ def __init__( self, *, fragment: _builtins.int = ..., hop_flags: _builtins.int = ..., scope_code: _builtins.int = ..., + anycast_reply: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["fragment", b"fragment", "hop_flags", b"hop_flags", "scope_code", b"scope_code"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["anycast_reply", b"anycast_reply", "fragment", b"fragment", "hop_flags", b"hop_flags", "scope_code", b"scope_code"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/tests/test_anycast.py b/meshtastic/tests/test_anycast.py new file mode 100644 index 000000000..34d35cf4a --- /dev/null +++ b/meshtastic/tests/test_anycast.py @@ -0,0 +1,84 @@ +"""Anycast groups: ids, keys, sending to a group and managing groups on a node.""" + +from unittest.mock import MagicMock + +import pytest + +from meshtastic import anycast +from meshtastic.mesh_interface import MeshInterface +from meshtastic.node import Node +from meshtastic.protobuf import localonly_pb2, packet_pb2 + + +@pytest.mark.unit +def test_group_id_is_crc32_of_the_public_key(): + """The same vector the firmware's test_anycast pins.""" + assert anycast.group_id(bytes(range(32))) == 0x91267E8A + + +@pytest.mark.unit +def test_x25519_matches_rfc7748(): + """RFC 7748 section 5.2, first vector.""" + scalar = bytes.fromhex("a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4") + u = bytes.fromhex("e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c") + expected = bytes.fromhex("c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552") + assert anycast.x25519(scalar, u) == expected + + +@pytest.mark.unit +def test_generated_keys_agree_and_avoid_reserved_ids(): + priv_a, pub_a = anycast.generate_keypair() + priv_b, pub_b = anycast.generate_keypair() + assert anycast.public_key(priv_a) == pub_a + assert anycast.x25519(priv_a, pub_b) == anycast.x25519(priv_b, pub_a) + assert anycast.group_id(pub_a) not in anycast.RESERVED_IDS + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_send_to_a_group_sets_the_anycast_flag(): + iface = MeshInterface(noProto=True) + p = iface.sendData(b"hello", 0x1234ABCD, portNum=1, anycast=True) + assert p.flags & packet_pb2.MeshPacket.PACKET_ANYCAST + assert p.id in iface.anycastRequests + plain = iface.sendData(b"hello", 0x1234ABCD, portNum=1) + assert not plain.flags & packet_pb2.MeshPacket.PACKET_ANYCAST + iface.close() + + +def _localNode(): + iface = MagicMock(autospec=MeshInterface) + node = Node(iface, 1234, noProto=True) + iface.localNode = node + node.localConfig = localonly_pb2.LocalConfig() + node.writeConfig = MagicMock() + return node + + +@pytest.mark.unit +def test_set_group_as_member_writes_group_then_key(): + node = _localNode() + priv, pub = anycast.generate_keypair() + node.setGroup("gw", pub, priv, uplink=True) + assert [c.args[0] for c in node.writeConfig.call_args_list] == ["group", "security"] + assert node.listGroups() == [{"name": "gw", "id": anycast.group_id(pub), "member": True, "uplink": True}] + assert node.groupId("gw") == anycast.group_id(pub) + + +@pytest.mark.unit +def test_set_group_refuses_a_private_key_of_another_group(): + node = _localNode() + priv, _ = anycast.generate_keypair() + _, pub = anycast.generate_keypair() + with pytest.raises(SystemExit): + node.setGroup("gw", pub, priv) + + +@pytest.mark.unit +def test_delete_group_drops_its_key(): + node = _localNode() + priv, pub = anycast.generate_keypair() + node.setGroup("gw", pub, priv) + node.deleteGroup("gw") + assert node.listGroups() == [] + assert list(node.localConfig.security.group_private_key) == [] diff --git a/protobufs b/protobufs index 157c34d20..b8bd0cf1a 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 157c34d2072ba213dc559b6ea5a0191bd8b24945 +Subproject commit b8bd0cf1a4da749cf1e11f58b807419d419349ce From 6e7c6082504659e994ab04dcc276db2f059f2bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Tue, 6 Oct 2026 22:53:00 +0200 Subject: [PATCH 19/24] Split and join fragments on client-owned ports sendData splits ATAK_FORWARDER (up to 4) and LORAWAN_BRIDGE (up to 2) payloads larger than one frame into fragments, with one response once all are acked or on the first nak. Received fragments are joined on (from, portnum, msg_id) and published once. --- meshtastic/fragment.py | 92 ++++++++++++++++++++++ meshtastic/mesh_interface.py | 80 +++++++++++++++++++ meshtastic/protobuf/wire_pb2.pyi | 11 +++ meshtastic/tests/test_fragment.py | 123 ++++++++++++++++++++++++++++++ protobufs | 2 +- 5 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 meshtastic/fragment.py create mode 100644 meshtastic/tests/test_fragment.py diff --git a/meshtastic/fragment.py b/meshtastic/fragment.py new file mode 100644 index 000000000..f6890f6e1 --- /dev/null +++ b/meshtastic/fragment.py @@ -0,0 +1,92 @@ +"""Per-portnum fragmentation (protobufs SCHEMA.md section 8, "Fragmentation"). + +A payload larger than one frame travels as up to eight ordinary packets, each carrying +HeaderOptions.fragment = msg_id << 6 | index << 3 | total, where total is the count minus +one. The owner of a port splits and joins it: a client owns the ports below, so this module +splits what the client sends and joins what it receives. The node never joins them for us. +""" + +import time +from typing import Dict, List, Optional, Tuple + +from meshtastic.protobuf import packet_pb2, portnums_pb2, wire_pb2 + +# Ports a client splits and joins, with their fragment cap. +CLIENT_PORTS = { + portnums_pb2.PortNum.ATAK_FORWARDER: 4, + portnums_pb2.PortNum.LORAWAN_BRIDGE: 2, +} + +# Payload bytes per fragment, below the per-shape room (SCHEMA.md section 8) so a two-byte +# portnum and HOP_STORE still fit: a broadcast fragment keeps room for its signature, a +# direct message fragment pays the PKI overhead instead. +BROADCAST_SLICE = 160 +UNICAST_SLICE = 210 + +REASSEMBLY_TIMEOUT_S = 300 + + +def pack(msg_id: int, index: int, total: int) -> int: + """HeaderOptions.fragment for fragment `index` of a message of `total + 1`.""" + return (msg_id & 0xFF) << 6 | (index & 7) << 3 | (total & 7) + + +def unpack(value: int) -> Optional[Tuple[int, int, int]]: + """(msg_id, index, total), or None for a value no sender may produce.""" + if value >> 14: + return None + msg_id, index, total = value >> 6, (value >> 3) & 7, value & 7 + if total == 0 or index > total: + return None + return msg_id, index, total + + +def split(data: bytes, broadcast: bool) -> List[bytes]: + """`data` in slices that each fit one frame of this shape.""" + size = BROADCAST_SLICE if broadcast else UNICAST_SLICE + return [data[i : i + size] for i in range(0, len(data), size)] + + +def field_of(meshPacket: packet_pb2.MeshPacket) -> Optional[Tuple[int, int, int]]: + """The fragment field of a received packet, or None for an ordinary one.""" + if not meshPacket.header_options: + return None + opts = wire_pb2.HeaderOptions() + try: + opts.ParseFromString(meshPacket.header_options) + except Exception: # pylint: disable=W0703 + return None + return unpack(opts.fragment) if opts.fragment else None + + +class Reassembler: + """Joins fragments keyed on (from, portnum, msg_id).""" + + def __init__(self, timeout_s: float = REASSEMBLY_TIMEOUT_S): + self.timeout_s = timeout_s + self.pending: Dict[Tuple[int, int, int], dict] = {} + + def add(self, meshPacket: packet_pb2.MeshPacket, now: Optional[float] = None) -> Optional[packet_pb2.MeshPacket]: + """Store one fragment. Returns the whole message, as fragment 0 carrying the joined + payload, once every fragment has arrived; None until then or for an invalid one.""" + field = field_of(meshPacket) + if field is None: + return None + now = time.monotonic() if now is None else now + self.pending = {k: v for k, v in self.pending.items() if now - v["last"] < self.timeout_s} + msg_id, index, total = field + key = (getattr(meshPacket, "from"), meshPacket.decoded.portnum, msg_id) + entry = self.pending.setdefault(key, {"total": total, "parts": {}, "last": now}) + if entry["total"] != total: + del self.pending[key] + return None + entry["parts"][index] = meshPacket + entry["last"] = now + if len(entry["parts"]) <= total: + return None + del self.pending[key] + whole = packet_pb2.MeshPacket() + whole.CopyFrom(entry["parts"][0]) + whole.decoded.payload = b"".join(entry["parts"][i].decoded.payload for i in range(total + 1)) + whole.ClearField("header_options") + return whole diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 6d7ec0eda..242d453f4 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -26,6 +26,7 @@ from tabulate import tabulate import meshtastic.node +from meshtastic import fragment from meshtastic import ( BROADCAST_ADDR, BROADCAST_NUM, @@ -127,6 +128,8 @@ def __init__( ) self._timeout: Timeout = Timeout(maxSecs=timeout) self._acknowledgment: Acknowledgment = Acknowledgment() + self.fragments = fragment.Reassembler() # client-owned ports arrive split, the node never joins them + self._fragmentMsgId: int = random.randint(0, 255) self.anycastRequests: Set[int] = set() # ids of packets sent to an anycast group self.heartbeatTimer: Optional[threading.Timer] = None random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it @@ -562,6 +565,23 @@ def sendData( data = data.SerializeToString() logger.debug(f"len(data): {len(data)}") + # A client-owned port splits what does not fit one frame (SCHEMA.md section 8) + maxFragments = fragment.CLIENT_PORTS.get(portNum, 0) + broadcast = destinationId in (BROADCAST_ADDR, BROADCAST_NUM) + if maxFragments and len(data) > (fragment.BROADCAST_SLICE if broadcast else fragment.UNICAST_SLICE): + return self._sendFragmented( + data, + destinationId, + portNum, + maxFragments, + broadcast, + wantAck=wantAck, + wantResponse=wantResponse, + onResponse=onResponse, + channelIndex=channelIndex, + hopLimit=hopLimit, + replyId=replyId, + ) # A frame's worth; the room a frame really leaves is per packet, and the node enforces it if len(data) > DATA_PAYLOAD_MAX: raise MeshInterface.MeshInterfaceError("Data payload too big") @@ -942,6 +962,60 @@ def deleteWaypoint( self.waitForWaypoint() return d + def _sendFragmented( + self, + data: bytes, + destinationId: Union[int, str], + portNum: portnums_pb2.PortNum.ValueType, + maxFragments: int, + broadcast: bool, + wantAck: bool = False, + wantResponse: bool = False, + onResponse: Optional[Callable[[dict], Any]] = None, + channelIndex: int = 0, + hopLimit: Optional[int] = None, + replyId: Optional[int] = None, + ): + """Send `data` as fragments of one message. onResponse fires once: on the first nak, or + when every fragment has been acked. Returns the first fragment's packet.""" + slices = fragment.split(data, broadcast) + if len(slices) > maxFragments: + raise MeshInterface.MeshInterfaceError("Data payload too big") + msgId = self._fragmentMsgId + self._fragmentMsgId = (self._fragmentMsgId + 1) & 0xFF + ids = [self._generatePacketId() for _ in slices] + if onResponse is not None: + waiting = set(ids) + + def onFragmentResponse(p): + if not waiting: + return + waiting.discard(p.get("decoded", {}).get("requestId")) + if p.get("decoded", {}).get("routing", {}).get("errorReason", "NONE") != "NONE": + waiting.clear() + if not waiting: + onResponse(p) + + for i in ids: + self._addResponseHandler(i, onFragmentResponse, ackPermitted=True) + sent = [] + for index, piece in enumerate(slices): + meshPacket = packet_pb2.MeshPacket() + meshPacket.id = ids[index] + meshPacket.channel = channelIndex + meshPacket.decoded.portnum = portNum + meshPacket.decoded.payload = piece + if index == 0: # the Data fields of the message ride on its first fragment only + if wantResponse: + meshPacket.decoded.bitfield = wire_pb2.Data.BITFIELD_WANT_RESPONSE + if replyId is not None: + meshPacket.decoded.reply_id = replyId + meshPacket.header_options = wire_pb2.HeaderOptions( + fragment=fragment.pack(msgId, index, len(slices) - 1) + ).SerializeToString() + sent.append(self._sendPacket(meshPacket, destinationId, wantAck=wantAck, hopLimit=hopLimit)) + return sent[0] + def _addResponseHandler( self, requestId: int, @@ -1507,6 +1581,12 @@ def _handlePacketFromRadio(self, meshPacket, hack=False): - meshtastic.receive.user(packet = MeshPacket dictionary) - meshtastic.receive.data(packet = MeshPacket dictionary) """ + # A fragment waits for the rest of its message, which is then handled as one packet + if meshPacket.HasField("decoded") and fragment.field_of(meshPacket) is not None: + whole = self.fragments.add(meshPacket) + if whole is None: + return + meshPacket = whole asDict = message_to_dict(meshPacket) # We normally decompose the payload into a dictionary so that the client diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index 77a84908a..d3c35fad3 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -797,6 +797,17 @@ class HeaderOptions(_message.Message): hold no state. Each fragment is an ordinary packet, so want_ack and ReliableRouter already provide per-fragment retransmission - there is no separate ARQ. msg_id is a per-sender counter and wraps after 256 fragmented messages. + + Packed as msg_id << 6 | index << 3 | total. total == 0 or index > total is invalid + and the fragment is dropped. Every fragment carries the message's portnum and a slice + of its payload; fragment 0 also carries request_id, reply_id, emoji and want_response. + A receiver keys a message on (from, portnum, msg_id) and joins the slices in index + order. A message to be kept by store and forward sets HOP_STORE on every fragment. + + Fragmentation is opt-in per portnum, and the port's owner splits and joins: the node + for STORE_FORWARD_APP (2 fragments), the client for ATAK_FORWARDER (4) and + LORAWAN_BRIDGE (2). A node passes a client-owned port's fragments to its client as they + arrive and refuses a client fragment on any other port. """ hop_flags: _builtins.int """ diff --git a/meshtastic/tests/test_fragment.py b/meshtastic/tests/test_fragment.py new file mode 100644 index 000000000..f4b8d55fb --- /dev/null +++ b/meshtastic/tests/test_fragment.py @@ -0,0 +1,123 @@ +"""Per-portnum fragmentation: the field codec, splitting a client-owned port, joining what arrives.""" + +from unittest.mock import MagicMock + +import pytest + +from meshtastic import fragment +from meshtastic.mesh_interface import MeshInterface +from meshtastic.protobuf import packet_pb2, portnums_pb2, wire_pb2 + +ATAK = portnums_pb2.PortNum.ATAK_FORWARDER + + +@pytest.mark.unit +def test_field_packs_msg_id_index_total(): + """msg_id << 6 | index << 3 | total, the order SCHEMA.md and firmware use.""" + assert fragment.pack(0xAB, 2, 3) == (0xAB << 6) | (2 << 3) | 3 + assert fragment.unpack(fragment.pack(0xAB, 2, 3)) == (0xAB, 2, 3) + + +@pytest.mark.unit +def test_field_rejects_what_no_sender_produces(): + assert fragment.unpack(fragment.pack(1, 0, 0)) is None # one fragment is no fragmented message + assert fragment.unpack(fragment.pack(1, 3, 2)) is None # index above total + assert fragment.unpack(1 << 14) is None # wider than the 14-bit field + + +def _fragment(sender, msg_id, index, total, payload, port=ATAK): + p = packet_pb2.MeshPacket() + setattr(p, "from", sender) + p.decoded.portnum = port + p.decoded.payload = payload + p.header_options = wire_pb2.HeaderOptions(fragment=fragment.pack(msg_id, index, total)).SerializeToString() + return p + + +@pytest.mark.unit +def test_reassembler_joins_out_of_order_and_keeps_fragment_0_fields(): + r = fragment.Reassembler() + first = _fragment(7, 5, 0, 2, b"aa") + first.decoded.reply_id = 99 + assert r.add(_fragment(7, 5, 2, 2, b"cc")) is None + assert r.add(first) is None + whole = r.add(_fragment(7, 5, 1, 2, b"bb")) + assert whole.decoded.payload == b"aabbcc" + assert whole.decoded.reply_id == 99 + assert not whole.header_options + + +@pytest.mark.unit +def test_reassembler_keys_on_sender_port_and_msg_id_and_times_out(): + r = fragment.Reassembler(timeout_s=10) + assert r.add(_fragment(7, 5, 0, 1, b"a"), now=0) is None + assert r.add(_fragment(8, 5, 1, 1, b"b"), now=1) is None # another sender's message + assert r.add(_fragment(7, 5, 1, 1, b"b", port=portnums_pb2.PortNum.LORAWAN_BRIDGE), now=1) is None + assert r.add(_fragment(7, 5, 1, 1, b"b"), now=20) is None # the first half timed out + assert r.add(_fragment(7, 5, 0, 1, b"a"), now=21).decoded.payload == b"ab" + + +@pytest.mark.unit +def test_reassembler_drops_a_message_whose_total_changes(): + r = fragment.Reassembler() + assert r.add(_fragment(7, 5, 0, 1, b"a")) is None + assert r.add(_fragment(7, 5, 1, 2, b"b")) is None + assert r.add(_fragment(7, 5, 2, 2, b"c")) is None + + +def _capture(iface): + sent = [] + + def fakeSend(meshPacket, destinationId, **kwargs): + sent.append(meshPacket) + return meshPacket + + iface._sendPacket = MagicMock(side_effect=fakeSend) + return sent + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_send_splits_a_client_owned_port_and_answers_once(): + iface = MeshInterface(noProto=True) + sent = _capture(iface) + responses = [] + data = bytes(range(256)) * 2 # 512 bytes: four broadcast fragments + iface.sendData(data, portNum=ATAK, wantAck=True, onResponse=responses.append) + assert len(sent) == 4 + fields = [fragment.field_of(p) for p in sent] + assert [f[1] for f in fields] == [0, 1, 2, 3] and {f[2] for f in fields} == {3} and len({f[0] for f in fields}) == 1 + assert b"".join(p.decoded.payload for p in sent) == data + + for p in sent[:3]: + iface.responseHandlers.pop(p.id).callback({"decoded": {"requestId": p.id, "routing": {"errorReason": "NONE"}}}) + assert responses == [] + iface.responseHandlers.pop(sent[3].id).callback({"decoded": {"requestId": sent[3].id, "routing": {"errorReason": "NONE"}}}) + assert len(responses) == 1 + iface.close() + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_send_refuses_more_fragments_than_the_port_allows_and_leaves_other_ports_alone(): + iface = MeshInterface(noProto=True) + sent = _capture(iface) + with pytest.raises(MeshInterface.MeshInterfaceError): + iface.sendData(bytes(900), portNum=ATAK) + assert sent == [] + iface.sendData(bytes(200), portNum=portnums_pb2.PortNum.PRIVATE_APP) + assert len(sent) == 1 and not sent[0].header_options + iface.close() + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_received_fragments_publish_one_whole_packet(monkeypatch): + iface = MeshInterface(noProto=True) + published = [] + monkeypatch.setattr("meshtastic.mesh_interface.publishingThread.queueWork", published.append) + iface._handlePacketFromRadio(_fragment(7, 9, 1, 1, b"world"), hack=True) + assert published == [] + iface._handlePacketFromRadio(_fragment(7, 9, 0, 1, b"hello "), hack=True) + assert len(published) == 1 + iface.close() diff --git a/protobufs b/protobufs index b8bd0cf1a..3b3fbf3f3 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit b8bd0cf1a4da749cf1e11f58b807419d419349ce +Subproject commit 3b3fbf3f32e77b821cf06f768164c2532fe1f89f From 935e74735085f590f8f77fbcad837c69bf91c439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Wed, 7 Oct 2026 08:57:16 +0200 Subject: [PATCH 20/24] Compute scope codes, canonicalize region names and decode the options block util.scope_code and util.canonical_region_name; --set relay.home_region and relay.regions fold names to lowercase and refuse invalid ones; received packets carry headerOptions as fields (hopFlags, scopeCode, ...). --- meshtastic/__main__.py | 8 +++++ meshtastic/mesh_interface.py | 8 +++++ meshtastic/protobuf/channel_pb2.pyi | 10 +++--- meshtastic/protobuf/config_pb2.py | 18 +++++----- meshtastic/protobuf/config_pb2.pyi | 26 ++++++++++---- meshtastic/protobuf/wire_pb2.pyi | 5 +-- meshtastic/tests/test_scope.py | 54 +++++++++++++++++++++++++++++ meshtastic/util.py | 22 ++++++++++++ protobufs | 2 +- 9 files changed, 130 insertions(+), 23 deletions(-) create mode 100644 meshtastic/tests/test_scope.py diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 9eb547649..509b17675 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -271,6 +271,14 @@ def setPref(config, comp_name, raw_val) -> bool: # pylint: disable=R0911 print("Warning: network.wifi_psk must be 8 or more characters.") return False + # The node folds region names to lowercase and refuses the rest: say so before writing + if config_type.name == "relay" and snake_name in ("home_region", "regions"): + try: + val = meshtastic.util.canonical_region_name(str(raw_val), allow_empty=snake_name == "home_region") + except ValueError as e: + print(f"ERROR: {e}") + return False + # Handle uint32 bitfields that have an associated enum of flag names. bitfield_enum = None if config_type.message_type is not None: diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 242d453f4..d77276285 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -1588,6 +1588,14 @@ def _handlePacketFromRadio(self, meshPacket, hack=False): return meshPacket = whole asDict = message_to_dict(meshPacket) + if meshPacket.header_options: + # The options block as fields (hopFlags, scopeCode, ...); the raw bytes stay in "raw" + opts = wire_pb2.HeaderOptions() + try: + opts.ParseFromString(meshPacket.header_options) + asDict["headerOptions"] = message_to_dict(opts) + except Exception: # pylint: disable=W0703 + asDict["headerOptions"] = meshPacket.header_options.hex() # We normally decompose the payload into a dictionary so that the client # doesn't need to understand protobufs. But advanced clients might diff --git a/meshtastic/protobuf/channel_pb2.pyi b/meshtastic/protobuf/channel_pb2.pyi index ea2c50855..bdde6ccc6 100644 --- a/meshtastic/protobuf/channel_pb2.pyi +++ b/meshtastic/protobuf/channel_pb2.pyi @@ -72,11 +72,11 @@ class ChannelSettings(_message.Message): that cap. It is a sender-side rule: a relay cannot read it, and enforces reach with RelayConfig instead. - | scope | launch hop_start | CHANNEL_UPLINK | congestion control may raise | - |----------|------------------|----------------|------------------------------| - | LOCAL | 1 | refused | no | - | REGIONAL | region default | refused | yes, to the region maximum | - | GLOBAL | 15 | allowed | yes | + | scope | launch hop_start | CHANNEL_UPLINK | congestion control may raise | scope_code | + |----------|------------------|----------------|------------------------------|------------| + | LOCAL | 1 | refused | no | no | + | REGIONAL | region default | refused | yes, to the region maximum | home_region | + | GLOBAL | 15 | allowed | yes | no | A direct message launches with the sender's primary-channel scope unless the client sets hop_start itself; after the first flood it steers by next_hop, so the same diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index 69a8f2c77..74845aae5 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbd\x19\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x96\x01\n\x18node_info_broadcast_secs\x18\x05 \x01(\rBt\xca\xf3\x18p*\x01s:\x1cNode Info Broadcast IntervalBMHow often node information is sent. Defaults to 10800 seconds, at least 3600.\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x05tzdef\x18\x07 \x01(\tB6\x92?\x02\x08\x41\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12S\n\x0b\x62uzzer_mode\x18\x08 \x01(\x0e\x32,.meshtastic.protobuf.DeviceConfig.BuzzerModeB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.7.0\x12\x17\n\x0f\x64iscovery_flags\x18\t \x01(\r\x12 \n\x18\x64iscovery_node_threshold\x18\n \x01(\r\x12\x14\n\x0ctaper_factor\x18\x0b \x01(\r\x12\x1a\n\x12\x66ull_announce_secs\x18\x0c \x01(\r\x12\x41\n\x16\x61uto_mute_router_count\x18\r \x01(\rB!\x92?\x02\x38\x08\xca\xf3\x18\x18:\x16\x41uto-mute Router Count\x12;\n\x11\x61uto_mute_min_snr\x18\x0e \x01(\x11\x42 \x92?\x02\x38\x08\xca\xf3\x18\x17:\x15\x41uto-mute Minimum SNR\x12\x35\n\x15\x61uto_mute_window_secs\x18\x0f \x01(\rB\x16\xca\xf3\x18\x12:\x10\x41uto-mute Window\"\xd7\x06\n\x0fRebroadcastMode\x12\x8a\x01\n\x03\x41LL\x10\x00\x1a\x80\x01\xca\xf3\x18|:\x03\x41llBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.\x12?\n\x11\x41LL_SKIP_DECODING\x10\x01\x1a(\xca\xf3\x18$:\x11\x41ll Skip DecodingB\x0fTreated as ALL.\x12\xcd\x01\n\nLOCAL_ONLY\x10\x02\x1a\xbc\x01\xca\xf3\x18\xb7\x01:\nLocal OnlyB\xa8\x01Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.\x12\xc8\x01\n\nKNOWN_ONLY\x10\x03\x1a\xb7\x01\xca\xf3\x18\xb2\x01:\nKnown OnlyB\xa3\x01Ignores 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.\x12\x43\n\x04NONE\x10\x04\x1a\x39\xca\xf3\x18\x35:\x04NoneB-Never rebroadcast. Not available on a router.\x12\x95\x01\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a}\xca\xf3\x18y:\x12\x43ore Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.\"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\"\xc8\t\n\x05\x46lags\x12\x0f\n\x0b\x44\x45VICE_NONE\x10\x00\x12\x87\x01\n!DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS\x10\x01\x1a`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12l\n\x1b\x44\x45VICE_DISABLE_TRIPLE_CLICK\x10\x02\x1aK\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12\xcf\x01\n\x1d\x44\x45VICE_LED_HEARTBEAT_DISABLED\x10\x04\x1a\xab\x01\xca\xf3\x18\xa6\x01:\rLED HeartbeatB\x94\x01\x43ontrols the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.\x12\xb1\x01\n\x19\x44\x45VICE_AUTO_MUTE_DISABLED\x10\x08\x1a\x91\x01\xca\xf3\x18\x8c\x01:\x18\x44isable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.\x12\x91\x01\n\x11\x44\x45VICE_RELAY_LATE\x10\x10\x1az\xca\xf3\x18v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.\x12\xa7\x01\n\x16\x44\x45VICE_RELAY_FAVORITES\x10 \x1a\x8a\x01\xca\xf3\x18\x85\x01:\x0fRelay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.\x12i\n\x0c\x44\x45VICE_QUIET\x10@\x1aW\xca\xf3\x18S:\x05QuietBJClient: send nothing on a schedule, only answer and send what you ask for.\x12\x86\x01\n\x15\x44\x45VICE_LOST_AND_FOUND\x10\x80\x01\x1aj\xca\xf3\x18\x66:\x0eLost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.\"Q\n\x0e\x44iscoveryFlags\x12\x12\n\x0e\x44ISCOVERY_NONE\x10\x00\x12\x13\n\x0f\x44ISCOVERY_SERVE\x10\x01\x12\x16\n\x12\x44ISCOVERY_NO_TAPER\x10\x02\"\xaf\r\n\x0ePositionConfig\x12y\n\x17position_broadcast_secs\x18\x01 \x01(\rBX\xca\xf3\x18T*\x01s:\x12\x42roadcast IntervalB;The longest a node will go without broadcasting a position.\x12>\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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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.@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\x9b\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbd\x19\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x96\x01\n\x18node_info_broadcast_secs\x18\x05 \x01(\rBt\xca\xf3\x18p*\x01s:\x1cNode Info Broadcast IntervalBMHow often node information is sent. Defaults to 10800 seconds, at least 3600.\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x05tzdef\x18\x07 \x01(\tB6\x92?\x02\x08\x41\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12S\n\x0b\x62uzzer_mode\x18\x08 \x01(\x0e\x32,.meshtastic.protobuf.DeviceConfig.BuzzerModeB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.7.0\x12\x17\n\x0f\x64iscovery_flags\x18\t \x01(\r\x12 \n\x18\x64iscovery_node_threshold\x18\n \x01(\r\x12\x14\n\x0ctaper_factor\x18\x0b \x01(\r\x12\x1a\n\x12\x66ull_announce_secs\x18\x0c \x01(\r\x12\x41\n\x16\x61uto_mute_router_count\x18\r \x01(\rB!\x92?\x02\x38\x08\xca\xf3\x18\x18:\x16\x41uto-mute Router Count\x12;\n\x11\x61uto_mute_min_snr\x18\x0e \x01(\x11\x42 \x92?\x02\x38\x08\xca\xf3\x18\x17:\x15\x41uto-mute Minimum SNR\x12\x35\n\x15\x61uto_mute_window_secs\x18\x0f \x01(\rB\x16\xca\xf3\x18\x12:\x10\x41uto-mute Window\"\xd7\x06\n\x0fRebroadcastMode\x12\x8a\x01\n\x03\x41LL\x10\x00\x1a\x80\x01\xca\xf3\x18|:\x03\x41llBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.\x12?\n\x11\x41LL_SKIP_DECODING\x10\x01\x1a(\xca\xf3\x18$:\x11\x41ll Skip DecodingB\x0fTreated as ALL.\x12\xcd\x01\n\nLOCAL_ONLY\x10\x02\x1a\xbc\x01\xca\xf3\x18\xb7\x01:\nLocal OnlyB\xa8\x01Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.\x12\xc8\x01\n\nKNOWN_ONLY\x10\x03\x1a\xb7\x01\xca\xf3\x18\xb2\x01:\nKnown OnlyB\xa3\x01Ignores 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.\x12\x43\n\x04NONE\x10\x04\x1a\x39\xca\xf3\x18\x35:\x04NoneB-Never rebroadcast. Not available on a router.\x12\x95\x01\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a}\xca\xf3\x18y:\x12\x43ore Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.\"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\"\xc8\t\n\x05\x46lags\x12\x0f\n\x0b\x44\x45VICE_NONE\x10\x00\x12\x87\x01\n!DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS\x10\x01\x1a`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12l\n\x1b\x44\x45VICE_DISABLE_TRIPLE_CLICK\x10\x02\x1aK\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12\xcf\x01\n\x1d\x44\x45VICE_LED_HEARTBEAT_DISABLED\x10\x04\x1a\xab\x01\xca\xf3\x18\xa6\x01:\rLED HeartbeatB\x94\x01\x43ontrols the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.\x12\xb1\x01\n\x19\x44\x45VICE_AUTO_MUTE_DISABLED\x10\x08\x1a\x91\x01\xca\xf3\x18\x8c\x01:\x18\x44isable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.\x12\x91\x01\n\x11\x44\x45VICE_RELAY_LATE\x10\x10\x1az\xca\xf3\x18v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.\x12\xa7\x01\n\x16\x44\x45VICE_RELAY_FAVORITES\x10 \x1a\x8a\x01\xca\xf3\x18\x85\x01:\x0fRelay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.\x12i\n\x0c\x44\x45VICE_QUIET\x10@\x1aW\xca\xf3\x18S:\x05QuietBJClient: send nothing on a schedule, only answer and send what you ask for.\x12\x86\x01\n\x15\x44\x45VICE_LOST_AND_FOUND\x10\x80\x01\x1aj\xca\xf3\x18\x66:\x0eLost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.\"Q\n\x0e\x44iscoveryFlags\x12\x12\n\x0e\x44ISCOVERY_NONE\x10\x00\x12\x13\n\x0f\x44ISCOVERY_SERVE\x10\x01\x12\x16\n\x12\x44ISCOVERY_NO_TAPER\x10\x02\"\xaf\r\n\x0ePositionConfig\x12y\n\x17position_broadcast_secs\x18\x01 \x01(\rBX\xca\xf3\x18T*\x01s:\x12\x42roadcast IntervalB;The longest a node will go without broadcasting a position.\x12>\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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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.@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\xb7\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x1a\n\x0bhome_region\x18\x05 \x01(\tB\x05\x92?\x02\x08\x10\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -313,6 +313,8 @@ _globals['_RELAYCONFIG'].fields_by_name['rules']._serialized_options = b'\222?\002\020\020' _globals['_RELAYCONFIG'].fields_by_name['regions']._options = None _globals['_RELAYCONFIG'].fields_by_name['regions']._serialized_options = b'\222?\004\010\020\020\004' + _globals['_RELAYCONFIG'].fields_by_name['home_region']._options = None + _globals['_RELAYCONFIG'].fields_by_name['home_region']._serialized_options = b'\222?\002\010\020' _globals['_DEVICECONFIG']._serialized_start=168 _globals['_DEVICECONFIG']._serialized_end=3429 _globals['_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1157 @@ -376,11 +378,11 @@ _globals['_GROUPCONFIG_GROUP']._serialized_start=13514 _globals['_GROUPCONFIG_GROUP']._serialized_end=13593 _globals['_RELAYCONFIG']._serialized_start=13596 - _globals['_RELAYCONFIG']._serialized_end=14007 - _globals['_RELAYCONFIG_RULE']._serialized_start=13831 - _globals['_RELAYCONFIG_RULE']._serialized_end=13947 - _globals['_RELAYCONFIG_ACTION']._serialized_start=13949 - _globals['_RELAYCONFIG_ACTION']._serialized_end=14007 - _globals['_CONFIGPAYLOAD']._serialized_start=14010 - _globals['_CONFIGPAYLOAD']._serialized_end=14643 + _globals['_RELAYCONFIG']._serialized_end=14035 + _globals['_RELAYCONFIG_RULE']._serialized_start=13859 + _globals['_RELAYCONFIG_RULE']._serialized_end=13975 + _globals['_RELAYCONFIG_ACTION']._serialized_start=13977 + _globals['_RELAYCONFIG_ACTION']._serialized_end=14035 + _globals['_CONFIGPAYLOAD']._serialized_start=14038 + _globals['_CONFIGPAYLOAD']._serialized_end=14671 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index 3f3b29064..1697990e1 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -1787,12 +1787,17 @@ class RelayConfig(_message.Message): """ Relay Policy - How this node relays broadcast traffic, per channel hash. Evaluated on a ROUTER only; - every other role ignores it. Keyed by the + How this node relays broadcast traffic, per channel hash, and which region its own + broadcasts claim. rules, default_action, regions and scope_miss_action act on a ROUTER + only; home_region acts on every role. Rules are keyed by the header's one-byte `chan`, so a rule covers every channel that hashes to that byte, held or not - which is what lets an operator cap a channel whose key the node does not have. + A region name is 1 to 15 bytes of a-z, 0-9 and '-'. A node folds A-Z to lowercase and + refuses any other name, because the scope key hashes the exact bytes. A relay config + write takes effect without a reboot. + Default is no rules and RELAY_FORWARD, so a node relays as it did until an operator opts in. A RELAY_DROP on the primary hash partitions a mesh, so rules are admin-only and firmware logs every drop with the hash that caused it. @@ -1867,14 +1872,20 @@ class RelayConfig(_message.Message): DEFAULT_ACTION_FIELD_NUMBER: _builtins.int REGIONS_FIELD_NUMBER: _builtins.int SCOPE_MISS_ACTION_FIELD_NUMBER: _builtins.int + HOME_REGION_FIELD_NUMBER: _builtins.int default_action: Global___RelayConfig.Action.ValueType """ What to do with a broadcast that matches no rule. """ scope_miss_action: Global___RelayConfig.Action.ValueType """ - What to do with a broadcast whose scope_code matches none of `regions`. Only - consulted when `regions` is non-empty and the frame carries a scope_code. + What to do with a broadcast whose scope_code matches neither home_region nor + `regions`. Only consulted when one of them is set and the frame carries a scope_code. + """ + home_region: _builtins.str + """ + Region this node's own broadcasts on REGIONAL channels claim in + HeaderOptions.scope_code. Any role. Empty, the default, sends no code. """ @_builtins.property def rules(self) -> _containers.RepeatedCompositeFieldContainer[Global___RelayConfig.Rule]: @@ -1885,8 +1896,8 @@ class RelayConfig(_message.Message): @_builtins.property def regions(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: """ - Region names this relay verifies HeaderOptions.scope_code against. Empty means the - field is ignored. + Region names this relay accepts in HeaderOptions.scope_code, in addition to + home_region. With both empty the field is ignored. """ def __init__( @@ -1896,10 +1907,11 @@ class RelayConfig(_message.Message): default_action: Global___RelayConfig.Action.ValueType = ..., regions: _abc.Iterable[_builtins.str] | None = ..., scope_miss_action: Global___RelayConfig.Action.ValueType = ..., + home_region: _builtins.str = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["default_action", b"default_action", "regions", b"regions", "rules", b"rules", "scope_miss_action", b"scope_miss_action"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["default_action", b"default_action", "home_region", b"home_region", "regions", b"regions", "rules", b"rules", "scope_miss_action", b"scope_miss_action"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index d3c35fad3..aac7bf2ea 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -831,8 +831,9 @@ class HeaderOptions(_message.Message): foreign traffic off its own infrastructure and for no other purpose. A node that wants proof of anything uses the AEAD tag or an XEdDSA signature. - Region traffic still carries a channel (BCAST) or a destination (UCAST): this - filters, it does not address. + The originator sets it on a BCAST frame of a REGIONAL channel from + RelayConfig.home_region, after the name is folded to lowercase. A relay ignores it on + UCAST. Region traffic still carries a channel: this filters, it does not address. """ anycast_reply: _builtins.int """ diff --git a/meshtastic/tests/test_scope.py b/meshtastic/tests/test_scope.py new file mode 100644 index 000000000..4b39d9fce --- /dev/null +++ b/meshtastic/tests/test_scope.py @@ -0,0 +1,54 @@ +"""Scope codes: the code a node with a home region puts on its broadcasts, region name rules, and the decoded +options block on received packets.""" + +import pytest + +from meshtastic import util +from meshtastic.__main__ import setPref +from meshtastic.mesh_interface import MeshInterface +from meshtastic.protobuf import localonly_pb2, packet_pb2, portnums_pb2, wire_pb2 + + +@pytest.mark.unit +def test_scope_code_matches_the_worked_example(): + """SCHEMA.md section 8, pinned by firmware test_relay_policy and test_packet_signing too.""" + assert util.scope_code("eu-west", 0x5A, 0x12345678, 0xCAFEBABE) == 0xEB96 + assert util.scope_code("EU-West", 0x5A, 0x12345678, 0xCAFEBABE) == 0x9377 # why names are canonical + + +@pytest.mark.unit +def test_region_names_fold_to_lowercase_and_refuse_the_rest(): + assert util.canonical_region_name("EU-West") == "eu-west" + assert util.canonical_region_name("", allow_empty=True) == "" + for bad in ("eu west", "münchen", "eu_west", "a" * 16, ""): + with pytest.raises(ValueError): + util.canonical_region_name(bad) + + +@pytest.mark.unit +def test_set_relay_region_names_canonicalizes_before_writing(): + config = localonly_pb2.LocalConfig() + assert setPref(config, "relay.home_region", "EU-West") + assert config.relay.home_region == "eu-west" + assert setPref(config, "relay.regions", "Alps") + assert list(config.relay.regions) == ["alps"] + assert not setPref(config, "relay.home_region", "eu west") + assert config.relay.home_region == "eu-west" + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_received_packet_carries_the_decoded_options_block(monkeypatch): + iface = MeshInterface(noProto=True) + published = [] + monkeypatch.setattr("meshtastic.mesh_interface.publishingThread.queueWork", lambda work: work()) + monkeypatch.setattr("meshtastic.mesh_interface.pub.sendMessage", lambda topic, **kw: published.append(kw["packet"])) + p = packet_pb2.MeshPacket() + setattr(p, "from", 0x12345678) + p.to = 0xFFFFFFFF + p.id = 0xCAFEBABE + p.decoded.portnum = portnums_pb2.PortNum.PRIVATE_APP + p.header_options = wire_pb2.HeaderOptions(scope_code=0xEB96).SerializeToString() + iface._handlePacketFromRadio(p, hack=True) + assert published[0]["headerOptions"]["scopeCode"] == 0xEB96 + iface.close() diff --git a/meshtastic/util.py b/meshtastic/util.py index 81696bf43..bdf2382eb 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -2,11 +2,14 @@ """ import base64 import functools +import hashlib +import hmac import json import logging import os import platform import re +import struct import subprocess import sys import threading @@ -378,6 +381,25 @@ def channel_hash(data: bytes) -> int: result ^= char return result + +def canonical_region_name(name: str, allow_empty: bool = False) -> str: + """A scope region name as a node stores it: A-Z folded to lowercase, then 1 to 15 + characters of a-z, 0-9 and '-'. The scope key hashes the exact bytes, so EU-West and + eu-west would otherwise be two regions that never match.""" + folded = name.lower() + if (not folded and not allow_empty) or len(folded) > 15 or not re.fullmatch(r"[a-z0-9-]*", folded): + raise ValueError(f"region name {name!r} must be 1 to 15 characters of a-z, 0-9 and '-'") + return folded + + +def scope_code(region: str, chan: int, from_node: int, packet_id: int) -> int: + """HeaderOptions.scope_code of a broadcast on channel hash `chan` from a node whose + home region is `region` (SCHEMA.md section 8, Channel scope).""" + key = hashlib.sha256(b"%" + region.encode("utf-8")).digest()[:16] + msg = bytes([chan & 0xFF]) + struct.pack(" Dict[int, str]: path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "protobuf", "modem_presets.json") diff --git a/protobufs b/protobufs index 3b3fbf3f3..194bfce3e 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 3b3fbf3f32e77b821cf06f768164c2532fe1f89f +Subproject commit 194bfce3e21528bd7b64eebe276939684f7b5328 From cce88a02edeb81d13680b855058bd8e901880eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Wed, 7 Oct 2026 13:38:44 +0200 Subject: [PATCH 21/24] Regenerate for forward secrecy and show which nodes publish a ratchet key security.ratchet_enabled, security.require_ratchet_when_known and security.ratchet_interval_secs set by name. showNodes gains a Ratchet column from NodeInfo.flags. --- meshtastic/mesh_interface.py | 6 +- meshtastic/protobuf/bitfields.py | 9 ++- meshtastic/protobuf/common_pb2.py | 38 +++++----- meshtastic/protobuf/common_pb2.pyi | 18 +++++ meshtastic/protobuf/config_pb2.py | 50 +++++++------ meshtastic/protobuf/config_pb2.pyi | 16 +++-- meshtastic/protobuf/deviceonly_pb2.py | 40 +++++++---- meshtastic/protobuf/deviceonly_pb2.pyi | 99 ++++++++++++++++++++++++++ meshtastic/protobuf/wire_pb2.py | 70 +++++++++--------- meshtastic/protobuf/wire_pb2.pyi | 26 +++++-- meshtastic/tests/test_ratchet.py | 35 +++++++++ meshtastic/tests/test_util.py | 7 +- protobufs | 2 +- 13 files changed, 305 insertions(+), 111 deletions(-) create mode 100644 meshtastic/tests/test_ratchet.py diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index d77276285..6251ec3cf 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -255,6 +255,7 @@ def get_human_readable(name): "lastHeard": "LastHeard", "since": "Since", "isFavorite": "Fav", + "hasRatchet": "Ratchet", } @@ -302,7 +303,8 @@ def getNestedValue(node_dict: Dict[str, Any], key_path: str) -> Any: showFields = ["N", "user.longName", "user.id", "user.shortName", "user.hwModel", "user.publicKey", "user.role", "position.latitude", "position.longitude", "position.altitude", "deviceMetrics.batteryLevel", "deviceMetrics.channelUtilization", - "deviceMetrics.airUtilTx", "snr", "hopsAway", "channel", "isFavorite", "lastHeard", "since"] + "deviceMetrics.airUtilTx", "snr", "hopsAway", "channel", "isFavorite", "hasRatchet", "lastHeard", + "since"] else: # Always at least include the row number. showFields.insert(0, "N") @@ -344,7 +346,7 @@ def getNestedValue(node_dict: Dict[str, Any], key_path: str) -> Any: formatted_value = "Powered" else: formatted_value = formatFloat(raw_value, 0, "%") - elif field == "isFavorite": + elif field in ("isFavorite", "hasRatchet"): formatted_value = "*" if raw_value else "" elif field == "lastHeard": formatted_value = getLH(raw_value) diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py index 8d946822a..5c25285ba 100644 --- a/meshtastic/protobuf/bitfields.py +++ b/meshtastic/protobuf/bitfields.py @@ -40,6 +40,7 @@ 'has_bluetooth': ('capabilities', 4), 'has_ethernet': ('capabilities', 8), 'has_pkc': ('capabilities', 32), + 'has_ratchet': ('capabilities', 128), 'has_remote_hardware': ('capabilities', 16), 'has_wifi': ('capabilities', 2), 'has_xeddsa': ('capabilities', 64), @@ -113,6 +114,7 @@ 'position': ('flags', 2), 'telemetry': ('flags', 4)}, 'NodeInfo': {'has_is_unmessagable': ('flags', 256), + 'has_ratchet': ('flags', 134217728), 'has_rf_hear': ('flags', 2048), 'has_snr': ('flags', 1024), 'has_user': ('flags', 32), @@ -128,6 +130,7 @@ 'relays_favorites': ('flags', 33554432), 'via_mqtt': ('flags', 4)}, 'NodeInfoLite': {'has_is_unmessagable': ('bitfield', 256), + 'has_ratchet': ('bitfield', 134217728), 'has_rf_hear': ('bitfield', 2048), 'has_snr': ('bitfield', 1024), 'has_user': ('bitfield', 32), @@ -143,6 +146,7 @@ 'relays_favorites': ('bitfield', 33554432), 'via_mqtt': ('bitfield', 4)}, 'NodeRecord': {'has_is_unmessagable': ('flags', 256), + 'has_ratchet': ('flags', 134217728), 'has_rf_hear': ('flags', 2048), 'has_snr': ('flags', 1024), 'has_user': ('flags', 32), @@ -186,9 +190,9 @@ 'speed': ('position_flags', 512)}, 'RolePreset': {'tak_enabled': ('tak_flags', 1)}, 'SecurityConfig': {'debug_log_api_enabled': ('flags', 4), - 'enabled': ('ratchet_flags', 1), 'is_managed': ('flags', 1), - 'require_when_known': ('ratchet_flags', 2), + 'ratchet_enabled': ('ratchet_flags', 1), + 'require_ratchet_when_known': ('ratchet_flags', 2), 'serial_enabled': ('flags', 2)}, 'SerialConfig': {'echo': ('flags', 2), 'enabled': ('flags', 1), @@ -217,6 +221,7 @@ 'power_measurement': ('flags', 32), 'power_screen': ('flags', 64)}, 'User': {'has_is_unmessagable': ('flags', 256), + 'has_ratchet': ('flags', 134217728), 'has_rf_hear': ('flags', 2048), 'has_snr': ('flags', 1024), 'has_user': ('flags', 32), diff --git a/meshtastic/protobuf/common_pb2.py b/meshtastic/protobuf/common_pb2.py index 2cdcc4e84..3d42d9df8 100644 --- a/meshtastic/protobuf/common_pb2.py +++ b/meshtastic/protobuf/common_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/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xce\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\xeb\x01\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@*\xf8\x02\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\x96\x01\n\x06ROUTER\x10\x01\x1a\x89\x01\xca\xf3\x18\x84\x01:\x06RouterBzInfrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage.\x12H\n\x07TRACKER\x10\x02\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x03\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.*\xbc\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12(\n\rREGION_MY_433\x10\x0e\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x10\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x11\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x14\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x15\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x17\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x18\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x19\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1b\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1e\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10\x1f\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10 \x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10#\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\xe5\x03\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08\x12!\n\x1aNODE_FLAG_RELAYS_FAVORITES\x10\x80\x80\x80\x10\x12\x1f\n\x18NODE_FLAG_LOST_AND_FOUND\x10\x80\x80\x80 *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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/common.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xeb\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\x1b\n\x0c\x63\x61pabilities\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12.\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x16\n\x0eposition_flags\x18\x05 \x01(\r\x12\x10\n\x08hw_model\x18\x06 \x01(\r\x12\x18\n\x10\x65xcluded_modules\x18\x07 \x01(\r\"\x88\x02\n\x0c\x43\x61pabilities\x12\x13\n\x0f\x43\x41PABILITY_NONE\x10\x00\x12\x1b\n\x17\x43\x41PABILITY_CAN_SHUTDOWN\x10\x01\x12\x17\n\x13\x43\x41PABILITY_HAS_WIFI\x10\x02\x12\x1c\n\x18\x43\x41PABILITY_HAS_BLUETOOTH\x10\x04\x12\x1b\n\x17\x43\x41PABILITY_HAS_ETHERNET\x10\x08\x12\"\n\x1e\x43\x41PABILITY_HAS_REMOTE_HARDWARE\x10\x10\x12\x16\n\x12\x43\x41PABILITY_HAS_PKC\x10 \x12\x19\n\x15\x43\x41PABILITY_HAS_XEDDSA\x10@\x12\x1b\n\x16\x43\x41PABILITY_HAS_RATCHET\x10\x80\x01*\xf8\x02\n\x04Role\x12H\n\x06\x43LIENT\x10\x00\x1a<\xca\xf3\x18\x38:\x06\x43lientB.App connected or stand alone messaging device.\x12\x96\x01\n\x06ROUTER\x10\x01\x1a\x89\x01\xca\xf3\x18\x84\x01:\x06RouterBzInfrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage.\x12H\n\x07TRACKER\x10\x02\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x03\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.*\xbc\x0c\n\nRegionCode\x12+\n\x0cREGION_UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\"\n\tREGION_US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12.\n\rREGION_EU_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12.\n\rREGION_EU_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x1a\n\tREGION_CN\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x1a\n\tREGION_JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12-\n\nREGION_ANZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x1a\n\tREGION_KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x1b\n\tREGION_TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x1b\n\tREGION_RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x1a\n\tREGION_IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12+\n\rREGION_NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x1d\n\tREGION_TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12!\n\x0eREGION_LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12(\n\rREGION_MY_433\x10\x0e\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12(\n\rREGION_MY_919\x10\x0f\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12)\n\rREGION_SG_923\x10\x10\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12+\n\rREGION_PH_433\x10\x11\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12+\n\rREGION_PH_868\x10\x12\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12+\n\rREGION_PH_915\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x38\n\x0eREGION_ANZ_433\x10\x14\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12*\n\rREGION_KZ_433\x10\x15\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12*\n\rREGION_KZ_863\x10\x16\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12%\n\rREGION_NP_865\x10\x17\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12&\n\rREGION_BR_902\x10\x18\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12\x33\n\x0eREGION_ITU1_2M\x10\x19\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12\x33\n\x0eREGION_ITU2_2M\x10\x1a\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12.\n\rREGION_EU_866\x10\x1b\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12.\n\rREGION_EU_874\x10\x1c\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12.\n\rREGION_EU_917\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x39\n\x0fREGION_EU_N_868\x10\x1e\x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12\x33\n\x0eREGION_ITU3_2M\x10\x1f\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x37\n\x10REGION_ITU1_70CM\x10 \x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x37\n\x10REGION_ITU2_70CM\x10!\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x37\n\x10REGION_ITU3_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x39\n\x11REGION_ITU2_125CM\x10#\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m*\xf0\x04\n\x10InputBrokerEvent\x12\x1a\n\nINPUT_NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x1e\n\x0cINPUT_SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x15\n\x11INPUT_SELECT_LONG\x10\x0b\x12\x11\n\rINPUT_UP_LONG\x10\x0c\x12\x13\n\x0fINPUT_DOWN_LONG\x10\r\x12\x16\n\x08INPUT_UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x1a\n\nINPUT_DOWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x1a\n\nINPUT_LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x1c\n\x0bINPUT_RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x1e\n\x0cINPUT_CANCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x12\x1a\n\nINPUT_BACK\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x14\n\x10INPUT_USER_PRESS\x10\x1c\x12\x13\n\x0fINPUT_ALT_PRESS\x10\x1d\x12\x12\n\x0eINPUT_ALT_LONG\x10\x1e\x12\x18\n\x13INPUT_FACTORY_RESET\x10\x9a\x01\x12\x13\n\x0eINPUT_SHUTDOWN\x10\x9b\x01\x12\x15\n\x10INPUT_GPS_TOGGLE\x10\x9e\x01\x12\x19\n\x14INPUT_PRIVACY_TOGGLE\x10\x9f\x01\x12\x14\n\x0fINPUT_SEND_PING\x10\xaf\x01\x12\x10\n\x0bINPUT_FN_F1\x10\xf1\x01\x12\x10\n\x0bINPUT_FN_F2\x10\xf2\x01\x12\x10\n\x0bINPUT_FN_F3\x10\xf3\x01\x12\x10\n\x0bINPUT_FN_F4\x10\xf4\x01\x12\x10\n\x0bINPUT_FN_F5\x10\xf5\x01\x12\x14\n\x0fINPUT_MATRIXKEY\x10\xfe\x01\x12\x11\n\x0cINPUT_ANYKEY\x10\xff\x01*\xd5\x05\n\x0bModemPreset\x12>\n\x0fMODEM_LONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12\x30\n\x11MODEM_MEDIUM_SLOW\x10\x01\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12\x30\n\x11MODEM_MEDIUM_FAST\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12.\n\x10MODEM_SHORT_SLOW\x10\x03\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12.\n\x10MODEM_SHORT_FAST\x10\x04\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12\x34\n\x13MODEM_LONG_MODERATE\x10\x05\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12\x30\n\x11MODEM_SHORT_TURBO\x10\x06\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12.\n\x10MODEM_LONG_TURBO\x10\x07\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12&\n\x0fMODEM_LITE_FAST\x10\x08\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12&\n\x0fMODEM_LITE_SLOW\x10\t\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12*\n\x11MODEM_NARROW_FAST\x10\n\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12*\n\x11MODEM_NARROW_SLOW\x10\x0b\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12&\n\x0fMODEM_TINY_FAST\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12&\n\x0fMODEM_TINY_SLOW\x10\r\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12\x32\n\x12MODEM_MEDIUM_TURBO\x10\x0e\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo*\x83\x04\n\tNodeFlags\x12\x12\n\x0eNODE_FLAG_NONE\x10\x00\x12&\n\"NODE_FLAG_IS_KEY_MANUALLY_VERIFIED\x10\x01\x12\x16\n\x12NODE_FLAG_IS_MUTED\x10\x02\x12\x16\n\x12NODE_FLAG_VIA_MQTT\x10\x04\x12\x19\n\x15NODE_FLAG_IS_FAVORITE\x10\x08\x12\x18\n\x14NODE_FLAG_IS_IGNORED\x10\x10\x12\x16\n\x12NODE_FLAG_HAS_USER\x10 \x12\x19\n\x15NODE_FLAG_IS_LICENSED\x10@\x12\x1e\n\x19NODE_FLAG_IS_UNMESSAGABLE\x10\x80\x01\x12\"\n\x1dNODE_FLAG_HAS_IS_UNMESSAGABLE\x10\x80\x02\x12 \n\x1bNODE_FLAG_HAS_XEDDSA_SIGNED\x10\x80\x04\x12\x16\n\x11NODE_FLAG_HAS_SNR\x10\x80\x08\x12\x1a\n\x15NODE_FLAG_HAS_RF_HEAR\x10\x80\x10\x12&\n\x1fNODE_FLAG_HEARD_ON_CURRENT_LORA\x10\x80\x80\x80\x08\x12!\n\x1aNODE_FLAG_RELAYS_FAVORITES\x10\x80\x80\x80\x10\x12\x1f\n\x18NODE_FLAG_LOST_AND_FOUND\x10\x80\x80\x80 \x12\x1c\n\x15NODE_FLAG_HAS_RATCHET\x10\x80\x80\x80@*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*\xaa\x03\n\tErrorCode\x12\x11\n\rCRITICAL_NONE\x10\x00\x12\x18\n\x14\x43RITICAL_TX_WATCHDOG\x10\x01\x12\x1d\n\x19\x43RITICAL_SLEEP_ENTER_WAIT\x10\x02\x12\x15\n\x11\x43RITICAL_NO_RADIO\x10\x03\x12\x18\n\x14\x43RITICAL_UNSPECIFIED\x10\x04\x12\x1e\n\x1a\x43RITICAL_UBLOX_UNIT_FAILED\x10\x05\x12\x16\n\x12\x43RITICAL_NO_AXP192\x10\x06\x12\"\n\x1e\x43RITICAL_INVALID_RADIO_SETTING\x10\x07\x12\x1c\n\x18\x43RITICAL_TRANSMIT_FAILED\x10\x08\x12\x15\n\x11\x43RITICAL_BROWNOUT\x10\t\x12\x1b\n\x17\x43RITICAL_SX1262_FAILURE\x10\n\x12\x1a\n\x16\x43RITICAL_RADIO_SPI_BUG\x10\x0b\x12)\n%CRITICAL_FLASH_CORRUPTION_RECOVERABLE\x10\x0c\x12+\n\'CRITICAL_FLASH_CORRUPTION_UNRECOVERABLE\x10\r*\xe9\x01\n\x0f\x46irmwareEdition\x12\x13\n\x0f\x45\x44ITION_VANILLA\x10\x00\x12\x19\n\x15\x45\x44ITION_SMART_CITIZEN\x10\x01\x12\x16\n\x12\x45\x44ITION_OPEN_SAUCE\x10\x10\x12\x12\n\x0e\x45\x44ITION_DEFCON\x10\x11\x12\x17\n\x13\x45\x44ITION_BURNING_MAN\x10\x12\x12\x16\n\x12\x45\x44ITION_HAMVENTION\x10\x13\x12\x0f\n\x0b\x45\x44ITION_FAB\x10\x14\x12\x16\n\x12\x45\x44ITION_DRAGON_CON\x10\x15\x12\x0f\n\x0b\x45\x44ITION_CCC\x10\x16\x12\x0f\n\x0b\x45\x44ITION_DIY\x10\x7f\x42\x62\n\x14org.meshtastic.protoB\x0c\x43ommonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -156,24 +156,24 @@ _globals['_DEVICEMETADATA'].fields_by_name['capabilities']._serialized_options = b'\222?\0028\010' _globals['_DEVICEMETADATA'].fields_by_name['role']._options = None _globals['_DEVICEMETADATA'].fields_by_name['role']._serialized_options = b'\222?\0028\010' - _globals['_ROLE']._serialized_start=599 - _globals['_ROLE']._serialized_end=975 - _globals['_REGIONCODE']._serialized_start=978 - _globals['_REGIONCODE']._serialized_end=2574 - _globals['_INPUTBROKEREVENT']._serialized_start=2577 - _globals['_INPUTBROKEREVENT']._serialized_end=3201 - _globals['_MODEMPRESET']._serialized_start=3204 - _globals['_MODEMPRESET']._serialized_end=3929 - _globals['_NODEFLAGS']._serialized_start=3932 - _globals['_NODEFLAGS']._serialized_end=4417 - _globals['_LOCSOURCE']._serialized_start=4419 - _globals['_LOCSOURCE']._serialized_end=4497 - _globals['_ERRORCODE']._serialized_start=4500 - _globals['_ERRORCODE']._serialized_end=4926 - _globals['_FIRMWAREEDITION']._serialized_start=4929 - _globals['_FIRMWAREEDITION']._serialized_end=5162 + _globals['_ROLE']._serialized_start=628 + _globals['_ROLE']._serialized_end=1004 + _globals['_REGIONCODE']._serialized_start=1007 + _globals['_REGIONCODE']._serialized_end=2603 + _globals['_INPUTBROKEREVENT']._serialized_start=2606 + _globals['_INPUTBROKEREVENT']._serialized_end=3230 + _globals['_MODEMPRESET']._serialized_start=3233 + _globals['_MODEMPRESET']._serialized_end=3958 + _globals['_NODEFLAGS']._serialized_start=3961 + _globals['_NODEFLAGS']._serialized_end=4476 + _globals['_LOCSOURCE']._serialized_start=4478 + _globals['_LOCSOURCE']._serialized_end=4556 + _globals['_ERRORCODE']._serialized_start=4559 + _globals['_ERRORCODE']._serialized_end=4985 + _globals['_FIRMWAREEDITION']._serialized_start=4988 + _globals['_FIRMWAREEDITION']._serialized_end=5221 _globals['_DEVICEMETADATA']._serialized_start=134 - _globals['_DEVICEMETADATA']._serialized_end=596 + _globals['_DEVICEMETADATA']._serialized_end=625 _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_start=361 - _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_end=596 + _globals['_DEVICEMETADATA_CAPABILITIES']._serialized_end=625 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/common_pb2.pyi b/meshtastic/protobuf/common_pb2.pyi index de593b845..b29892c03 100644 --- a/meshtastic/protobuf/common_pb2.pyi +++ b/meshtastic/protobuf/common_pb2.pyi @@ -580,6 +580,13 @@ class _NodeFlagsEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_NodeFlags.V A TRACKER with DEVICE_LOST_AND_FOUND: it is asking to be found, so peers let its duplicate positions through more often. Set by the node itself. """ + NODE_FLAG_HAS_RATCHET: _NodeFlags.ValueType # 134217728 + """ + The node has published a ratchet key (User.ratchet_key) in an authenticated NodeInfo. + Local only: set by the first one that carries a key and cleared by one that carries none, + so it survives a reboot and is what REQUIRE_RATCHET_WHEN_KNOWN acts on. Never in + User.flags or NodeRecord.flags. + """ class NodeFlags(_NodeFlags, metaclass=_NodeFlagsEnumTypeWrapper): """ @@ -659,6 +666,13 @@ NODE_FLAG_LOST_AND_FOUND: NodeFlags.ValueType # 67108864 A TRACKER with DEVICE_LOST_AND_FOUND: it is asking to be found, so peers let its duplicate positions through more often. Set by the node itself. """ +NODE_FLAG_HAS_RATCHET: NodeFlags.ValueType # 134217728 +""" +The node has published a ratchet key (User.ratchet_key) in an authenticated NodeInfo. +Local only: set by the first one that carries a key and cleared by one that carries none, +so it survives a reboot and is what REQUIRE_RATCHET_WHEN_KNOWN acts on. Never in +User.flags or NodeRecord.flags. +""" Global___NodeFlags: _TypeAlias = NodeFlags # noqa: Y015 class _LocSource: @@ -846,6 +860,8 @@ class DeviceMetadata(_message.Message): """Has public key cryptography""" CAPABILITY_HAS_XEDDSA: DeviceMetadata._Capabilities.ValueType # 64 """Build includes XEdDSA packet signature verification; clear when not compiled in""" + CAPABILITY_HAS_RATCHET: DeviceMetadata._Capabilities.ValueType # 128 + """Build includes direct-message forward secrecy (SecurityConfig.ratchet_flags)""" class Capabilities(_Capabilities, metaclass=_CapabilitiesEnumTypeWrapper): """ @@ -869,6 +885,8 @@ class DeviceMetadata(_message.Message): """Has public key cryptography""" CAPABILITY_HAS_XEDDSA: DeviceMetadata.Capabilities.ValueType # 64 """Build includes XEdDSA packet signature verification; clear when not compiled in""" + CAPABILITY_HAS_RATCHET: DeviceMetadata.Capabilities.ValueType # 128 + """Build includes direct-message forward secrecy (SecurityConfig.ratchet_flags)""" FIRMWARE_VERSION_FIELD_NUMBER: _builtins.int DEVICE_STATE_VERSION_FIELD_NUMBER: _builtins.int diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index 74845aae5..a3b49ac08 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -17,7 +17,7 @@ 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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbd\x19\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x96\x01\n\x18node_info_broadcast_secs\x18\x05 \x01(\rBt\xca\xf3\x18p*\x01s:\x1cNode Info Broadcast IntervalBMHow often node information is sent. Defaults to 10800 seconds, at least 3600.\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x05tzdef\x18\x07 \x01(\tB6\x92?\x02\x08\x41\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12S\n\x0b\x62uzzer_mode\x18\x08 \x01(\x0e\x32,.meshtastic.protobuf.DeviceConfig.BuzzerModeB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.7.0\x12\x17\n\x0f\x64iscovery_flags\x18\t \x01(\r\x12 \n\x18\x64iscovery_node_threshold\x18\n \x01(\r\x12\x14\n\x0ctaper_factor\x18\x0b \x01(\r\x12\x1a\n\x12\x66ull_announce_secs\x18\x0c \x01(\r\x12\x41\n\x16\x61uto_mute_router_count\x18\r \x01(\rB!\x92?\x02\x38\x08\xca\xf3\x18\x18:\x16\x41uto-mute Router Count\x12;\n\x11\x61uto_mute_min_snr\x18\x0e \x01(\x11\x42 \x92?\x02\x38\x08\xca\xf3\x18\x17:\x15\x41uto-mute Minimum SNR\x12\x35\n\x15\x61uto_mute_window_secs\x18\x0f \x01(\rB\x16\xca\xf3\x18\x12:\x10\x41uto-mute Window\"\xd7\x06\n\x0fRebroadcastMode\x12\x8a\x01\n\x03\x41LL\x10\x00\x1a\x80\x01\xca\xf3\x18|:\x03\x41llBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.\x12?\n\x11\x41LL_SKIP_DECODING\x10\x01\x1a(\xca\xf3\x18$:\x11\x41ll Skip DecodingB\x0fTreated as ALL.\x12\xcd\x01\n\nLOCAL_ONLY\x10\x02\x1a\xbc\x01\xca\xf3\x18\xb7\x01:\nLocal OnlyB\xa8\x01Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.\x12\xc8\x01\n\nKNOWN_ONLY\x10\x03\x1a\xb7\x01\xca\xf3\x18\xb2\x01:\nKnown OnlyB\xa3\x01Ignores 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.\x12\x43\n\x04NONE\x10\x04\x1a\x39\xca\xf3\x18\x35:\x04NoneB-Never rebroadcast. Not available on a router.\x12\x95\x01\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a}\xca\xf3\x18y:\x12\x43ore Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.\"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\"\xc8\t\n\x05\x46lags\x12\x0f\n\x0b\x44\x45VICE_NONE\x10\x00\x12\x87\x01\n!DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS\x10\x01\x1a`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12l\n\x1b\x44\x45VICE_DISABLE_TRIPLE_CLICK\x10\x02\x1aK\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12\xcf\x01\n\x1d\x44\x45VICE_LED_HEARTBEAT_DISABLED\x10\x04\x1a\xab\x01\xca\xf3\x18\xa6\x01:\rLED HeartbeatB\x94\x01\x43ontrols the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.\x12\xb1\x01\n\x19\x44\x45VICE_AUTO_MUTE_DISABLED\x10\x08\x1a\x91\x01\xca\xf3\x18\x8c\x01:\x18\x44isable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.\x12\x91\x01\n\x11\x44\x45VICE_RELAY_LATE\x10\x10\x1az\xca\xf3\x18v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.\x12\xa7\x01\n\x16\x44\x45VICE_RELAY_FAVORITES\x10 \x1a\x8a\x01\xca\xf3\x18\x85\x01:\x0fRelay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.\x12i\n\x0c\x44\x45VICE_QUIET\x10@\x1aW\xca\xf3\x18S:\x05QuietBJClient: send nothing on a schedule, only answer and send what you ask for.\x12\x86\x01\n\x15\x44\x45VICE_LOST_AND_FOUND\x10\x80\x01\x1aj\xca\xf3\x18\x66:\x0eLost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.\"Q\n\x0e\x44iscoveryFlags\x12\x12\n\x0e\x44ISCOVERY_NONE\x10\x00\x12\x13\n\x0f\x44ISCOVERY_SERVE\x10\x01\x12\x16\n\x12\x44ISCOVERY_NO_TAPER\x10\x02\"\xaf\r\n\x0ePositionConfig\x12y\n\x17position_broadcast_secs\x18\x01 \x01(\rBX\xca\xf3\x18T*\x01s:\x12\x42roadcast IntervalB;The longest a node will go without broadcasting a position.\x12>\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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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.@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\xb5\r\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x15ratchet_interval_secs\x18\x07 \x01(\r\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"U\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12\x13\n\x0fRATCHET_ENABLED\x10\x01\x12\x1e\n\x1aRATCHET_REQUIRE_WHEN_KNOWN\x10\x02\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\xb7\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x1a\n\x0bhome_region\x18\x05 \x01(\tB\x05\x92?\x02\x08\x10\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbd\x19\n\x0c\x44\x65viceConfig\x12:\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12u\n\x0b\x62utton_gpio\x18\x02 \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\x03 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12\x63\n\x10rebroadcast_mode\x18\x04 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x96\x01\n\x18node_info_broadcast_secs\x18\x05 \x01(\rBt\xca\xf3\x18p*\x01s:\x1cNode Info Broadcast IntervalBMHow often node information is sent. Defaults to 10800 seconds, at least 3600.\x12\x14\n\x05\x66lags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x05tzdef\x18\x07 \x01(\tB6\x92?\x02\x08\x41\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12S\n\x0b\x62uzzer_mode\x18\x08 \x01(\x0e\x32,.meshtastic.protobuf.DeviceConfig.BuzzerModeB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.7.0\x12\x17\n\x0f\x64iscovery_flags\x18\t \x01(\r\x12 \n\x18\x64iscovery_node_threshold\x18\n \x01(\r\x12\x14\n\x0ctaper_factor\x18\x0b \x01(\r\x12\x1a\n\x12\x66ull_announce_secs\x18\x0c \x01(\r\x12\x41\n\x16\x61uto_mute_router_count\x18\r \x01(\rB!\x92?\x02\x38\x08\xca\xf3\x18\x18:\x16\x41uto-mute Router Count\x12;\n\x11\x61uto_mute_min_snr\x18\x0e \x01(\x11\x42 \x92?\x02\x38\x08\xca\xf3\x18\x17:\x15\x41uto-mute Minimum SNR\x12\x35\n\x15\x61uto_mute_window_secs\x18\x0f \x01(\rB\x16\xca\xf3\x18\x12:\x10\x41uto-mute Window\"\xd7\x06\n\x0fRebroadcastMode\x12\x8a\x01\n\x03\x41LL\x10\x00\x1a\x80\x01\xca\xf3\x18|:\x03\x41llBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.\x12?\n\x11\x41LL_SKIP_DECODING\x10\x01\x1a(\xca\xf3\x18$:\x11\x41ll Skip DecodingB\x0fTreated as ALL.\x12\xcd\x01\n\nLOCAL_ONLY\x10\x02\x1a\xbc\x01\xca\xf3\x18\xb7\x01:\nLocal OnlyB\xa8\x01Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.\x12\xc8\x01\n\nKNOWN_ONLY\x10\x03\x1a\xb7\x01\xca\xf3\x18\xb2\x01:\nKnown OnlyB\xa3\x01Ignores 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.\x12\x43\n\x04NONE\x10\x04\x1a\x39\xca\xf3\x18\x35:\x04NoneB-Never rebroadcast. Not available on a router.\x12\x95\x01\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a}\xca\xf3\x18y:\x12\x43ore Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.\"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\"\xc8\t\n\x05\x46lags\x12\x0f\n\x0b\x44\x45VICE_NONE\x10\x00\x12\x87\x01\n!DEVICE_DOUBLE_TAP_AS_BUTTON_PRESS\x10\x01\x1a`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12l\n\x1b\x44\x45VICE_DISABLE_TRIPLE_CLICK\x10\x02\x1aK\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12\xcf\x01\n\x1d\x44\x45VICE_LED_HEARTBEAT_DISABLED\x10\x04\x1a\xab\x01\xca\xf3\x18\xa6\x01:\rLED HeartbeatB\x94\x01\x43ontrols the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable.\x12\xb1\x01\n\x19\x44\x45VICE_AUTO_MUTE_DISABLED\x10\x08\x1a\x91\x01\xca\xf3\x18\x8c\x01:\x18\x44isable Client Auto-muteBpKeep relaying broadcasts as a client even when routers already cover the area. For sensor and event deployments.\x12\x91\x01\n\x11\x44\x45VICE_RELAY_LATE\x10\x10\x1az\xca\xf3\x18v:\nRelay LateBhRouter: rebroadcast only after other nodes, to fill gaps without taking hops from better-placed routers.\x12\xa7\x01\n\x16\x44\x45VICE_RELAY_FAVORITES\x10 \x1a\x8a\x01\xca\xf3\x18\x85\x01:\x0fRelay FavoritesBrClient: relay traffic from and to favorite nodes like a router. For a roof or attic node serving your other nodes.\x12i\n\x0c\x44\x45VICE_QUIET\x10@\x1aW\xca\xf3\x18S:\x05QuietBJClient: send nothing on a schedule, only answer and send what you ask for.\x12\x86\x01\n\x15\x44\x45VICE_LOST_AND_FOUND\x10\x80\x01\x1aj\xca\xf3\x18\x66:\x0eLost and FoundBTTracker: broadcast your position as a message regularly, to help recover the device.\"Q\n\x0e\x44iscoveryFlags\x12\x12\n\x0e\x44ISCOVERY_NONE\x10\x00\x12\x13\n\x0f\x44ISCOVERY_SERVE\x10\x01\x12\x16\n\x12\x44ISCOVERY_NO_TAPER\x10\x02\"\xaf\r\n\x0ePositionConfig\x12y\n\x17position_broadcast_secs\x18\x01 \x01(\rBX\xca\xf3\x18T*\x01s:\x12\x42roadcast IntervalB;The longest a node will go without broadcasting a position.\x12>\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\x63\n\x18gps_update_interval_secs\x18\x04 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12j\n\x0eposition_flags\x18\x05 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x06 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\x07 \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\x08 \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\t \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\n \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12M\n\x08gps_mode\x18\x0b \x01(\x0e\x32+.meshtastic.protobuf.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xa5\x03\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\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\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#\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\"\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(\rB\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\x05 \x01(\r\x12\x0f\n\x07ls_secs\x18\x06 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x07 \x01(\r\x12)\n\x1a\x64\x65vice_battery_ina_address\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18\t \x01(\x04\"\x81\t\n\rNetworkConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x43\n\twifi_ssid\x18\x02 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x03 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x04 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12X\n\x0c\x61\x64\x64ress_mode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12\x42\n\x0bipv4_config\x18\x06 \x01(\x0b\x32-.meshtastic.protobuf.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\x07 \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\x08 \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\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\"\x8e\x02\n\x05\x46lags\x12\x10\n\x0cNETWORK_NONE\x10\x00\x12\x65\n\x0cNETWORK_WIFI\x10\x01\x1aS\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12l\n\x0bNETWORK_ETH\x10\x02\x1a[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12\x1e\n\x0cNETWORK_IPV6\x10\x04\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.16\"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\"\xdf\x10\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.\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x02 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12u\n\x04oled\x18\x04 \x01(\x0e\x32+.meshtastic.protobuf.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12x\n\x0b\x64isplaymode\x18\x05 \x01(\x0e\x32..meshtastic.protobuf.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12\xb9\x01\n\x13\x63ompass_orientation\x18\x06 \x01(\x0e\x32\x35.meshtastic.protobuf.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\"\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\"\xc7\x04\n\x05\x46lags\x12\x10\n\x0c\x44ISPLAY_NONE\x10\x00\x12\x42\n\x13\x44ISPLAY_FLIP_SCREEN\x10\x01\x1a)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12R\n\x14\x44ISPLAY_HEADING_BOLD\x10\x02\x1a\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12~\n\x1d\x44ISPLAY_WAKE_ON_TAP_OR_MOTION\x10\x04\x1a[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12`\n\x15\x44ISPLAY_USE_12H_CLOCK\x10\x08\x1a\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12,\n\x1a\x44ISPLAY_USE_LONG_NODE_NAME\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12\x30\n\x1e\x44ISPLAY_ENABLE_MESSAGE_BUBBLES\x10 \x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.19\x12R\n\x16\x44ISPLAY_IMPERIAL_UNITS\x10@\x1a\x36\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\"\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\"\xd0\x02\n\x12\x43ompassOrientation\x12\x1a\n\tDEGREES_0\x10\x00\x1a\x0b\xca\xf3\x18\x07:\x05\x30\xc3\x82\xc2\xb0\x12\x1c\n\nDEGREES_90\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06\x39\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_180\x10\x02\x1a\r\xca\xf3\x18\t:\x07\x31\x38\x30\xc3\x82\xc2\xb0\x12\x1e\n\x0b\x44\x45GREES_270\x10\x03\x1a\r\xca\xf3\x18\t:\x07\x32\x37\x30\xc3\x82\xc2\xb0\x12,\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0e\x30\xc3\x82\xc2\xb0 Inverted\x12.\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0f\x39\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x31\x38\x30\xc3\x82\xc2\xb0 Inverted\x12\x30\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x16\xca\xf3\x18\x12:\x10\x32\x37\x30\xc3\x82\xc2\xb0 Inverted\"\xb4\x10\n\nLoRaConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x45\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32 .meshtastic.protobuf.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(\x11\x12n\n\x06region\x18\x07 \x01(\x0e\x32\x1f.meshtastic.protobuf.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.@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\xd8\x01\n\x08tx_power\x18\t \x01(\x11\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\xea\x01\n\x0b\x63hannel_num\x18\n \x01(\rB\xd4\x01\x92?\x02\x38\x10\xca\xf3\x18\xca\x01:\x0e\x46requency SlotB\xb7\x01Your node\xc3\xa2\xe2\x82\xac\xe2\x84\xa2s 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\x34\n\x12override_frequency\x18\x0b \x01(\rB\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12U\n\x0c\x66\x65m_lna_mode\x18\x0c \x01(\x0e\x32,.meshtastic.protobuf.LoRaConfig.FEM_LNA_ModeB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08R\x06\x32.7.20\":\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\"\xbd\x05\n\x05\x46lags\x12\r\n\tLORA_NONE\x10\x00\x12\x81\x01\n\x0fLORA_USE_PRESET\x10\x01\x1al\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12\x85\x01\n\x0fLORA_TX_ENABLED\x10\x02\x1ap\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\x37\n\x18LORA_OVERRIDE_DUTY_CYCLE\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12j\n\x1bLORA_SX126X_RX_BOOSTED_GAIN\x10\x08\x1aI\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12/\n\x14LORA_PA_FAN_DISABLED\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12z\n\x10LORA_IGNORE_MQTT\x10 \x1a\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12,\n\x16LORA_CONFIG_OK_TO_MQTT\x10@\x1a\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12\x19\n\x14LORA_SERIAL_HAL_ONLY\x10\x80\x01\"\xb4\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\x12n\n\x04mode\x18\x02 \x01(\x0e\x32\x30.meshtastic.protobuf.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)\"\x8d\x10\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\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12l\n\x17packet_signature_policy\x18\x05 \x01(\x0e\x32\x39.meshtastic.protobuf.SecurityConfig.PacketSignaturePolicyB\x10\x92?\x02\x38\x08\xca\xf3\x18\x07R\x05\x32.8.0\x12\x1c\n\rratchet_flags\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x86\x01\n\x15ratchet_interval_secs\x18\x07 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x10Ratchet IntervalBLHow often the ratchet key rotates. Defaults to 86400 seconds, at least 3600.\x12\"\n\x11group_private_key\x18\x08 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x04\"\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.\"\xa4\x03\n\x05\x46lags\x12\x11\n\rSECURITY_NONE\x10\x00\x12\x92\x01\n\x13SECURITY_IS_MANAGED\x10\x01\x1ay\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12V\n\x17SECURITY_SERIAL_ENABLED\x10\x02\x1a\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x9a\x01\n\x1eSECURITY_DEBUG_LOG_API_ENABLED\x10\x04\x1av\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\"\xc2\x02\n\x0cRatchetFlags\x12\x10\n\x0cRATCHET_NONE\x10\x00\x12z\n\x0fRATCHET_ENABLED\x10\x01\x1a\x65\xca\xf3\x18\x61:\x0f\x46orward SecrecyBNRotate a ratchet key and use it for direct messages to nodes that publish one.\x12\xa3\x01\n\x1aREQUIRE_RATCHET_WHEN_KNOWN\x10\x02\x1a\x82\x01\xca\xf3\x18~:\x17Require Forward SecrecyBcRefuse to send a direct message without forward secrecy to a node that has published a ratchet key.\"\x12\n\x10SessionkeyConfig\"\x9d\x01\n\x0bGroupConfig\x12=\n\x06groups\x18\x01 \x03(\x0b\x32&.meshtastic.protobuf.GroupConfig.GroupB\x05\x92?\x02\x10\x04\x1aO\n\x05Group\x12\x13\n\x04name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\npublic_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x16\n\x0euplink_enabled\x18\x03 \x01(\x08\"\xb7\x03\n\x0bRelayConfig\x12;\n\x05rules\x18\x01 \x03(\x0b\x32%.meshtastic.protobuf.RelayConfig.RuleB\x05\x92?\x02\x10\x10\x12?\n\x0e\x64\x65\x66\x61ult_action\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x18\n\x07regions\x18\x03 \x03(\tB\x07\x92?\x04\x08\x10\x10\x04\x12\x42\n\x11scope_miss_action\x18\x04 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x1a\n\x0bhome_region\x18\x05 \x01(\tB\x05\x92?\x02\x08\x10\x1at\n\x04Rule\x12\x1b\n\x0c\x63hannel_hash\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.meshtastic.protobuf.RelayConfig.Action\x12\x16\n\x07hop_cap\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\":\n\x06\x41\x63tion\x12\x11\n\rRELAY_FORWARD\x10\x00\x12\r\n\tRELAY_CAP\x10\x01\x12\x0e\n\nRELAY_DROP\x10\x02\"\xf9\x04\n\rConfigPayload\x12\x33\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.DeviceConfigH\x00\x12\x37\n\x08position\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.PositionConfigH\x00\x12\x31\n\x05power\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.PowerConfigH\x00\x12\x35\n\x07network\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.NetworkConfigH\x00\x12\x35\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DisplayConfigH\x00\x12/\n\x04lora\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LoRaConfigH\x00\x12\x39\n\tbluetooth\x18\x07 \x01(\x0b\x32$.meshtastic.protobuf.BluetoothConfigH\x00\x12\x37\n\x08security\x18\x08 \x01(\x0b\x32#.meshtastic.protobuf.SecurityConfigH\x00\x12;\n\nsessionkey\x18\t \x01(\x0b\x32%.meshtastic.protobuf.SessionkeyConfigH\x00\x12\x31\n\x05relay\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.RelayConfigH\x00\x12\x31\n\x05group\x18\x0c \x01(\x0b\x32 .meshtastic.protobuf.GroupConfigH\x00\x42\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) @@ -285,6 +285,10 @@ _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_SERIAL_ENABLED"]._serialized_options = b'\312\363\0305:\016Serial ConsoleB#Serial Console over the Stream API.' _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_DEBUG_LOG_API_ENABLED"]._options = None _globals['_SECURITYCONFIG_FLAGS'].values_by_name["SECURITY_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.' + _globals['_SECURITYCONFIG_RATCHETFLAGS'].values_by_name["RATCHET_ENABLED"]._options = None + _globals['_SECURITYCONFIG_RATCHETFLAGS'].values_by_name["RATCHET_ENABLED"]._serialized_options = b'\312\363\030a:\017Forward SecrecyBNRotate a ratchet key and use it for direct messages to nodes that publish one.' + _globals['_SECURITYCONFIG_RATCHETFLAGS'].values_by_name["REQUIRE_RATCHET_WHEN_KNOWN"]._options = None + _globals['_SECURITYCONFIG_RATCHETFLAGS'].values_by_name["REQUIRE_RATCHET_WHEN_KNOWN"]._serialized_options = b'\312\363\030~:\027Require Forward SecrecyBcRefuse to send a direct message without forward secrecy to a node that has published a ratchet key.' _globals['_SECURITYCONFIG'].fields_by_name['public_key']._options = None _globals['_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' _globals['_SECURITYCONFIG'].fields_by_name['private_key']._options = None @@ -297,6 +301,8 @@ _globals['_SECURITYCONFIG'].fields_by_name['packet_signature_policy']._serialized_options = b'\222?\0028\010\312\363\030\007R\0052.8.0' _globals['_SECURITYCONFIG'].fields_by_name['ratchet_flags']._options = None _globals['_SECURITYCONFIG'].fields_by_name['ratchet_flags']._serialized_options = b'\222?\0028\010' + _globals['_SECURITYCONFIG'].fields_by_name['ratchet_interval_secs']._options = None + _globals['_SECURITYCONFIG'].fields_by_name['ratchet_interval_secs']._serialized_options = b'\312\363\030c*\001s:\020Ratchet IntervalBLHow often the ratchet key rotates. Defaults to 86400 seconds, at least 3600.' _globals['_SECURITYCONFIG'].fields_by_name['group_private_key']._options = None _globals['_SECURITYCONFIG'].fields_by_name['group_private_key']._serialized_options = b'\222?\004\010 \020\004' _globals['_GROUPCONFIG_GROUP'].fields_by_name['name']._options = None @@ -364,25 +370,25 @@ _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=11575 _globals['_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=11693 _globals['_SECURITYCONFIG']._serialized_start=11696 - _globals['_SECURITYCONFIG']._serialized_end=13413 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12309 - _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=12903 - _globals['_SECURITYCONFIG_FLAGS']._serialized_start=12906 - _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13326 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13328 - _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13413 - _globals['_SESSIONKEYCONFIG']._serialized_start=13415 - _globals['_SESSIONKEYCONFIG']._serialized_end=13433 - _globals['_GROUPCONFIG']._serialized_start=13436 - _globals['_GROUPCONFIG']._serialized_end=13593 - _globals['_GROUPCONFIG_GROUP']._serialized_start=13514 - _globals['_GROUPCONFIG_GROUP']._serialized_end=13593 - _globals['_RELAYCONFIG']._serialized_start=13596 - _globals['_RELAYCONFIG']._serialized_end=14035 - _globals['_RELAYCONFIG_RULE']._serialized_start=13859 - _globals['_RELAYCONFIG_RULE']._serialized_end=13975 - _globals['_RELAYCONFIG_ACTION']._serialized_start=13977 - _globals['_RELAYCONFIG_ACTION']._serialized_end=14035 - _globals['_CONFIGPAYLOAD']._serialized_start=14038 - _globals['_CONFIGPAYLOAD']._serialized_end=14671 + _globals['_SECURITYCONFIG']._serialized_end=13757 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=12415 + _globals['_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=13009 + _globals['_SECURITYCONFIG_FLAGS']._serialized_start=13012 + _globals['_SECURITYCONFIG_FLAGS']._serialized_end=13432 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_start=13435 + _globals['_SECURITYCONFIG_RATCHETFLAGS']._serialized_end=13757 + _globals['_SESSIONKEYCONFIG']._serialized_start=13759 + _globals['_SESSIONKEYCONFIG']._serialized_end=13777 + _globals['_GROUPCONFIG']._serialized_start=13780 + _globals['_GROUPCONFIG']._serialized_end=13937 + _globals['_GROUPCONFIG_GROUP']._serialized_start=13858 + _globals['_GROUPCONFIG_GROUP']._serialized_end=13937 + _globals['_RELAYCONFIG']._serialized_start=13940 + _globals['_RELAYCONFIG']._serialized_end=14379 + _globals['_RELAYCONFIG_RULE']._serialized_start=14203 + _globals['_RELAYCONFIG_RULE']._serialized_end=14319 + _globals['_RELAYCONFIG_ACTION']._serialized_start=14321 + _globals['_RELAYCONFIG_ACTION']._serialized_end=14379 + _globals['_CONFIGPAYLOAD']._serialized_start=14382 + _globals['_CONFIGPAYLOAD']._serialized_end=15015 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index 1697990e1..ff8d56929 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -1588,10 +1588,12 @@ class SecurityConfig(_message.Message): """Nothing enabled: direct messages derive their key from the static keys alone""" RATCHET_ENABLED: SecurityConfig._RatchetFlags.ValueType # 1 """Generate, publish and use ratchet keys for PKI direct messages""" - RATCHET_REQUIRE_WHEN_KNOWN: SecurityConfig._RatchetFlags.ValueType # 2 + REQUIRE_RATCHET_WHEN_KNOWN: SecurityConfig._RatchetFlags.ValueType # 2 """ - Refuse to send a direct message with the static derivation when the peer has - published a ratchet key. Off by default: a stale key would cost delivery. + Refuse to send a direct message with the static derivation to a node known to have + published a ratchet key (NODE_FLAG_HAS_RATCHET). Acks, NodeInfo and key verification + stay static. Acts only with RATCHET_ENABLED. Off by default: a stale key would cost + delivery. """ class RatchetFlags(_RatchetFlags, metaclass=_RatchetFlagsEnumTypeWrapper): @@ -1603,10 +1605,12 @@ class SecurityConfig(_message.Message): """Nothing enabled: direct messages derive their key from the static keys alone""" RATCHET_ENABLED: SecurityConfig.RatchetFlags.ValueType # 1 """Generate, publish and use ratchet keys for PKI direct messages""" - RATCHET_REQUIRE_WHEN_KNOWN: SecurityConfig.RatchetFlags.ValueType # 2 + REQUIRE_RATCHET_WHEN_KNOWN: SecurityConfig.RatchetFlags.ValueType # 2 """ - Refuse to send a direct message with the static derivation when the peer has - published a ratchet key. Off by default: a stale key would cost delivery. + Refuse to send a direct message with the static derivation to a node known to have + published a ratchet key (NODE_FLAG_HAS_RATCHET). Acks, NodeInfo and key verification + stay static. Acts only with RATCHET_ENABLED. Off by default: a stale key would cost + delivery. """ PUBLIC_KEY_FIELD_NUMBER: _builtins.int diff --git a/meshtastic/protobuf/deviceonly_pb2.py b/meshtastic/protobuf/deviceonly_pb2.py index b732f79bf..13ece60e7 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -24,7 +24,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\x1dmeshtastic/protobuf/api.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a#meshtastic/protobuf/discovery.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a&meshtastic/protobuf/storeforward.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb9\x01\n\x0cPositionLite\x12\x17\n\x0flatitude_scaled\x18\x01 \x01(\x11\x12\x18\n\x10longitude_scaled\x18\x02 \x01(\x11\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x11\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x1d\n\x0eprecision_bits\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\"\x9d\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x17\n\x08hw_model\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12.\n\x04role\x18\x03 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x0b\n\x03snr\x18\x04 \x01(\x11\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1d\n\thops_away\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x17\n\x08next_hop\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x62itfield\x18\n \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tlong_name\x18\x0b \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x0c \x01(\tB\x05\x92?\x02\x08\x05\x12\x12\n\nrecord_seq\x18\r \x01(\r\x12;\n\x0brecord_tier\x18\x0e \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\x05\x92?\x02\x38\x08\x42\x0c\n\n_hops_away\"\xc0\x02\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12T\n\x19node_remote_hardware_pins\x18\x03 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x10\x12\x0f\n\x07version\x18\x04 \x01(\r\x12\x46\n\nsf_cursors\x18\x05 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nrecord_seq\x18\x06 \x01(\r\x12\x12\n\nrecord_crc\x18\x07 \x01(\x07\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"W\n\x11NodeReadingsEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x35\n\x08readings\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadings\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xa7\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\x12i\n\x08readings\x18\x06 \x03(\x0b\x32&.meshtastic.protobuf.NodeReadingsEntryB/\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\x10\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\x1dmeshtastic/protobuf/api.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a#meshtastic/protobuf/discovery.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a&meshtastic/protobuf/storeforward.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x1emeshtastic/protobuf/wire.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb9\x01\n\x0cPositionLite\x12\x17\n\x0flatitude_scaled\x18\x01 \x01(\x11\x12\x18\n\x10longitude_scaled\x18\x02 \x01(\x11\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x11\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x1d\n\x0eprecision_bits\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\"\x9d\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x17\n\x08hw_model\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12.\n\x04role\x18\x03 \x01(\x0e\x32\x19.meshtastic.protobuf.RoleB\x05\x92?\x02\x38\x08\x12\x0b\n\x03snr\x18\x04 \x01(\x11\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1d\n\thops_away\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x17\n\x08next_hop\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x62itfield\x18\n \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tlong_name\x18\x0b \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x0c \x01(\tB\x05\x92?\x02\x08\x05\x12\x12\n\nrecord_seq\x18\r \x01(\r\x12;\n\x0brecord_tier\x18\x0e \x01(\x0e\x32\x1f.meshtastic.protobuf.RecordTierB\x05\x92?\x02\x38\x08\x42\x0c\n\n_hops_away\"\xc0\x02\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12T\n\x19node_remote_hardware_pins\x18\x03 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x10\x12\x0f\n\x07version\x18\x04 \x01(\r\x12\x46\n\nsf_cursors\x18\x05 \x03(\x0b\x32+.meshtastic.protobuf.StoreAndForward.CursorB\x05\x92?\x02\x10\x11\x12\x12\n\nrecord_seq\x18\x06 \x01(\r\x12\x12\n\nrecord_crc\x18\x07 \x01(\x07\"[\n\x0bRatchetPeer\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x15\n\x04keys\x18\x02 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\x12\x10\n\x08\x61ge_secs\x18\x03 \x01(\r\x12\x16\n\x0eown_generation\x18\x04 \x01(\r\"\xb1\x01\n\x0cRatchetState\x12\x1d\n\x0cprivate_keys\x18\x01 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\x12\x12\n\nrotated_at\x18\x02 \x01(\x07\x12\x12\n\ngeneration\x18\x03 \x01(\r\x12Z\n\x05peers\x18\x04 \x03(\x0b\x32 .meshtastic.protobuf.RatchetPeerB)\x92?&\x92\x01#std::vector\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"W\n\x11NodeReadingsEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x35\n\x08readings\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadings\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\x07\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xa7\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\x12i\n\x08readings\x18\x06 \x03(\x0b\x32&.meshtastic.protobuf.NodeReadingsEntryB/\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\x10\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) @@ -58,6 +58,12 @@ _globals['_DEVICESTATE'].fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\020' _globals['_DEVICESTATE'].fields_by_name['sf_cursors']._options = None _globals['_DEVICESTATE'].fields_by_name['sf_cursors']._serialized_options = b'\222?\002\020\021' + _globals['_RATCHETPEER'].fields_by_name['keys']._options = None + _globals['_RATCHETPEER'].fields_by_name['keys']._serialized_options = b'\222?\004\010 \020\003' + _globals['_RATCHETSTATE'].fields_by_name['private_keys']._options = None + _globals['_RATCHETSTATE'].fields_by_name['private_keys']._serialized_options = b'\222?\004\010 \020\003' + _globals['_RATCHETSTATE'].fields_by_name['peers']._options = None + _globals['_RATCHETSTATE'].fields_by_name['peers']._serialized_options = b'\222?&\222\001#std::vector' _globals['_NODEDATABASE'].fields_by_name['nodes']._options = None _globals['_NODEDATABASE'].fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector' _globals['_NODEDATABASE'].fields_by_name['positions']._options = None @@ -76,18 +82,22 @@ _globals['_NODEINFOLITE']._serialized_end=1021 _globals['_DEVICESTATE']._serialized_start=1024 _globals['_DEVICESTATE']._serialized_end=1344 - _globals['_NODEPOSITIONENTRY']._serialized_start=1346 - _globals['_NODEPOSITIONENTRY']._serialized_end=1431 - _globals['_NODETELEMETRYENTRY']._serialized_start=1433 - _globals['_NODETELEMETRYENTRY']._serialized_end=1526 - _globals['_NODEREADINGSENTRY']._serialized_start=1528 - _globals['_NODEREADINGSENTRY']._serialized_end=1615 - _globals['_NODESTATUSENTRY']._serialized_start=1617 - _globals['_NODESTATUSENTRY']._serialized_end=1699 - _globals['_NODEDATABASE']._serialized_start=1702 - _globals['_NODEDATABASE']._serialized_end=2253 - _globals['_CHANNELFILE']._serialized_start=2255 - _globals['_CHANNELFILE']._serialized_end=2340 - _globals['_BACKUPPREFERENCES']._serialized_start=2343 - _globals['_BACKUPPREFERENCES']._serialized_end=2605 + _globals['_RATCHETPEER']._serialized_start=1346 + _globals['_RATCHETPEER']._serialized_end=1437 + _globals['_RATCHETSTATE']._serialized_start=1440 + _globals['_RATCHETSTATE']._serialized_end=1617 + _globals['_NODEPOSITIONENTRY']._serialized_start=1619 + _globals['_NODEPOSITIONENTRY']._serialized_end=1704 + _globals['_NODETELEMETRYENTRY']._serialized_start=1706 + _globals['_NODETELEMETRYENTRY']._serialized_end=1799 + _globals['_NODEREADINGSENTRY']._serialized_start=1801 + _globals['_NODEREADINGSENTRY']._serialized_end=1888 + _globals['_NODESTATUSENTRY']._serialized_start=1890 + _globals['_NODESTATUSENTRY']._serialized_end=1972 + _globals['_NODEDATABASE']._serialized_start=1975 + _globals['_NODEDATABASE']._serialized_end=2526 + _globals['_CHANNELFILE']._serialized_start=2528 + _globals['_CHANNELFILE']._serialized_end=2613 + _globals['_BACKUPPREFERENCES']._serialized_start=2616 + _globals['_BACKUPPREFERENCES']._serialized_end=2878 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index f9e1b30d7..6e04ec5b2 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -295,6 +295,105 @@ class DeviceState(_message.Message): Global___DeviceState: _TypeAlias = DeviceState # noqa: Y015 +@_typing.final +class RatchetPeer(_message.Message): + """ + One peer's published ratchet keys, as RatchetState stores them. + """ + + DESCRIPTOR: _descriptor.Descriptor + + NUM_FIELD_NUMBER: _builtins.int + KEYS_FIELD_NUMBER: _builtins.int + AGE_SECS_FIELD_NUMBER: _builtins.int + OWN_GENERATION_FIELD_NUMBER: _builtins.int + num: _builtins.int + """ + The peer's node number. + """ + age_secs: _builtins.int + """ + How long keys[0] had been held when this was written. Time the node was off is not + counted. + """ + own_generation: _builtins.int + """ + The newest RatchetState.generation of this node's keys the peer has used toward it, + 0 for none. A direct message to the peer uses that key. + """ + @_builtins.property + def keys(self) -> _containers.RepeatedScalarFieldContainer[_builtins.bytes]: + """ + Its ratchet public keys, newest first, at most three. + """ + + def __init__( + self, + *, + num: _builtins.int = ..., + keys: _abc.Iterable[_builtins.bytes] | None = ..., + age_secs: _builtins.int = ..., + own_generation: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["age_secs", b"age_secs", "keys", b"keys", "num", b"num", "own_generation", b"own_generation"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RatchetPeer: _TypeAlias = RatchetPeer # noqa: Y015 + +@_typing.final +class RatchetState(_message.Message): + """ + Direct-message forward secrecy state, in its own file. Never sent, never in a backup and + never returned by get_config: erasing the oldest private key is what the feature buys. + """ + + DESCRIPTOR: _descriptor.Descriptor + + PRIVATE_KEYS_FIELD_NUMBER: _builtins.int + ROTATED_AT_FIELD_NUMBER: _builtins.int + GENERATION_FIELD_NUMBER: _builtins.int + PEERS_FIELD_NUMBER: _builtins.int + rotated_at: _builtins.int + """ + Unix seconds of the last rotation, or 0 when the clock was not trusted then. + """ + generation: _builtins.int + """ + Generation of private_keys[0]: counts rotations, so RatchetPeer.own_generation can + name one of this node's keys across a rotation. + """ + @_builtins.property + def private_keys(self) -> _containers.RepeatedScalarFieldContainer[_builtins.bytes]: + """ + X25519 ratchet private keys, newest first, at most three. Public halves are derived. + """ + + @_builtins.property + def peers(self) -> _containers.RepeatedCompositeFieldContainer[Global___RatchetPeer]: + """ + Peers whose ratchet keys this node holds. Kept so a node that was off can still + decrypt the direct messages a store-and-forward server replays to it. + """ + + def __init__( + self, + *, + private_keys: _abc.Iterable[_builtins.bytes] | None = ..., + rotated_at: _builtins.int = ..., + generation: _builtins.int = ..., + peers: _abc.Iterable[Global___RatchetPeer] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["generation", b"generation", "peers", b"peers", "private_keys", b"private_keys", "rotated_at", b"rotated_at"] # noqa: Y015 + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def WhichOneof(self, oneof_group: _Never) -> None: ... + +Global___RatchetState: _TypeAlias = RatchetState # noqa: Y015 + @_typing.final class NodePositionEntry(_message.Message): """Satellite per-node entries; stored alongside the slim NodeInfoLite so nodes diff --git a/meshtastic/protobuf/wire_pb2.py b/meshtastic/protobuf/wire_pb2.py index 1015b83ff..363f65ac9 100644 --- a/meshtastic/protobuf/wire_pb2.py +++ b/meshtastic/protobuf/wire_pb2.py @@ -17,7 +17,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xd4\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \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\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xb9\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\ranycast_reply\x18\x04 \x01(\x07\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"~\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x02 \x01(\r\x12\x37\n\tneighbors\x18\x03 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\">\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x0b\n\x03snr\x18\x02 \x01(\x11\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/wire.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc0\x05\n\x08Position\x12\x19\n\x0flatitude_scaled\x18\x01 \x01(\x11H\x00\x12\x12\n\x08latitude\x18\x02 \x01(\x0fH\x00\x12\x1a\n\x10longitude_scaled\x18\x03 \x01(\x11H\x01\x12\x13\n\tlongitude\x18\x04 \x01(\x0fH\x01\x12\x1d\n\x0eprecision_bits\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04time\x18\x06 \x01(\x07\x12\x15\n\x08\x61ltitude\x18\x07 \x01(\x11H\x02\x88\x01\x01\x12\x37\n\x0flocation_source\x18\x08 \x01(\x0e\x32\x1e.meshtastic.protobuf.LocSource\x12\x19\n\x0cground_speed\x18\t \x01(\rH\x03\x88\x01\x01\x12\x19\n\x0cground_track\x18\n \x01(\rH\x04\x88\x01\x01\x12\x1b\n\x0csats_in_view\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04PDOP\x18\x0c \x01(\r\x12\x19\n\x0c\x61ltitude_hae\x18\r \x01(\x11H\x05\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\x0e \x01(\x11H\x06\x88\x01\x01\x12\x12\n\nseq_number\x18\x0f \x01(\r\x12\x1a\n\x0b\x66ix_quality\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x08\x66ix_type\x18\x11 \x01(\rB\x05\x92?\x02\x38\x08\x12\x0c\n\x04HDOP\x18\x12 \x01(\r\x12\x0c\n\x04VDOP\x18\x13 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x14 \x01(\r\x12\x18\n\tsensor_id\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x0bnext_update\x18\x16 \x01(\rB\x12\n\x10latitude_variantB\x13\n\x11longitude_variantB\x0b\n\t_altitudeB\x0f\n\r_ground_speedB\x0f\n\r_ground_trackB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separation\"\xc3\x01\n\x04User\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\x10\n\x08hw_model\x18\x03 \x01(\r\x12\x14\n\x05\x66lags\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\'\n\x04role\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x19\n\npublic_key\x18\x06 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bratchet_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xf3\x03\n\x07Routing\x12:\n\x0c\x65rror_reason\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x18\n\tack_proof\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08\x08\"\x86\x03\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\'\x12\x1d\n\x19PKI_SEND_FAIL_RATCHET_KEY\x10(B\t\n\x07variant\"\xa3\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\x80\x02\x12\x12\n\nrequest_id\x18\x03 \x01(\x07\x12\x10\n\x08reply_id\x18\x04 \x01(\x07\x12\r\n\x05\x65moji\x18\x05 \x01(\r\x12\x1c\n\x08\x62itfield\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08@\"R\n\x08\x42itfield\x12\x11\n\rBITFIELD_NONE\x10\x00\x12\x17\n\x13\x42ITFIELD_OK_TO_MQTT\x10\x01\x12\x1a\n\x16\x42ITFIELD_WANT_RESPONSE\x10\x02\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 \"\xb9\x01\n\rHeaderOptions\x12\x10\n\x08\x66ragment\x18\x01 \x01(\r\x12\x18\n\thop_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nscope_code\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\ranycast_reply\x18\x04 \x01(\x07\"J\n\x08HopFlags\x12\x0c\n\x08HOP_NONE\x10\x00\x12\x10\n\x0cHOP_NO_LEARN\x10\x01\x12\r\n\tHOP_STORE\x10\x02\x12\x0f\n\x0bHOP_ANYCAST\x10\x04\"\xd5\x03\n\x0bRemoteShell\x12:\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCodeB\x05\x92?\x02\x38\x08\x12\x12\n\nsession_id\x18\x02 \x01(\x07\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\x13\n\x04\x63ols\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x04rows\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05\x66lags\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\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\"C\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x0e\n\nFLAG_GRANT\x10\x01\x12\r\n\tFLAG_MORE\x10\x02\x12\x0c\n\x08\x46LAG_RTS\x10\x04\"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\"\xb9\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(\r\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\x1b\n\x0cnotify_flags\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\"b\n\x0bNotifyFlags\x12\x0f\n\x0bNOTIFY_NONE\x10\x00\x12\x13\n\x0fNOTIFY_ON_ENTER\x10\x01\x12\x12\n\x0eNOTIFY_ON_EXIT\x10\x02\x12\x19\n\x15NOTIFY_FAVORITES_ONLY\x10\x04\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\"T\n\rInjectedFrame\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\x80\x02\"~\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x02 \x01(\r\x12\x37\n\tneighbors\x18\x03 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\">\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\x07\x12\x0b\n\x03snr\x18\x02 \x01(\x11\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x42`\n\x14org.meshtastic.protoB\nWireProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -96,39 +96,39 @@ _globals['_USER']._serialized_start=867 _globals['_USER']._serialized_end=1062 _globals['_ROUTING']._serialized_start=1065 - _globals['_ROUTING']._serialized_end=1533 + _globals['_ROUTING']._serialized_end=1564 _globals['_ROUTING_ERROR']._serialized_start=1163 - _globals['_ROUTING_ERROR']._serialized_end=1522 - _globals['_DATA']._serialized_start=1536 - _globals['_DATA']._serialized_end=1827 - _globals['_DATA_BITFIELD']._serialized_start=1732 - _globals['_DATA_BITFIELD']._serialized_end=1814 - _globals['_KEYVERIFICATION']._serialized_start=1829 - _globals['_KEYVERIFICATION']._serialized_end=1905 - _globals['_HEADEROPTIONS']._serialized_start=1908 - _globals['_HEADEROPTIONS']._serialized_end=2093 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=2019 - _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2093 - _globals['_REMOTESHELL']._serialized_start=2096 - _globals['_REMOTESHELL']._serialized_end=2565 - _globals['_REMOTESHELL_OPCODE']._serialized_start=2353 - _globals['_REMOTESHELL_OPCODE']._serialized_end=2496 - _globals['_REMOTESHELL_FLAGS']._serialized_start=2498 - _globals['_REMOTESHELL_FLAGS']._serialized_end=2565 - _globals['_BOUNDINGBOX']._serialized_start=2567 - _globals['_BOUNDINGBOX']._serialized_end=2684 - _globals['_WAYPOINT']._serialized_start=2687 - _globals['_WAYPOINT']._serialized_end=3128 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=2982 - _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3080 - _globals['_STATUSMESSAGE']._serialized_start=3130 - _globals['_STATUSMESSAGE']._serialized_end=3168 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3171 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3302 - _globals['_INJECTEDFRAME']._serialized_start=3304 - _globals['_INJECTEDFRAME']._serialized_end=3388 - _globals['_NEIGHBORINFO']._serialized_start=3390 - _globals['_NEIGHBORINFO']._serialized_end=3516 - _globals['_NEIGHBOR']._serialized_start=3518 - _globals['_NEIGHBOR']._serialized_end=3580 + _globals['_ROUTING_ERROR']._serialized_end=1553 + _globals['_DATA']._serialized_start=1567 + _globals['_DATA']._serialized_end=1858 + _globals['_DATA_BITFIELD']._serialized_start=1763 + _globals['_DATA_BITFIELD']._serialized_end=1845 + _globals['_KEYVERIFICATION']._serialized_start=1860 + _globals['_KEYVERIFICATION']._serialized_end=1936 + _globals['_HEADEROPTIONS']._serialized_start=1939 + _globals['_HEADEROPTIONS']._serialized_end=2124 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_start=2050 + _globals['_HEADEROPTIONS_HOPFLAGS']._serialized_end=2124 + _globals['_REMOTESHELL']._serialized_start=2127 + _globals['_REMOTESHELL']._serialized_end=2596 + _globals['_REMOTESHELL_OPCODE']._serialized_start=2384 + _globals['_REMOTESHELL_OPCODE']._serialized_end=2527 + _globals['_REMOTESHELL_FLAGS']._serialized_start=2529 + _globals['_REMOTESHELL_FLAGS']._serialized_end=2596 + _globals['_BOUNDINGBOX']._serialized_start=2598 + _globals['_BOUNDINGBOX']._serialized_end=2715 + _globals['_WAYPOINT']._serialized_start=2718 + _globals['_WAYPOINT']._serialized_end=3159 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_start=3013 + _globals['_WAYPOINT_NOTIFYFLAGS']._serialized_end=3111 + _globals['_STATUSMESSAGE']._serialized_start=3161 + _globals['_STATUSMESSAGE']._serialized_end=3199 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3202 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3333 + _globals['_INJECTEDFRAME']._serialized_start=3335 + _globals['_INJECTEDFRAME']._serialized_end=3419 + _globals['_NEIGHBORINFO']._serialized_start=3421 + _globals['_NEIGHBORINFO']._serialized_end=3547 + _globals['_NEIGHBOR']._serialized_start=3549 + _globals['_NEIGHBOR']._serialized_end=3611 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/wire_pb2.pyi b/meshtastic/protobuf/wire_pb2.pyi index aac7bf2ea..f0c280a2f 100644 --- a/meshtastic/protobuf/wire_pb2.pyi +++ b/meshtastic/protobuf/wire_pb2.pyi @@ -286,10 +286,11 @@ class User(_message.Message): """ Current X25519 ratchet public key, present only while this node has forward secrecy for direct messages enabled (SecurityConfig.ratchet_flags). Rotated every - ratchet_interval_secs. A receiver keeps the newest key it has seen for this node and - discards it once it is older than the sender's retention window, after which it falls - back to the static derivation. Authenticated by the XEdDSA signature on the NodeInfo - that carries it: an unsigned NodeInfo's ratchet key is ignored. + ratchet_interval_secs. A receiver keeps the three newest keys it has seen for this node, + sends with the newest for (K - 1) days after it first saw it, and falls back to the + static derivation after that. A key counts only from a NodeInfo whose XEdDSA signature + verified or that decrypted under the sender's static key; a NodeInfo of either kind + without the field means the node stopped publishing one. Never in a NodeRecord. """ def __init__( self, @@ -404,6 +405,12 @@ class Routing(_message.Message): PKI encryption failed, due to no public key for the remote node. This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet. """ + PKI_SEND_FAIL_RATCHET_KEY: Routing._Error.ValueType # 40 + """ + REQUIRE_RATCHET_WHEN_KNOWN refused a direct message: the destination has published a + ratchet key, but this node holds no fresh one for it. Local, never on the air. The node + asks the destination for its NodeInfo, so a later attempt can succeed. + """ class Error(_Error, metaclass=_ErrorEnumTypeWrapper): """ @@ -487,6 +494,12 @@ class Routing(_message.Message): PKI encryption failed, due to no public key for the remote node. This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet. """ + PKI_SEND_FAIL_RATCHET_KEY: Routing.Error.ValueType # 40 + """ + REQUIRE_RATCHET_WHEN_KNOWN refused a direct message: the destination has published a + ratchet key, but this node holds no fresh one for it. Local, never on the air. The node + asks the destination for its NodeInfo, so a later attempt can succeed. + """ ERROR_REASON_FIELD_NUMBER: _builtins.int ACK_PROOF_FIELD_NUMBER: _builtins.int @@ -508,8 +521,9 @@ class Routing(_message.Message): ack_proof = HMAC-SHA256(shared_key, "ack" | LE32(from) | LE32(to) | LE32(request_id) | routing)[0..8) - where shared_key is the SHA256(X25519(sender_private, receiver_public)) that PKI packet - encryption uses, and `routing` is this encoded Routing message without this field. On a + where shared_key is SHA256(X25519(sender_private, receiver_public)), the static PKI + derivation, also when the acknowledged message used the ratchet, and `routing` is this + encoded Routing message without this field. On a reply to an anycast request it is the key the request was sealed with, SHA256(X25519(group_private, sender_public)), and `from` is the member that answered. diff --git a/meshtastic/tests/test_ratchet.py b/meshtastic/tests/test_ratchet.py new file mode 100644 index 000000000..fabf908a9 --- /dev/null +++ b/meshtastic/tests/test_ratchet.py @@ -0,0 +1,35 @@ +"""Direct-message forward secrecy: the settings by name and the per-node column.""" + +import pytest + +from meshtastic.__main__ import setPref +from meshtastic.mesh_interface import MeshInterface +from meshtastic.protobuf import localonly_pb2 + + +@pytest.mark.unit +def test_ratchet_settings_set_by_name(): + config = localonly_pb2.LocalConfig() + assert setPref(config, "security.ratchet_enabled", "true") + assert setPref(config, "security.require_ratchet_when_known", "true") + assert setPref(config, "security.ratchet_interval_secs", "7200") + assert config.security.ratchet_flags == 0x03 + assert config.security.ratchet_interval_secs == 7200 + assert setPref(config, "security.require_ratchet_when_known", "false") + assert config.security.ratchet_flags == 0x01 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_show_nodes_marks_nodes_with_a_ratchet_key(): + iface = MeshInterface(noProto=True) + iface.nodesByNum = { + 1: {"num": 1, "user": {"id": "!00000001", "longName": "Ratchet Node"}, "lastHeard": 2, "hasRatchet": True}, + 2: {"num": 2, "user": {"id": "!00000002", "longName": "Static Node"}, "lastHeard": 1}, + } + table = iface.showNodes(showFields=["user.longName", "hasRatchet"]) + lines = table.splitlines() + assert "Ratchet" in lines[1] + assert "*" in next(line for line in lines if "Ratchet Node" in line) + assert "*" not in next(line for line in lines if "Static Node" in line) + iface.close() diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index 7ccb22718..533b30091 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -907,10 +907,11 @@ def test_to_node_num_hypothesis_roundtrip(n): "CAPABILITY_HAS_ETHERNET", "CAPABILITY_HAS_REMOTE_HARDWARE", "CAPABILITY_HAS_PKC", "CAPABILITY_HAS_XEDDSA", ]), - # bit 7 is beyond every currently-defined Capabilities value, so it + # bit 8 is beyond every currently-defined Capabilities value, so it # exercises the unknown-remainder path - (_CAPABILITIES, 0x80, ["UNKNOWN_ADDITIONAL_FLAGS(128)"]), - (_CAPABILITIES, 0x81, ["CAPABILITY_CAN_SHUTDOWN", "UNKNOWN_ADDITIONAL_FLAGS(128)"]), + (_CAPABILITIES, 0x80, ["CAPABILITY_HAS_RATCHET"]), + (_CAPABILITIES, 0x100, ["UNKNOWN_ADDITIONAL_FLAGS(256)"]), + (_CAPABILITIES, 0x101, ["CAPABILITY_CAN_SHUTDOWN", "UNKNOWN_ADDITIONAL_FLAGS(256)"]), (_POSITION_FLAGS, 0, []), (_POSITION_FLAGS, 0x09, ["ALTITUDE", "DOP"]), (_POSITION_FLAGS, 0x36D, [ diff --git a/protobufs b/protobufs index 194bfce3e..d8c40647d 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 194bfce3e21528bd7b64eebe276939684f7b5328 +Subproject commit d8c40647d5acace000466582760c5ad2f76ba7a9 From 4e74fa67a60476e515437ebdc411c1092f73d4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Thu, 8 Oct 2026 17:47:20 +0200 Subject: [PATCH 22/24] Request named sensor quantities and decode multi-word presence bitmaps Regenerate for unified sensor telemetry, the sensor read interval and the discovery backhaul. sensor_readings_to_list reads ceil(keys / 32) present words per sample. sendTelemetry takes quantities for a sensor_readings request and the CLI accepts --request-telemetry sensors:NAME,NAME; the per-category aliases are gone. A sensor_readings reply keeps its handler for the following parts. --- meshtastic/__main__.py | 21 +++--- meshtastic/mesh_interface.py | 8 ++- meshtastic/protobuf/bitfields.py | 12 +--- meshtastic/protobuf/discovery_pb2.pyi | 12 ++-- meshtastic/protobuf/module_config_pb2.py | 80 +++++++++++------------ meshtastic/protobuf/module_config_pb2.pyi | 79 ++++++++++------------ meshtastic/protobuf/role_registry_pb2.py | 12 ++-- meshtastic/protobuf/role_registry_pb2.pyi | 20 +++--- meshtastic/protobuf/telemetry_pb2.py | 42 ++++++------ meshtastic/protobuf/telemetry_pb2.pyi | 35 ++++++---- meshtastic/tests/test_util.py | 19 ++++++ meshtastic/util.py | 7 +- protobufs | 2 +- 13 files changed, 185 insertions(+), 164 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 509b17675..d955e783e 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -65,7 +65,7 @@ have_powermon = False powermon_exception = e meter = None -from meshtastic.protobuf import admin_pb2, channel_pb2, clientonly_pb2, common_pb2, config_pb2, portnums_pb2 +from meshtastic.protobuf import admin_pb2, channel_pb2, clientonly_pb2, common_pb2, config_pb2, portnums_pb2, telemetry_pb2 from meshtastic.version import get_active_version logger = logging.getLogger(__name__) @@ -706,21 +706,22 @@ def onConnected(interface): else: channelIndex = mt_config.channel_index or 0 if checkChannel(interface, channelIndex): - # 3.0 carries environment, air quality, power and health as one SensorReadings list telemMap = { "device": "device_metrics", "sensors": "sensor_readings", - "environment": "sensor_readings", - "air_quality": "sensor_readings", - "airquality": "sensor_readings", - "power": "sensor_readings", - "health": "sensor_readings", "localstats": "local_stats", "local_stats": "local_stats", "host": "host_metrics", "traffic": "traffic_management_stats", } - telemType = telemMap.get(args.request_telemetry, "device_metrics") + # sensors:CO2_PPM,AIR_TEMPERATURE_C_CENTI asks for those quantities only + kind, _, named = args.request_telemetry.partition(":") + telemType = telemMap.get(kind, "device_metrics") + quantity = telemetry_pb2.SensorReadings.Quantity + try: + quantities = [quantity.Value(n.strip().upper()) for n in named.split(",") if n.strip()] + except ValueError as e: + meshtastic.util.our_exit(f"ERROR: {e}") print( f"Sending {telemType} telemetry request to {args.dest} on channelIndex:{channelIndex} (this could take a while)" ) @@ -729,6 +730,7 @@ def onConnected(interface): wantResponse=True, channelIndex=channelIndex, telemetryType=telemType, + quantities=quantities, ) if args.request_position: @@ -2381,7 +2383,8 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar group.add_argument( "--request-telemetry", help="Request telemetry from a node. With an argument, requests that specific type of telemetry: " - "device, sensors (environment, air quality, power and health), local_stats, host or traffic. " + "device, sensors, local_stats, host or traffic. sensors:NAME,NAME asks for the named " + "SensorReadings quantities only (e.g. sensors:CO2_PPM,AIR_TEMPERATURE_C_CENTI). " "You need to pass the destination ID as argument with '--dest'.", action="store", nargs="?", diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 6251ec3cf..a622be2a6 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -761,16 +761,20 @@ def sendTelemetry( channelIndex: int = 0, telemetryType: str = "device_metrics", hopLimit: Optional[int]=None, + quantities: Optional[List[int]]=None, ): """Send telemetry and optionally ask for a response. telemetryType names a Telemetry variant: device_metrics (filled from our node), or sensor_readings, local_stats, host_metrics or traffic_management_stats, which - go out empty as a request.""" + go out empty as a request. A sensor_readings request asks for the SensorReadings + quantities listed, or for all the node has; the answer may take several messages.""" r = telemetry_pb2.Telemetry() if telemetryType in ("sensor_readings", "local_stats", "host_metrics", "traffic_management_stats"): getattr(r, telemetryType).SetInParent() + if telemetryType == "sensor_readings" and quantities: + r.sensor_readings.keys.extend(quantities) else: # fall through to device metrics if self.nodesByNum is not None: node = self.nodesByNum.get(self.localNode.nodeNum) @@ -832,6 +836,8 @@ def onResponseTelemetry(self, p: dict): if m.HasField("uptime_minutes"): print(f"Uptime: {m.uptime_minutes} min") elif telemetry.HasField("sensor_readings"): + # The rest of a long answer follows under the same request id + self._addResponseHandler(p["decoded"]["requestId"], self.onResponseTelemetry) for sample in sensor_readings_to_list(telemetry.sensor_readings, telemetry.time): print(f"sensorReadings at {sample.pop('time')}:") for name, value in sample.items(): diff --git a/meshtastic/protobuf/bitfields.py b/meshtastic/protobuf/bitfields.py index 5c25285ba..46e5f19c8 100644 --- a/meshtastic/protobuf/bitfields.py +++ b/meshtastic/protobuf/bitfields.py @@ -211,15 +211,9 @@ 'want_ack': ('flags', 8), 'xeddsa_signed': ('flags', 32)}, 'TAKConfig': {'tak_enabled': ('flags', 1)}, - 'TelemetryConfig': {'air_quality': ('flags', 8), - 'air_quality_screen': ('flags', 16), - 'device': ('flags', 512), - 'environment_measurement': ('flags', 1), - 'environment_screen': ('flags', 2), - 'health_measurement': ('flags', 128), - 'health_screen': ('flags', 256), - 'power_measurement': ('flags', 32), - 'power_screen': ('flags', 64)}, + 'TelemetryConfig': {'device': ('flags', 4), + 'sensors': ('flags', 1), + 'sensors_screen': ('flags', 2)}, 'User': {'has_is_unmessagable': ('flags', 256), 'has_ratchet': ('flags', 134217728), 'has_rf_hear': ('flags', 2048), diff --git a/meshtastic/protobuf/discovery_pb2.pyi b/meshtastic/protobuf/discovery_pb2.pyi index 85f051505..be4ac354f 100644 --- a/meshtastic/protobuf/discovery_pb2.pyi +++ b/meshtastic/protobuf/discovery_pb2.pyi @@ -286,9 +286,11 @@ class SyncDigest(_message.Message): of the record hashes per bucket, about 150 bytes in all, and a bucket whose count or hash differs is the only one worth transferring. - Servers exchange this over the mesh or a wired backhaul between co-located nodes. Not over - MQTT: a broker that aggregates every record of every mesh is a directory, which is a - different thing from a mesh that will answer a question about one node. + Servers exchange this over the mesh or a wired backhaul between co-located nodes. On the + backhaul (UDP multicast) a server broadcasts it at hop_limit 0 every hour, which also tells + co-located servers it exists, and they sync over the backhaul only. Not over MQTT: a broker + that aggregates every record of every mesh is a directory, which is a different thing from + a mesh that will answer a question about one node. """ DESCRIPTOR: _descriptor.Descriptor @@ -388,7 +390,9 @@ class DiscoveryMessage(_message.Message): @_builtins.property def publish(self) -> Global___NodeRecord: """ - A node announcing itself, or a server refreshing what it holds. + A node announcing itself, or a server publishing a record it holds for a node that did + not answer a broadcast query for it. A carried record is learned second-hand and never + filed by a server. """ @_builtins.property diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index 8fee692f3..cf11063fc 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_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/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\x9f\x02\n\x12NeighborInfoConfig\x12\x94\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x82\x01\xca\xf3\x18~:\x15Neighbor Info EnabledBeReport the directly heard neighbors to the connected client. The report never goes over LoRa or MQTT.\x12r\n\x14update_interval_secs\x18\x02 \x01(\rBT\xca\xf3\x18P*\x01s:\x0fUpdate IntervalB:How often to report neighbor info to the connected client.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xa9\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd5\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\tMS_CONFIG\x10\x07\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\x87\x08\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\"\x9e\x06\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12j\n!TELEMETRY_ENVIRONMENT_MEASUREMENT\x10\x01\x1a\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12i\n\x1cTELEMETRY_ENVIRONMENT_SCREEN\x10\x02\x1aG\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12Y\n\x15TELEMETRY_AIR_QUALITY\x10\x08\x1a>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12.\n\x1cTELEMETRY_AIR_QUALITY_SCREEN\x10\x10\x1a\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x12W\n\x1bTELEMETRY_POWER_MEASUREMENT\x10 \x1a\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12O\n\x16TELEMETRY_POWER_SCREEN\x10@\x1a\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12!\n\x1cTELEMETRY_HEALTH_MEASUREMENT\x10\x80\x01\x12\x1c\n\x17TELEMETRY_HEALTH_SCREEN\x10\x80\x02\x12\xb3\x01\n\x10TELEMETRY_DEVICE\x10\x80\x04\x1a\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\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xb4\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"K\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\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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/common.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x07\n\nMQTTConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x12\x34\n\x04root\x18\x05 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12\x43\n\x13map_report_settings\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.MapReportSettings\"\x9b\x05\n\x05\x46lags\x12\r\n\tMQTT_NONE\x10\x00\x12\x39\n\x0cMQTT_ENABLED\x10\x01\x1a\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12M\n\x0fMQTT_ENCRYPTION\x10\x02\x1a\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12W\n\x08MQTT_TLS\x10\x04\x1aI\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12t\n\x14MQTT_PROXY_TO_CLIENT\x10\x08\x1aZ\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xa9\x02\n\x12MQTT_MAP_REPORTING\x10\x10\x1a\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.\"\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\"\xb3\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\x12\x1f\n\x0e\x61uthorized_key\x18\x04 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\"\x9f\x02\n\x12NeighborInfoConfig\x12\x94\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x82\x01\xca\xf3\x18~:\x15Neighbor Info EnabledBeReport the directly heard neighbors to the connected client. The report never goes over LoRa or MQTT.\x12r\n\x14update_interval_secs\x18\x02 \x01(\rBT\xca\xf3\x18P*\x01s:\x0fUpdate IntervalB:How often to report neighbor info to the connected client.\"\xc4\x0b\n\x15\x44\x65tectionSensorConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x04name\x18\x04 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x05 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x85\x01\n\x16\x64\x65tection_trigger_type\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\"\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\"\xd8\x04\n\x05\x46lags\x12\x12\n\x0e\x44\x45TECTION_NONE\x10\x00\x12\x89\x02\n\x11\x44\x45TECTION_ENABLED\x10\x01\x1a\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\x82\x01\n\x13\x44\x45TECTION_SEND_BELL\x10\x02\x1ai\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\xa9\x01\n\x14\x44\x45TECTION_USE_PULLUP\x10\x04\x1a\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\"\xde\x06\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\xc6\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32+.meshtastic.protobuf.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\"\xb5\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\x1f\n\x0b\x43ODEC2_700C\x10\x07\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\x08\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\"\xae\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\x88\x01\n\x1fpaxcounter_update_interval_secs\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(\x11\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x11\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\"\xf1\x03\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x01 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12\x65\n\x16rate_limit_window_secs\x18\x02 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\x03 \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x04 \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.\"\xa9\x0b\n\x0cSerialConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x03rxd\x18\x02 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x03 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12Y\n\x04\x62\x61ud\x18\x04 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12i\n\ntimeout_ms\x18\x05 \x01(\rBU\xca\xf3\x18Q*\x02ms:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12\x65\n\x04mode\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\"\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\"\xd5\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\tMS_CONFIG\x10\x07\"\xd9\x01\n\x05\x46lags\x12\x0f\n\x0bSERIAL_NONE\x10\x00\x12>\n\x0eSERIAL_ENABLED\x10\x01\x1a*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12]\n\x0bSERIAL_ECHO\x10\x02\x1aL\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12 \n\x1cSERIAL_OVERRIDE_CONSOLE_PORT\x10\x04\"\xd7\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.\x12\x13\n\x0b\x61lert_flags\x18\x04 \x01(\r\x12R\n\x0coutput_vibra\x18\x05 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\x06 \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12U\n\x10nag_timeout_secs\x18\x07 \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\"\xff\x08\n\nAlertFlags\x12\x0e\n\nALERT_NONE\x10\x00\x12s\n\x0c\x41LERT_ACTIVE\x10\x01\x1a\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12R\n\rALERT_MESSAGE\x10\x02\x1a?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x61\n\x13\x41LERT_MESSAGE_VIBRA\x10\x04\x1aH\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12\x64\n\x14\x41LERT_MESSAGE_BUZZER\x10\x08\x1aJ\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12J\n\nALERT_BELL\x10\x10\x1a:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12\x63\n\x10\x41LERT_BELL_VIBRA\x10 \x1aM\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12\\\n\x11\x41LERT_BELL_BUZZER\x10@\x1a\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xf1\x01\n\rALERT_USE_PWM\x10\x80\x01\x1a\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.\x12\xcb\x01\n\x17\x41LERT_USE_I2S_AS_BUZZER\x10\x80\x02\x1a\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.\"\x9e\x05\n\x12StoreForwardConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rstorage_bytes\x18\x02 \x01(\r\x12\x1b\n\x0cmax_per_sync\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\rannounce_secs\x18\x04 \x01(\r\x12\x1e\n\rserved_hashes\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\x12\x1d\n\x15\x64iscovery_max_records\x18\x06 \x01(\r\x12\x17\n\x0frecord_ttl_secs\x18\x07 \x01(\r\x12\'\n\x18\x64iscovery_admit_per_hour\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\"\xa5\x03\n\x05\x46lags\x12\x15\n\x11STOREFORWARD_NONE\x10\x00\x12`\n\x14STOREFORWARD_ENABLED\x10\x01\x1a\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12\x66\n\x16STOREFORWARD_HEARTBEAT\x10\x02\x1aJ\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12\x80\x01\n\x16STOREFORWARD_IS_SERVER\x10\x04\x1a\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x12\x1c\n\x18STOREFORWARD_KEEP_FILLER\x10\x08\x12\x1a\n\x16STOREFORWARD_NO_DIRECT\x10\x10\"\xc6\x05\n\x0fTelemetryConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x10\x12w\n\x1b\x64\x65vice_update_interval_secs\x18\x02 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x44\n\x1bsensor_update_interval_secs\x18\x03 \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Sensor Update Interval\x12@\n\x19sensor_read_interval_secs\x18\x04 \x01(\rB\x1d\xca\xf3\x18\x19*\x01s:\x14Sensor Read Interval\"\x9b\x03\n\x05\x46lags\x12\x12\n\x0eTELEMETRY_NONE\x10\x00\x12h\n\x11TELEMETRY_SENSORS\x10\x01\x1aQ\xca\xf3\x18M:\x18Sensor Telemetry EnabledB1Read the attached sensors and send their readings\x12g\n\x18TELEMETRY_SENSORS_SCREEN\x10\x02\x1aI\xca\xf3\x18\x45:\x15Show on device screenB,Display the latest sensor readings on device\x12\xaa\x01\n\x10TELEMETRY_DEVICE\x10\x04\x1a\x93\x01\xca\xf3\x18\x8e\x01:\x18\x42roadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.\"\xb0\x07\n\x13\x43\x61nnedMessageConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\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\x85\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\x96\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x80\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32%.meshtastic.protobuf.InputBrokerEventB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\"\xeb\x01\n\x05\x46lags\x12\x12\n\x0e\x43\x41NNEDMSG_NONE\x10\x00\x12<\n\x11\x43\x41NNEDMSG_ROTARY1\x10\x01\x1a%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12\x43\n\x11\x43\x41NNEDMSG_UPDOWN1\x10\x02\x1a,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12K\n\x13\x43\x41NNEDMSG_SEND_BELL\x10\x04\x1a\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\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\"1\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\xb4\x06\n\x10MeshBeaconConfig\x12\x14\n\x05\x66lags\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12L\n\x11\x62roadcast_message\x18\x02 \x01(\tB1\x92?\x02\x08\x65\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x03 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12\x46\n\x16\x62roadcast_offer_region\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12L\n\x16\x62roadcast_offer_preset\x18\x05 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x06 \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12W\n\x11\x62roadcast_targets\x18\x07 \x03(\x0b\x32\x35.meshtastic.protobuf.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\xc7\x01\n\x0f\x42roadcastTarget\x12<\n\x06preset\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.ModemPresetB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x36\n\x06region\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.RegionCodeB\x05\x92?\x02\x38\x08\x12!\n\rchannel_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08H\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"K\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\x42\x19\n\x17_broadcast_offer_preset\"\xc6\x02\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 role\x12\x14\n\x05\x66lags\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\x91\x01\n\x05\x46lags\x12\x0c\n\x08TAK_NONE\x10\x00\x12z\n\x0bTAK_ENABLED\x10\x01\x1ai\xca\xf3\x18\x65:\x0bTAK EnabledBVExchange CoT with the Meshtastic ATAK plugin. A tracker sends its position as TAK PLI.\"{\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\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\x07\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"\xda\x08\n\x13ModuleConfigPayload\x12/\n\x04mqtt\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MQTTConfigH\x00\x12\x33\n\x06serial\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SerialConfigH\x00\x12P\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32/.meshtastic.protobuf.ExternalNotificationConfigH\x00\x12@\n\rstore_forward\x18\x04 \x01(\x0b\x32\'.meshtastic.protobuf.StoreForwardConfigH\x00\x12\x39\n\ttelemetry\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.TelemetryConfigH\x00\x12\x42\n\x0e\x63\x61nned_message\x18\x06 \x01(\x0b\x32(.meshtastic.protobuf.CannedMessageConfigH\x00\x12\x31\n\x05\x61udio\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.AudioConfigH\x00\x12\x44\n\x0fremote_hardware\x18\x08 \x01(\x0b\x32).meshtastic.protobuf.RemoteHardwareConfigH\x00\x12@\n\rneighbor_info\x18\t \x01(\x0b\x32\'.meshtastic.protobuf.NeighborInfoConfigH\x00\x12\x46\n\x10\x61mbient_lighting\x18\n \x01(\x0b\x32*.meshtastic.protobuf.AmbientLightingConfigH\x00\x12\x46\n\x10\x64\x65tection_sensor\x18\x0b \x01(\x0b\x32*.meshtastic.protobuf.DetectionSensorConfigH\x00\x12;\n\npaxcounter\x18\x0c \x01(\x0b\x32%.meshtastic.protobuf.PaxcounterConfigH\x00\x12O\n\rstatusmessage\x18\r \x01(\x0b\x32(.meshtastic.protobuf.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12W\n\x12traffic_management\x18\x0e \x01(\x0b\x32,.meshtastic.protobuf.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12:\n\x03tak\x18\x0f \x01(\x0b\x32\x1e.meshtastic.protobuf.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12I\n\x0bmesh_beacon\x18\x10 \x01(\x0b\x32%.meshtastic.protobuf.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x42\x11\n\x0fpayload_variant*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) @@ -241,26 +241,20 @@ _globals['_STOREFORWARDCONFIG'].fields_by_name['served_hashes']._serialized_options = b'\222?\004\020\0208\010' _globals['_STOREFORWARDCONFIG'].fields_by_name['discovery_admit_per_hour']._options = None _globals['_STOREFORWARDCONFIG'].fields_by_name['discovery_admit_per_hour']._serialized_options = b'\222?\0028\020' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_MEASUREMENT"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_MEASUREMENT"]._serialized_options = b'\312\363\030?:\033Environment Metrics EnabledB Collect environment measurements' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_SCREEN"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_ENVIRONMENT_SCREEN"]._serialized_options = b'\312\363\030C:\025Show on device screenB*Display environment measurements on device' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY"]._serialized_options = b'\312\363\030::\033Air Quality Metrics EnabledB\033Collect air quality metrics' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY_SCREEN"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_AIR_QUALITY_SCREEN"]._serialized_options = b'\312\363\030\010R\0062.7.18' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_MEASUREMENT"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_MEASUREMENT"]._serialized_options = b'\312\363\0302:\031Power Measurement EnabledB\025Collect power metrics' - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_SCREEN"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_POWER_SCREEN"]._serialized_options = b'\312\363\030/:\014Power ScreenB\037Display power metrics on device' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_SENSORS"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_SENSORS"]._serialized_options = b'\312\363\030M:\030Sensor Telemetry EnabledB1Read the attached sensors and send their readings' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_SENSORS_SCREEN"]._options = None + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_SENSORS_SCREEN"]._serialized_options = b'\312\363\030E:\025Show on device screenB,Display the latest sensor readings on device' _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._options = None - _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._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' + _globals['_TELEMETRYCONFIG_FLAGS'].values_by_name["TELEMETRY_DEVICE"]._serialized_options = b'\312\363\030\216\001:\030Broadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.' _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._options = None _globals['_TELEMETRYCONFIG'].fields_by_name['flags']._serialized_options = b'\222?\0028\020' _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval_secs']._options = None _globals['_TELEMETRYCONFIG'].fields_by_name['device_update_interval_secs']._serialized_options = b'\312\363\030N*\001s:\027Device Metrics IntervalB0How often device metrics are sent over the mesh.' _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_update_interval_secs']._options = None _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_update_interval_secs']._serialized_options = b'\312\363\030\033*\001s:\026Sensor Update Interval' + _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_read_interval_secs']._options = None + _globals['_TELEMETRYCONFIG'].fields_by_name['sensor_read_interval_secs']._serialized_options = b'\312\363\030\031*\001s:\024Sensor Read Interval' _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._options = None _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_ROTARY1"]._serialized_options = b'\312\363\030!:\010Rotary 1B\025Enable rotary encoder' _globals['_CANNEDMESSAGECONFIG_FLAGS'].values_by_name["CANNEDMSG_UPDOWN1"]._options = None @@ -331,8 +325,8 @@ _globals['_MODULECONFIGPAYLOAD'].fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._options = None _globals['_MODULECONFIGPAYLOAD'].fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14467 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14540 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=14146 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=14219 _globals['_MQTTCONFIG']._serialized_start=242 _globals['_MQTTCONFIG']._serialized_end=1235 _globals['_MQTTCONFIG_FLAGS']._serialized_start=568 @@ -374,31 +368,31 @@ _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_start=8904 _globals['_STOREFORWARDCONFIG_FLAGS']._serialized_end=9325 _globals['_TELEMETRYCONFIG']._serialized_start=9328 - _globals['_TELEMETRYCONFIG']._serialized_end=10359 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9561 - _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10359 - _globals['_CANNEDMESSAGECONFIG']._serialized_start=10362 - _globals['_CANNEDMESSAGECONFIG']._serialized_end=11306 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=11071 - _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=11306 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=11309 - _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=11924 - _globals['_STATUSMESSAGECONFIG']._serialized_start=11926 - _globals['_STATUSMESSAGECONFIG']._serialized_end=11975 - _globals['_MESHBEACONCONFIG']._serialized_start=11978 - _globals['_MESHBEACONCONFIG']._serialized_end=12798 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12495 - _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12694 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12696 - _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=12771 - _globals['_TAKCONFIG']._serialized_start=12801 - _globals['_TAKCONFIG']._serialized_end=13127 - _globals['_TAKCONFIG_FLAGS']._serialized_start=12982 - _globals['_TAKCONFIG_FLAGS']._serialized_end=13127 - _globals['_REMOTEHARDWAREPIN']._serialized_start=13129 - _globals['_REMOTEHARDWAREPIN']._serialized_end=13252 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=13254 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13348 - _globals['_MODULECONFIGPAYLOAD']._serialized_start=13351 - _globals['_MODULECONFIGPAYLOAD']._serialized_end=14465 + _globals['_TELEMETRYCONFIG']._serialized_end=10038 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_start=9627 + _globals['_TELEMETRYCONFIG_FLAGS']._serialized_end=10038 + _globals['_CANNEDMESSAGECONFIG']._serialized_start=10041 + _globals['_CANNEDMESSAGECONFIG']._serialized_end=10985 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_start=10750 + _globals['_CANNEDMESSAGECONFIG_FLAGS']._serialized_end=10985 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_start=10988 + _globals['_AMBIENTLIGHTINGCONFIG']._serialized_end=11603 + _globals['_STATUSMESSAGECONFIG']._serialized_start=11605 + _globals['_STATUSMESSAGECONFIG']._serialized_end=11654 + _globals['_MESHBEACONCONFIG']._serialized_start=11657 + _globals['_MESHBEACONCONFIG']._serialized_end=12477 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=12174 + _globals['_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=12373 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_start=12375 + _globals['_MESHBEACONCONFIG_FLAGS']._serialized_end=12450 + _globals['_TAKCONFIG']._serialized_start=12480 + _globals['_TAKCONFIG']._serialized_end=12806 + _globals['_TAKCONFIG_FLAGS']._serialized_start=12661 + _globals['_TAKCONFIG_FLAGS']._serialized_end=12806 + _globals['_REMOTEHARDWAREPIN']._serialized_start=12808 + _globals['_REMOTEHARDWAREPIN']._serialized_end=12931 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=12933 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=13027 + _globals['_MODULECONFIGPAYLOAD']._serialized_start=13030 + _globals['_MODULECONFIGPAYLOAD']._serialized_end=14144 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 40b51ff71..9d1d4c14c 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -1048,9 +1048,11 @@ class StoreForwardConfig(_message.Message): """ record_ttl_secs: _builtins.int """ - Seconds a discovery record survives without a refresh, after which it is evicted. This is - also how an identity retires: there is no tombstone to replay, so a node that stops - announcing simply ages out. 0 takes the default of 30 days. + Seconds a discovery record stays current without a refresh. After that it is expired: held + for one more such period, evicted before any current record, left out of digests and sync, + and served as TIER_EXPIRED only when nothing fresher matches. This is also how an identity + retires: there is no tombstone to replay, so a node that stops announcing simply ages out. + 0 takes the default of 30 days. """ discovery_admit_per_hour: _builtins.int """ @@ -1088,7 +1090,7 @@ Global___StoreForwardConfig: _TypeAlias = StoreForwardConfig # noqa: Y015 @_typing.final class TelemetryConfig(_message.Message): """ - Configuration for both device and environment metrics + Configuration for device metrics and sensor readings """ DESCRIPTOR: _descriptor.Descriptor @@ -1101,23 +1103,14 @@ class TelemetryConfig(_message.Message): DESCRIPTOR: _descriptor.EnumDescriptor TELEMETRY_NONE: TelemetryConfig._Flags.ValueType # 0 """Nothing enabled""" - TELEMETRY_ENVIRONMENT_MEASUREMENT: TelemetryConfig._Flags.ValueType # 1 - """Collect environment measurements""" - TELEMETRY_ENVIRONMENT_SCREEN: TelemetryConfig._Flags.ValueType # 2 - """Show environment measurements on the device screen""" - TELEMETRY_AIR_QUALITY: TelemetryConfig._Flags.ValueType # 8 - """Collect air quality metrics""" - TELEMETRY_AIR_QUALITY_SCREEN: TelemetryConfig._Flags.ValueType # 16 - """Show air quality metrics on the device screen""" - TELEMETRY_POWER_MEASUREMENT: TelemetryConfig._Flags.ValueType # 32 - """Collect power metrics""" - TELEMETRY_POWER_SCREEN: TelemetryConfig._Flags.ValueType # 64 - """Show power metrics on the device screen""" - TELEMETRY_HEALTH_MEASUREMENT: TelemetryConfig._Flags.ValueType # 128 - """Collect health metrics""" - TELEMETRY_HEALTH_SCREEN: TelemetryConfig._Flags.ValueType # 256 - """Show health metrics on the device screen""" - TELEMETRY_DEVICE: TelemetryConfig._Flags.ValueType # 512 + TELEMETRY_SENSORS: TelemetryConfig._Flags.ValueType # 1 + """ + Read every attached sensor and send its readings: environment, air quality, power, + health and the rest travel together as one SensorReadings stream. + """ + TELEMETRY_SENSORS_SCREEN: TelemetryConfig._Flags.ValueType # 2 + """Show the latest sensor readings on the device screen""" + TELEMETRY_DEVICE: TelemetryConfig._Flags.ValueType # 4 """ Send device telemetry to the mesh. Telemetry still goes to the connected phone or client over the API every minute regardless. @@ -1125,29 +1118,19 @@ class TelemetryConfig(_message.Message): class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): """ - Which telemetry sources are collected, sent and shown on screen: - a bitwise OR of Flags values. + Which telemetry is collected, sent and shown on screen: a bitwise OR of Flags values. """ TELEMETRY_NONE: TelemetryConfig.Flags.ValueType # 0 """Nothing enabled""" - TELEMETRY_ENVIRONMENT_MEASUREMENT: TelemetryConfig.Flags.ValueType # 1 - """Collect environment measurements""" - TELEMETRY_ENVIRONMENT_SCREEN: TelemetryConfig.Flags.ValueType # 2 - """Show environment measurements on the device screen""" - TELEMETRY_AIR_QUALITY: TelemetryConfig.Flags.ValueType # 8 - """Collect air quality metrics""" - TELEMETRY_AIR_QUALITY_SCREEN: TelemetryConfig.Flags.ValueType # 16 - """Show air quality metrics on the device screen""" - TELEMETRY_POWER_MEASUREMENT: TelemetryConfig.Flags.ValueType # 32 - """Collect power metrics""" - TELEMETRY_POWER_SCREEN: TelemetryConfig.Flags.ValueType # 64 - """Show power metrics on the device screen""" - TELEMETRY_HEALTH_MEASUREMENT: TelemetryConfig.Flags.ValueType # 128 - """Collect health metrics""" - TELEMETRY_HEALTH_SCREEN: TelemetryConfig.Flags.ValueType # 256 - """Show health metrics on the device screen""" - TELEMETRY_DEVICE: TelemetryConfig.Flags.ValueType # 512 + TELEMETRY_SENSORS: TelemetryConfig.Flags.ValueType # 1 + """ + Read every attached sensor and send its readings: environment, air quality, power, + health and the rest travel together as one SensorReadings stream. + """ + TELEMETRY_SENSORS_SCREEN: TelemetryConfig.Flags.ValueType # 2 + """Show the latest sensor readings on the device screen""" + TELEMETRY_DEVICE: TelemetryConfig.Flags.ValueType # 4 """ Send device telemetry to the mesh. Telemetry still goes to the connected phone or client over the API every minute regardless. @@ -1156,6 +1139,7 @@ class TelemetryConfig(_message.Message): FLAGS_FIELD_NUMBER: _builtins.int DEVICE_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int SENSOR_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int + SENSOR_READ_INTERVAL_SECS_FIELD_NUMBER: _builtins.int flags: _builtins.int """ Bitwise OR of Flags values. @@ -1167,10 +1151,14 @@ class TelemetryConfig(_message.Message): """ sensor_update_interval_secs: _builtins.int """ - Interval in seconds of how often we should try to send sensor readings to the - mesh. One interval covers every sensor category, since they now travel together - in a single SensorReadings list rather than one packet per category. - Which categories are collected at all is set by the flags above. + Seconds between sends of sensor readings to the mesh. 0 takes the default. + """ + sensor_read_interval_secs: _builtins.int + """ + Seconds between sensor reads. Readings taken between two sends are kept on the node + and go out together at the next send, as a batch of samples. 0, or a value at or + above sensor_update_interval_secs, reads once per send. Never more often than every + 60 s. """ def __init__( self, @@ -1178,10 +1166,11 @@ class TelemetryConfig(_message.Message): flags: _builtins.int = ..., device_update_interval_secs: _builtins.int = ..., sensor_update_interval_secs: _builtins.int = ..., + sensor_read_interval_secs: _builtins.int = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _Never # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["device_update_interval_secs", b"device_update_interval_secs", "flags", b"flags", "sensor_update_interval_secs", b"sensor_update_interval_secs"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["device_update_interval_secs", b"device_update_interval_secs", "flags", b"flags", "sensor_read_interval_secs", b"sensor_read_interval_secs", "sensor_update_interval_secs", b"sensor_update_interval_secs"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/meshtastic/protobuf/role_registry_pb2.py b/meshtastic/protobuf/role_registry_pb2.py index 6b382e940..8ca7d54e6 100644 --- a/meshtastic/protobuf/role_registry_pb2.py +++ b/meshtastic/protobuf/role_registry_pb2.py @@ -16,7 +16,7 @@ from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/role_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\"W\n\x08RoleInfo\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xcc\x06\n\x0cRoleDefaults\x12\x17\n\x0freset_intervals\x18\x01 \x01(\x08\x12P\n\x10rebroadcast_mode\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeH\x00\x88\x01\x01\x12%\n\x18node_info_broadcast_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x12$\n\x17position_broadcast_secs\x18\x04 \x01(\rH\x02\x88\x01\x01\x12-\n position_broadcast_smart_enabled\x18\x05 \x01(\x08H\x03\x88\x01\x01\x12-\n broadcast_smart_minimum_distance\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x32\n%broadcast_smart_minimum_interval_secs\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eposition_flags\x18\x08 \x01(\rH\x06\x88\x01\x01\x12(\n\x1b\x64\x65vice_update_interval_secs\x18\t \x01(\rH\x07\x88\x01\x01\x12(\n\x1bsensor_update_interval_secs\x18\n \x01(\rH\x08\x88\x01\x01\x12$\n\x17\x65nvironment_measurement\x18\x0b \x01(\x08H\t\x88\x01\x01\x12\x19\n\x0cunmessagable\x18\x0c \x01(\x08H\n\x88\x01\x01\x42\x13\n\x11_rebroadcast_modeB\x1b\n\x19_node_info_broadcast_secsB\x1a\n\x18_position_broadcast_secsB#\n!_position_broadcast_smart_enabledB#\n!_broadcast_smart_minimum_distanceB(\n&_broadcast_smart_minimum_interval_secsB\x11\n\x0f_position_flagsB\x1e\n\x1c_device_update_interval_secsB\x1e\n\x1c_sensor_update_interval_secsB\x1a\n\x18_environment_measurementB\x0f\n\r_unmessagable\"\xc5\x01\n\nRolePreset\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\'\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x0c\x64\x65vice_flags\x18\x05 \x01(\r\x12\x11\n\ttak_flags\x18\x06 \x01(\r\x12\x33\n\x08\x64\x65\x66\x61ults\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.RoleDefaults\"\x80\x01\n\x0cRoleRegistry\x12\x10\n\x08revision\x18\x01 \x01(\r\x12,\n\x05roles\x18\x02 \x03(\x0b\x32\x1d.meshtastic.protobuf.RoleInfo\x12\x30\n\x07presets\x18\x03 \x03(\x0b\x32\x1f.meshtastic.protobuf.RolePresetBh\n\x14org.meshtastic.protoB\x12RoleRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/role_registry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/common.proto\x1a meshtastic/protobuf/config.proto\"W\n\x08RoleInfo\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xbe\x06\n\x0cRoleDefaults\x12\x17\n\x0freset_intervals\x18\x01 \x01(\x08\x12P\n\x10rebroadcast_mode\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.DeviceConfig.RebroadcastModeH\x00\x88\x01\x01\x12%\n\x18node_info_broadcast_secs\x18\x03 \x01(\rH\x01\x88\x01\x01\x12$\n\x17position_broadcast_secs\x18\x04 \x01(\rH\x02\x88\x01\x01\x12-\n position_broadcast_smart_enabled\x18\x05 \x01(\x08H\x03\x88\x01\x01\x12-\n broadcast_smart_minimum_distance\x18\x06 \x01(\rH\x04\x88\x01\x01\x12\x32\n%broadcast_smart_minimum_interval_secs\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eposition_flags\x18\x08 \x01(\rH\x06\x88\x01\x01\x12(\n\x1b\x64\x65vice_update_interval_secs\x18\t \x01(\rH\x07\x88\x01\x01\x12(\n\x1bsensor_update_interval_secs\x18\n \x01(\rH\x08\x88\x01\x01\x12\x1d\n\x10sensor_telemetry\x18\x0b \x01(\x08H\t\x88\x01\x01\x12\x19\n\x0cunmessagable\x18\x0c \x01(\x08H\n\x88\x01\x01\x42\x13\n\x11_rebroadcast_modeB\x1b\n\x19_node_info_broadcast_secsB\x1a\n\x18_position_broadcast_secsB#\n!_position_broadcast_smart_enabledB#\n!_broadcast_smart_minimum_distanceB(\n&_broadcast_smart_minimum_interval_secsB\x11\n\x0f_position_flagsB\x1e\n\x1c_device_update_interval_secsB\x1e\n\x1c_sensor_update_interval_secsB\x13\n\x11_sensor_telemetryB\x0f\n\r_unmessagable\"\xc5\x01\n\nRolePreset\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\'\n\x04role\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Role\x12\x14\n\x0c\x64\x65vice_flags\x18\x05 \x01(\r\x12\x11\n\ttak_flags\x18\x06 \x01(\r\x12\x33\n\x08\x64\x65\x66\x61ults\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.RoleDefaults\"\x80\x01\n\x0cRoleRegistry\x12\x10\n\x08revision\x18\x01 \x01(\r\x12,\n\x05roles\x18\x02 \x03(\x0b\x32\x1d.meshtastic.protobuf.RoleInfo\x12\x30\n\x07presets\x18\x03 \x03(\x0b\x32\x1f.meshtastic.protobuf.RolePresetBh\n\x14org.meshtastic.protoB\x12RoleRegistryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -27,9 +27,9 @@ _globals['_ROLEINFO']._serialized_start=132 _globals['_ROLEINFO']._serialized_end=219 _globals['_ROLEDEFAULTS']._serialized_start=222 - _globals['_ROLEDEFAULTS']._serialized_end=1066 - _globals['_ROLEPRESET']._serialized_start=1069 - _globals['_ROLEPRESET']._serialized_end=1266 - _globals['_ROLEREGISTRY']._serialized_start=1269 - _globals['_ROLEREGISTRY']._serialized_end=1397 + _globals['_ROLEDEFAULTS']._serialized_end=1052 + _globals['_ROLEPRESET']._serialized_start=1055 + _globals['_ROLEPRESET']._serialized_end=1252 + _globals['_ROLEREGISTRY']._serialized_start=1255 + _globals['_ROLEREGISTRY']._serialized_end=1383 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/role_registry_pb2.pyi b/meshtastic/protobuf/role_registry_pb2.pyi index 34729b1e5..9981fda88 100644 --- a/meshtastic/protobuf/role_registry_pb2.pyi +++ b/meshtastic/protobuf/role_registry_pb2.pyi @@ -81,7 +81,7 @@ class RoleDefaults(_message.Message): POSITION_FLAGS_FIELD_NUMBER: _builtins.int DEVICE_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int SENSOR_UPDATE_INTERVAL_SECS_FIELD_NUMBER: _builtins.int - ENVIRONMENT_MEASUREMENT_FIELD_NUMBER: _builtins.int + SENSOR_TELEMETRY_FIELD_NUMBER: _builtins.int UNMESSAGABLE_FIELD_NUMBER: _builtins.int reset_intervals: _builtins.bool """Restore every broadcast, telemetry and power interval to its default before the values below""" @@ -95,8 +95,8 @@ class RoleDefaults(_message.Message): """Bitwise OR of PositionConfig.PositionFlags values""" device_update_interval_secs: _builtins.int sensor_update_interval_secs: _builtins.int - environment_measurement: _builtins.bool - """TelemetryConfig environment measurement on or off""" + sensor_telemetry: _builtins.bool + """TelemetryConfig TELEMETRY_SENSORS on or off""" unmessagable: _builtins.bool """Advertise the node as not taking direct messages (NODE_FLAG_IS_UNMESSAGABLE)""" def __init__( @@ -112,12 +112,12 @@ class RoleDefaults(_message.Message): position_flags: _builtins.int | None = ..., device_update_interval_secs: _builtins.int | None = ..., sensor_update_interval_secs: _builtins.int | None = ..., - environment_measurement: _builtins.bool | None = ..., + sensor_telemetry: _builtins.bool | None = ..., unmessagable: _builtins.bool | None = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_telemetry", b"_sensor_telemetry", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "sensor_telemetry", b"sensor_telemetry", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_environment_measurement", b"_environment_measurement", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "environment_measurement", b"environment_measurement", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "reset_intervals", b"reset_intervals", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance", "_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs", "_device_update_interval_secs", b"_device_update_interval_secs", "_node_info_broadcast_secs", b"_node_info_broadcast_secs", "_position_broadcast_secs", b"_position_broadcast_secs", "_position_broadcast_smart_enabled", b"_position_broadcast_smart_enabled", "_position_flags", b"_position_flags", "_rebroadcast_mode", b"_rebroadcast_mode", "_sensor_telemetry", b"_sensor_telemetry", "_sensor_update_interval_secs", b"_sensor_update_interval_secs", "_unmessagable", b"_unmessagable", "broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "device_update_interval_secs", b"device_update_interval_secs", "node_info_broadcast_secs", b"node_info_broadcast_secs", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rebroadcast_mode", b"rebroadcast_mode", "reset_intervals", b"reset_intervals", "sensor_telemetry", b"sensor_telemetry", "sensor_update_interval_secs", b"sensor_update_interval_secs", "unmessagable", b"unmessagable"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... _WhichOneofReturnType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["broadcast_smart_minimum_distance"] # noqa: Y015 _WhichOneofArgType__broadcast_smart_minimum_distance: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_distance", b"_broadcast_smart_minimum_distance"] # noqa: Y015 @@ -125,8 +125,6 @@ class RoleDefaults(_message.Message): _WhichOneofArgType__broadcast_smart_minimum_interval_secs: _TypeAlias = _typing.Literal["_broadcast_smart_minimum_interval_secs", b"_broadcast_smart_minimum_interval_secs"] # noqa: Y015 _WhichOneofReturnType__device_update_interval_secs: _TypeAlias = _typing.Literal["device_update_interval_secs"] # noqa: Y015 _WhichOneofArgType__device_update_interval_secs: _TypeAlias = _typing.Literal["_device_update_interval_secs", b"_device_update_interval_secs"] # noqa: Y015 - _WhichOneofReturnType__environment_measurement: _TypeAlias = _typing.Literal["environment_measurement"] # noqa: Y015 - _WhichOneofArgType__environment_measurement: _TypeAlias = _typing.Literal["_environment_measurement", b"_environment_measurement"] # noqa: Y015 _WhichOneofReturnType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["node_info_broadcast_secs"] # noqa: Y015 _WhichOneofArgType__node_info_broadcast_secs: _TypeAlias = _typing.Literal["_node_info_broadcast_secs", b"_node_info_broadcast_secs"] # noqa: Y015 _WhichOneofReturnType__position_broadcast_secs: _TypeAlias = _typing.Literal["position_broadcast_secs"] # noqa: Y015 @@ -137,6 +135,8 @@ class RoleDefaults(_message.Message): _WhichOneofArgType__position_flags: _TypeAlias = _typing.Literal["_position_flags", b"_position_flags"] # noqa: Y015 _WhichOneofReturnType__rebroadcast_mode: _TypeAlias = _typing.Literal["rebroadcast_mode"] # noqa: Y015 _WhichOneofArgType__rebroadcast_mode: _TypeAlias = _typing.Literal["_rebroadcast_mode", b"_rebroadcast_mode"] # noqa: Y015 + _WhichOneofReturnType__sensor_telemetry: _TypeAlias = _typing.Literal["sensor_telemetry"] # noqa: Y015 + _WhichOneofArgType__sensor_telemetry: _TypeAlias = _typing.Literal["_sensor_telemetry", b"_sensor_telemetry"] # noqa: Y015 _WhichOneofReturnType__sensor_update_interval_secs: _TypeAlias = _typing.Literal["sensor_update_interval_secs"] # noqa: Y015 _WhichOneofArgType__sensor_update_interval_secs: _TypeAlias = _typing.Literal["_sensor_update_interval_secs", b"_sensor_update_interval_secs"] # noqa: Y015 _WhichOneofReturnType__unmessagable: _TypeAlias = _typing.Literal["unmessagable"] # noqa: Y015 @@ -148,8 +148,6 @@ class RoleDefaults(_message.Message): @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__device_update_interval_secs) -> _WhichOneofReturnType__device_update_interval_secs | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType__environment_measurement) -> _WhichOneofReturnType__environment_measurement | None: ... - @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__node_info_broadcast_secs) -> _WhichOneofReturnType__node_info_broadcast_secs | None: ... @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__position_broadcast_secs) -> _WhichOneofReturnType__position_broadcast_secs | None: ... @@ -160,6 +158,8 @@ class RoleDefaults(_message.Message): @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__rebroadcast_mode) -> _WhichOneofReturnType__rebroadcast_mode | None: ... @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__sensor_telemetry) -> _WhichOneofReturnType__sensor_telemetry | None: ... + @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__sensor_update_interval_secs) -> _WhichOneofReturnType__sensor_update_interval_secs | None: ... @_typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__unmessagable) -> _WhichOneofReturnType__unmessagable | None: ... diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index da5a0e3a9..6d7d9dede 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -15,7 +15,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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\x03\x88\x01\x01\x12\x1b\n\x0euptime_minutes\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_minutes\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\xc7\x01\n\x16TrafficManagementStats\x12\x19\n\x11packets_inspected\x18\x01 \x01(\r\x12\x1c\n\x14position_dedup_drops\x18\x02 \x01(\r\x12\x18\n\x10rate_limit_drops\x18\x03 \x01(\r\x12\x1c\n\x14unknown_packet_drops\x18\x04 \x01(\r\x12\x1d\n\x15hop_exhausted_packets\x18\x05 \x01(\r\x12\x1d\n\x15router_hops_preserved\x18\x06 \x01(\r\"\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\"\xb6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10\x10\x38\x10\x12\x15\n\x06values\x18\x02 \x03(\x11\x42\x05\x92?\x02\x10@\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10\x17\x38 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10\x18\x38 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10\x10\x38\x08\"\xa3\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x12\n\x0eRAINFALL_1H_MM\x10\x08\x12\x13\n\x0fRAINFALL_24H_MM\x10\t\x12\x11\n\rRADIATION_URH\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\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\"\x88\x02\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x07voltage\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x01\x88\x01\x01\x12\'\n\x13\x63hannel_utilization\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10H\x02\x88\x01\x01\x12\x1f\n\x0b\x61ir_util_tx\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10H\x03\x88\x01\x01\x12\x1b\n\x0euptime_minutes\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_minutes\"\xa8\x05\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\r\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\r\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(\x11\x12\x1f\n\x17num_tx_relay_suppressed\x18\x10 \x01(\r\x12N\n\x0f\x64iscovery_stage\x18\x11 \x01(\x0e\x32..meshtastic.protobuf.LocalStats.DiscoveryStageB\x05\x92?\x02\x38\x08\x12 \n\x11\x64iscovery_servers\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\"\x7f\n\x0e\x44iscoveryStage\x12\x19\n\x15\x44ISCOVERY_STAGE_UNSET\x10\x00\x12\x1c\n\x18\x44ISCOVERY_STAGE_ANNOUNCE\x10\x01\x12\x19\n\x15\x44ISCOVERY_STAGE_TAPER\x10\x02\x12\x19\n\x15\x44ISCOVERY_STAGE_SERVE\x10\x03\"\xc7\x01\n\x16TrafficManagementStats\x12\x19\n\x11packets_inspected\x18\x01 \x01(\r\x12\x1c\n\x14position_dedup_drops\x18\x02 \x01(\r\x12\x18\n\x10rate_limit_drops\x18\x03 \x01(\r\x12\x1c\n\x14unknown_packet_drops\x18\x04 \x01(\r\x12\x1d\n\x15hop_exhausted_packets\x18\x05 \x01(\r\x12\x1d\n\x15router_hops_preserved\x18\x06 \x01(\r\"\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\"\xc6\r\n\x0eSensorReadings\x12\x15\n\x04keys\x18\x01 \x03(\rB\x07\x92?\x04\x10@8\x10\x12\x16\n\x06values\x18\x02 \x03(\x11\x42\x06\x92?\x03\x10\x80\x01\x12\x1c\n\x0btime_deltas\x18\x03 \x03(\x11\x42\x07\x92?\x04\x10@8 \x12\x18\n\x07present\x18\x04 \x03(\rB\x07\x92?\x04\x10@8 \x12\x18\n\x07sensors\x18\x05 \x03(\rB\x07\x92?\x04\x10@8\x08\"\xb2\x0c\n\x08Quantity\x12\x12\n\x0eQUANTITY_UNSET\x10\x00\x12\x1b\n\x17\x41IR_TEMPERATURE_C_CENTI\x10\x01\x12\x1a\n\x16\x41IR_HUMIDITY_PCT_CENTI\x10\x02\x12\x13\n\x0f\x41IR_PRESSURE_PA\x10\x03\x12\x16\n\x12WIND_DIRECTION_DEG\x10\x04\x12\x12\n\x0eWIND_SPEED_CMS\x10\x05\x12\x11\n\rWIND_GUST_CMS\x10\x06\x12\x11\n\rWIND_LULL_CMS\x10\x07\x12\x17\n\x13RAINFALL_1H_MM_DECI\x10\x08\x12\x18\n\x14RAINFALL_24H_MM_DECI\x10\t\x12\x16\n\x12RADIATION_URH_DECI\x10\n\x12\x18\n\x14LIGHTNING_STRIKES_1H\x10\x0b\x12\x19\n\x15LIGHTNING_DISTANCE_KM\x10\x0c\x12\x18\n\x14ILLUMINANCE_LUX_DECI\x10\r\x12\x1e\n\x1aILLUMINANCE_WHITE_LUX_DECI\x10\x0e\x12\x1b\n\x17ILLUMINANCE_IR_LUX_DECI\x10\x0f\x12\x1b\n\x17ILLUMINANCE_UV_LUX_DECI\x10\x10\x12\x18\n\x14SOLAR_IRRADIANCE_WM2\x10\x11\x12\x0e\n\nVOLTAGE_MV\x10\x12\x12\x0e\n\nCURRENT_MA\x10\x13\x12\x0e\n\nVOLTAGE_UV\x10\x14\x12\x0f\n\x0b\x44ISTANCE_MM\x10\x15\x12\x0c\n\x08WEIGHT_G\x10\x16\x12\x1c\n\x18SOIL_TEMPERATURE_C_CENTI\x10\x17\x12\x15\n\x11SOIL_MOISTURE_PCT\x10\x18\x12\x11\n\rSOIL_PH_CENTI\x10\x19\x12\x1a\n\x16SOIL_CONDUCTIVITY_USCM\x10\x1a\x12\x16\n\x12SOIL_NITROGEN_MGKG\x10\x1b\x12\x18\n\x14SOIL_PHOSPHORUS_MGKG\x10\x1c\x12\x17\n\x13SOIL_POTASSIUM_MGKG\x10\x1d\x12\x12\n\x0eWATER_PH_CENTI\x10\x1e\x12\x1b\n\x17WATER_CONDUCTIVITY_USCM\x10\x1f\x12\x16\n\x12WATER_SALINITY_MGL\x10 \x12$\n WATER_DISSOLVED_OXYGEN_MGL_CENTI\x10!\x12\x10\n\x0cWATER_ORP_MV\x10\"\x12\x11\n\rWATER_COD_MGL\x10#\x12\x11\n\rWATER_BOD_MGL\x10$\x12\x1d\n\x19WATER_TURBIDITY_NTU_CENTI\x10%\x12\x1b\n\x17WATER_NITRATE_PPM_CENTI\x10&\x12\x1c\n\x18WATER_AMMONIUM_PPM_CENTI\x10\'\x12\x17\n\x13PM1_0_STD_UGM3_DECI\x10(\x12\x17\n\x13PM2_5_STD_UGM3_DECI\x10)\x12\x17\n\x13PM4_0_STD_UGM3_DECI\x10*\x12\x18\n\x14PM10_0_STD_UGM3_DECI\x10+\x12\x17\n\x13PM1_0_ENV_UGM3_DECI\x10,\x12\x17\n\x13PM2_5_ENV_UGM3_DECI\x10-\x12\x18\n\x14PM10_0_ENV_UGM3_DECI\x10.\x12\x13\n\x0fPARTICLES_0_3UM\x10/\x12\x13\n\x0fPARTICLES_0_5UM\x10\x30\x12\x13\n\x0fPARTICLES_1_0UM\x10\x31\x12\x13\n\x0fPARTICLES_2_5UM\x10\x32\x12\x13\n\x0fPARTICLES_4_0UM\x10\x33\x12\x13\n\x0fPARTICLES_5_0UM\x10\x34\x12\x14\n\x10PARTICLES_10_0UM\x10\x35\x12\x1a\n\x16PARTICLE_SIZE_UM_CENTI\x10\x36\x12\x0b\n\x07\x43O2_PPM\x10\x37\x12\x0c\n\x08HCHO_PPB\x10\x38\x12\r\n\tVOC_INDEX\x10\x39\x12\r\n\tNOX_INDEX\x10:\x12\r\n\tIAQ_INDEX\x10;\x12\x1e\n\x1aSENSOR_GAS_RESISTANCE_KOHM\x10<\x12\x13\n\x0fPM_STATUS_FLAGS\x10=\x12\x1e\n\x1aSENSOR_TEMPERATURE_C_CENTI\x10>\x12\x1d\n\x19SENSOR_HUMIDITY_PCT_CENTI\x10?\x12\x17\n\x13\x42ODY_HEART_RATE_BPM\x10@\x12\x11\n\rBODY_SPO2_PCT\x10\x41\x12\x1c\n\x18\x42ODY_TEMPERATURE_C_CENTI\x10\x42\"\xe5\x02\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>\n\x0fsensor_readings\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.SensorReadingsH\x00\x12\x36\n\x0blocal_stats\x18\x04 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12\x38\n\x0chost_metrics\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x12O\n\x18traffic_management_stats\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x42\t\n\x07variant\"E\n\rNau7802Config\x12\x19\n\nzeroOffset\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \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*\xde\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\x05LPS22\x10\x07\x12\x0b\n\x07QMC6310\x10\x08\x12\x0b\n\x07QMI8658\x10\t\x12\x0c\n\x08QMC5883L\x10\n\x12\x0c\n\x08PMSA003I\x10\x0b\x12\x0b\n\x07INA3221\x10\x0c\x12\n\n\x06\x42MP085\x10\r\x12\x0c\n\x08RCWL9620\x10\x0e\x12\x0c\n\x08VEML7700\x10\x0f\x12\x0c\n\x08MLX90632\x10\x10\x12\x0b\n\x07OPT3001\x10\x11\x12\x0c\n\x08LTR390UV\x10\x12\x12\x0e\n\nTSL25911FN\x10\x13\x12\t\n\x05\x41HT10\x10\x14\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x15\x12\x0b\n\x07NAU7802\x10\x16\x12\n\n\x06\x42MP3XX\x10\x17\x12\x0c\n\x08ICM20948\x10\x18\x12\x0c\n\x08MAX17048\x10\x19\x12\x11\n\rCUSTOM_SENSOR\x10\x1a\x12\x0c\n\x08MAX30102\x10\x1b\x12\x0c\n\x08MLX90614\x10\x1c\x12\t\n\x05SCD4X\x10\x1d\x12\x0b\n\x07RADSENS\x10\x1e\x12\n\n\x06INA226\x10\x1f\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\x05STC31\x10,\x12\t\n\x05SCD30\x10-\x12\t\n\x05SHTXX\x10.\x12\n\n\x06\x44S248X\x10/\x12\r\n\tMMC5983MA\x10\x30\x12\r\n\tICM42607P\x10\x31\x12\t\n\x05SPA06\x10\x32\x12\n\n\x06HM330X\x10\x33\x12\t\n\x05SEN6X\x10\x34\x12\n\n\x06\x41S3935\x10\x35\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) @@ -48,19 +48,19 @@ _globals['_HOSTMETRICS'].fields_by_name['user_string']._options = None _globals['_HOSTMETRICS'].fields_by_name['user_string']._serialized_options = b'\222?\003\010\241\001' _globals['_SENSORREADINGS'].fields_by_name['keys']._options = None - _globals['_SENSORREADINGS'].fields_by_name['keys']._serialized_options = b'\222?\004\020\0208\020' + _globals['_SENSORREADINGS'].fields_by_name['keys']._serialized_options = b'\222?\004\020@8\020' _globals['_SENSORREADINGS'].fields_by_name['values']._options = None - _globals['_SENSORREADINGS'].fields_by_name['values']._serialized_options = b'\222?\002\020@' + _globals['_SENSORREADINGS'].fields_by_name['values']._serialized_options = b'\222?\003\020\200\001' _globals['_SENSORREADINGS'].fields_by_name['time_deltas']._options = None - _globals['_SENSORREADINGS'].fields_by_name['time_deltas']._serialized_options = b'\222?\004\020\0278 ' + _globals['_SENSORREADINGS'].fields_by_name['time_deltas']._serialized_options = b'\222?\004\020@8 ' _globals['_SENSORREADINGS'].fields_by_name['present']._options = None - _globals['_SENSORREADINGS'].fields_by_name['present']._serialized_options = b'\222?\004\020\0308 ' + _globals['_SENSORREADINGS'].fields_by_name['present']._serialized_options = b'\222?\004\020@8 ' _globals['_SENSORREADINGS'].fields_by_name['sensors']._options = None - _globals['_SENSORREADINGS'].fields_by_name['sensors']._serialized_options = b'\222?\004\020\0208\010' + _globals['_SENSORREADINGS'].fields_by_name['sensors']._serialized_options = b'\222?\004\020@8\010' _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._options = None _globals['_NAU7802CONFIG'].fields_by_name['zeroOffset']._serialized_options = b'\222?\0028 ' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=4228 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=4962 + _globals['_TELEMETRYSENSORTYPE']._serialized_start=4244 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=4978 _globals['_DEVICEMETRICS']._serialized_start=95 _globals['_DEVICEMETRICS']._serialized_end=359 _globals['_LOCALSTATS']._serialized_start=362 @@ -72,17 +72,17 @@ _globals['_HOSTMETRICS']._serialized_start=1247 _globals['_HOSTMETRICS']._serialized_end=1549 _globals['_SENSORREADINGS']._serialized_start=1552 - _globals['_SENSORREADINGS']._serialized_end=3270 - _globals['_SENSORREADINGS_QUANTITY']._serialized_start=1699 - _globals['_SENSORREADINGS_QUANTITY']._serialized_end=3270 - _globals['_TELEMETRY']._serialized_start=3273 - _globals['_TELEMETRY']._serialized_end=3630 - _globals['_NAU7802CONFIG']._serialized_start=3632 - _globals['_NAU7802CONFIG']._serialized_end=3701 - _globals['_AS3935STATE']._serialized_start=3703 - _globals['_AS3935STATE']._serialized_end=3739 - _globals['_SEN5XSTATE']._serialized_start=3742 - _globals['_SEN5XSTATE']._serialized_end=3982 - _globals['_SEN6XSTATE']._serialized_start=3985 - _globals['_SEN6XSTATE']._serialized_end=4225 + _globals['_SENSORREADINGS']._serialized_end=3286 + _globals['_SENSORREADINGS_QUANTITY']._serialized_start=1700 + _globals['_SENSORREADINGS_QUANTITY']._serialized_end=3286 + _globals['_TELEMETRY']._serialized_start=3289 + _globals['_TELEMETRY']._serialized_end=3646 + _globals['_NAU7802CONFIG']._serialized_start=3648 + _globals['_NAU7802CONFIG']._serialized_end=3717 + _globals['_AS3935STATE']._serialized_start=3719 + _globals['_AS3935STATE']._serialized_end=3755 + _globals['_SEN5XSTATE']._serialized_start=3758 + _globals['_SEN5XSTATE']._serialized_end=3998 + _globals['_SEN6XSTATE']._serialized_start=4001 + _globals['_SEN6XSTATE']._serialized_end=4241 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index bd5e4c06a..c82a09d31 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -884,7 +884,12 @@ class SensorReadings(_message.Message): about 71 bytes here against 200 as one message per reading. A single sample is the live broadcast: one entry per column, no deltas, no times. - Send as many samples as the payload allows, then start another message. + A sender fills a message with readings, or with samples of a batch, until the frame has + no room left, then starts another message for the rest. + + A Telemetry carrying sensor_readings with keys and no values is a request: the node + answers with its current reading of each listed quantity it has, or of every quantity + when the list is empty. The answer may take several messages. On size: a reading costs one key byte plus one to three value bytes, against a typed field's one to two tag bytes plus the same value. That is slightly larger for @@ -920,12 +925,12 @@ class SensorReadings(_message.Message): """Wind gust, centimetres per second""" WIND_LULL_CMS: SensorReadings._Quantity.ValueType # 7 """Wind lull, centimetres per second""" - RAINFALL_1H_MM: SensorReadings._Quantity.ValueType # 8 - """Rainfall in the last hour, millimetres""" - RAINFALL_24H_MM: SensorReadings._Quantity.ValueType # 9 - """Rainfall in the last 24 hours, millimetres""" - RADIATION_URH: SensorReadings._Quantity.ValueType # 10 - """Ionising radiation, microroentgen per hour""" + RAINFALL_1H_MM_DECI: SensorReadings._Quantity.ValueType # 8 + """Rainfall in the last hour, deci-millimetres (28 = 2.8 mm): a rain gauge tips at 0.2 to 0.3 mm""" + RAINFALL_24H_MM_DECI: SensorReadings._Quantity.ValueType # 9 + """Rainfall in the last 24 hours, deci-millimetres""" + RADIATION_URH_DECI: SensorReadings._Quantity.ValueType # 10 + """Ionising radiation, deci-microroentgen per hour (123 = 12.3 uR/h): background is 10 to 20""" LIGHTNING_STRIKES_1H: SensorReadings._Quantity.ValueType # 11 """Lightning strikes detected in the last hour""" LIGHTNING_DISTANCE_KM: SensorReadings._Quantity.ValueType # 12 @@ -1142,12 +1147,12 @@ class SensorReadings(_message.Message): """Wind gust, centimetres per second""" WIND_LULL_CMS: SensorReadings.Quantity.ValueType # 7 """Wind lull, centimetres per second""" - RAINFALL_1H_MM: SensorReadings.Quantity.ValueType # 8 - """Rainfall in the last hour, millimetres""" - RAINFALL_24H_MM: SensorReadings.Quantity.ValueType # 9 - """Rainfall in the last 24 hours, millimetres""" - RADIATION_URH: SensorReadings.Quantity.ValueType # 10 - """Ionising radiation, microroentgen per hour""" + RAINFALL_1H_MM_DECI: SensorReadings.Quantity.ValueType # 8 + """Rainfall in the last hour, deci-millimetres (28 = 2.8 mm): a rain gauge tips at 0.2 to 0.3 mm""" + RAINFALL_24H_MM_DECI: SensorReadings.Quantity.ValueType # 9 + """Rainfall in the last 24 hours, deci-millimetres""" + RADIATION_URH_DECI: SensorReadings.Quantity.ValueType # 10 + """Ionising radiation, deci-microroentgen per hour (123 = 12.3 uR/h): background is 10 to 20""" LIGHTNING_STRIKES_1H: SensorReadings.Quantity.ValueType # 11 """Lightning strikes detected in the last hour""" LIGHTNING_DISTANCE_KM: SensorReadings.Quantity.ValueType # 12 @@ -1395,7 +1400,9 @@ class SensorReadings(_message.Message): @_builtins.property def present(self) -> _containers.RepeatedScalarFieldContainer[_builtins.int]: """ - One bitmap per sample, oldest first: bit k set when that sample carries keys[k]. + One bitmap per sample, oldest first: bit k set when that sample carries keys[k]. A + bitmap is ceil(keys / 32) words, word w holding keys 32w to 32w + 31, so a message + with up to 32 keys has one word per sample. It is what tells a reader how long each column in `values` is, and which samples a column's deltas step between - a column skips absent samples rather than diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index 533b30091..615d4f15c 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -5,6 +5,7 @@ import re import time from types import SimpleNamespace +from typing import List from unittest.mock import patch import pytest @@ -1004,6 +1005,24 @@ def test_sensor_readings_to_list(): ] +@pytest.mark.unit +def test_sensor_readings_present_spans_words_past_32_keys(): + """With more than 32 keys each sample's present bitmap is ceil(keys / 32) words, word w + holding keys 32w to 32w + 31: key index 35 is bit 3 of the second word.""" + keys = list(range(1, 41)) + values: List[int] = [] + for k in keys: + values += [k] if k == 36 else [k, 1] # absolute, then +1 in sample two; key 36 only in sample one + readings = telemetry_pb2.SensorReadings( + keys=keys, values=values, time_deltas=[60], present=[0xFFFFFFFF, 0xFF, 0xFFFFFFFF, 0xF7] + ) + first, second = sensor_readings_to_list(readings) + name = telemetry_pb2.SensorReadings.Quantity.Name + assert name(36) in first and name(36) not in second + assert (first[name(35)], second[name(35)]) == (35, 36) + assert second[name(40)] == 41 / 10 # the column after the gap still lines up + + @pytest.mark.unit def test_sensor_readings_unknown_quantity_is_stepped_over(): """A quantity this build does not know still consumes its column, so the rest decode.""" diff --git a/meshtastic/util.py b/meshtastic/util.py index bdf2382eb..c49a92085 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -894,13 +894,18 @@ def sensor_readings_to_list(readings: telemetry_pb2.SensorReadings, time0: int=0 samples: List[Dict[str, Any]] = [{"time": t} for t in times] values = iter(readings.values) quantity = telemetry_pb2.SensorReadings.Quantity + words = (len(readings.keys) + 31) // 32 # per sample bitmap: keys 32w..32w+31 in word w for k, key in enumerate(readings.keys): q = key & 0x7F name = quantity.Name(q) if q in quantity.values() else f"QUANTITY_{q}" # type: ignore[arg-type] scale = 100 if name.endswith("_CENTI") else 10 if name.endswith("_DECI") else 1 if key >> 8: name += f"#{key >> 8}" - rows = [i for i in range(len(samples)) if not readings.present or readings.present[i] >> k & 1] + rows = [ + i + for i in range(len(samples)) + if not readings.present or readings.present[i * words + k // 32] >> (k % 32) & 1 + ] if key & 0x80: # constant across the batch: one entry v = next(values) for i in rows: diff --git a/protobufs b/protobufs index d8c40647d..e41fb3fd8 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit d8c40647d5acace000466582760c5ad2f76ba7a9 +Subproject commit e41fb3fd8e28148361d8939f7a0bf820322b00e0 From f596020ea30eba1a20f816a69b40b09ffe2ddbcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 9 Oct 2026 08:14:53 +0200 Subject: [PATCH 23/24] Wait for every part of a sensor readings reply After the first part arrives, sendTelemetry keeps listening until no further part comes within SENSOR_REPLY_PART_GAP_SECS. --- meshtastic/mesh_interface.py | 7 +++++++ meshtastic/tests/test_mesh_interface.py | 23 ++++++++++++++++++++++- meshtastic/util.py | 4 ++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index a622be2a6..4f1740725 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -55,6 +55,9 @@ """Data.payload's bound: one LoRa frame. What a frame really leaves for the payload depends on the packet (header profile, options, path tail, signature), so the node does the final check.""" +# A node sends the parts of a long sensor reply back to back; a gap this long ends the answer +SENSOR_REPLY_PART_GAP_SECS = 15 + def _timeago(delta_secs: int) -> str: """Convert a number of seconds in the past into a short, friendly string e.g. "now", "30 sec ago", "1 hour ago" @@ -813,6 +816,10 @@ def sendTelemetry( ) if wantResponse: self.waitForTelemetry() + if telemetryType == "sensor_readings": + # The rest of a long answer follows the first part back to back + while self._timeout.waitForTelemetry(self._acknowledgment, SENSOR_REPLY_PART_GAP_SECS): + pass def onResponseTelemetry(self, p: dict): """on response for telemetry""" diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 90e3d5b8c..fb8e5a1ca 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -9,7 +9,7 @@ from ..protobuf import config_pb2, packet_pb2 from .. import BROADCAST_ADDR, LOCAL_ADDR -from ..mesh_interface import MeshInterface, _timeago +from ..mesh_interface import SENSOR_REPLY_PART_GAP_SECS, MeshInterface, _timeago from ..node import Node try: # Depends upon the powermon group, not installed by default @@ -853,3 +853,24 @@ def test_onResponseTraceRoute_without_recorded_path(capsys): iface.onResponseTraceRoute({"from": 1, "to": 2, "decoded": {"portnum": "TELEMETRY_APP"}, "raw": raw}) out, _ = capsys.readouterr() assert "!00000001 --> (2 hops, path not recorded) --> !00000002" in out + + +@pytest.mark.unit +def test_sendTelemetry_sensor_request_names_quantities_and_waits_for_every_part(): + """A sensor_readings request lists its quantities in keys with no values, and keeps listening + while further parts of the answer arrive, ending at the first gap of SENSOR_REPLY_PART_GAP_SECS.""" + iface = MeshInterface(noProto=True) + sent = [] + iface.sendData = lambda r, **kw: sent.append(r) + answers = iter([True, True, False]) + waits = [] + + def fake_wait(ack, maxSecs=None): + waits.append(maxSecs) + return next(answers) + + iface._timeout.waitForTelemetry = fake_wait + iface.sendTelemetry(destinationId=1, wantResponse=True, telemetryType="sensor_readings", quantities=[55]) + assert list(sent[0].sensor_readings.keys) == [55] and not sent[0].sensor_readings.values + assert waits == [None, SENSOR_REPLY_PART_GAP_SECS, SENSOR_REPLY_PART_GAP_SECS] + iface.close() diff --git a/meshtastic/util.py b/meshtastic/util.py index c49a92085..4025d25e6 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -243,9 +243,9 @@ def waitForTraceRoute(self, waitFactor, acknowledgment, attr="receivedTraceRoute time.sleep(self.sleepInterval) return False - def waitForTelemetry(self, acknowledgment) -> bool: + def waitForTelemetry(self, acknowledgment, maxSecs: Optional[float]=None) -> bool: """Block until telemetry response is received. Returns True if telemetry response has been received.""" - self.reset() + self.reset(maxSecs) while time.time() < self.expireTime: if getattr(acknowledgment, "receivedTelemetry", None): acknowledgment.reset() From 2cab0d31184e2b3267d8c644042003c593e75d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 9 Oct 2026 08:52:28 +0200 Subject: [PATCH 24/24] Ask the node for a store and forward sync requestStoreForwardSync sends an empty StoreAndForward SYNC to our own node, and the CLI exposes it as --sync-store-forward. Protobufs at fccdbe7. --- meshtastic/__main__.py | 10 ++++++++++ meshtastic/mesh_interface.py | 11 ++++++++++- meshtastic/protobuf/storeforward_pb2.pyi | 6 ++++-- meshtastic/tests/test_mesh_interface.py | 16 +++++++++++++++- protobufs | 2 +- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index d955e783e..d1ce63696 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -748,6 +748,10 @@ def onConnected(interface): channelIndex=channelIndex, ) + if args.sync_store_forward: + print("Asking the node to sync with its store and forward server") + interface.requestStoreForwardSync() + if args.gpio_wrb or args.gpio_rd or args.gpio_watch: if args.dest == BROADCAST_ADDR: meshtastic.util.our_exit("Warning: Must use a destination node ID.") @@ -2400,6 +2404,12 @@ def addRemoteActionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar action="store_true", ) + group.add_argument( + "--sync-store-forward", + help="Ask the connected node to sync with its store and forward server now, for what it missed.", + action="store_true", + ) + group.add_argument( "--reply", help="Reply to received text messages on the channel '--ch-index' names (0, the primary, by default). " diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 4f1740725..0cc42c7aa 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -36,7 +36,7 @@ protocols, publishingThread, ) -from meshtastic.protobuf import api_pb2, common_pb2, packet_pb2, portnums_pb2, telemetry_pb2, wire_pb2 +from meshtastic.protobuf import api_pb2, common_pb2, packet_pb2, portnums_pb2, storeforward_pb2, telemetry_pb2, wire_pb2 from meshtastic.util import ( Acknowledgment, Timeout, @@ -821,6 +821,15 @@ def sendTelemetry( while self._timeout.waitForTelemetry(self._acknowledgment, SENSOR_REPLY_PART_GAP_SECS): pass + def requestStoreForwardSync(self): + """Ask our own node to sync with its store-and-forward server now. A node that is no + store-and-forward client, or has heard no server, answers with a ClientNotification.""" + self.sendData( + storeforward_pb2.StoreAndForward(type=storeforward_pb2.StoreAndForward.SYNC), + destinationId=LOCAL_ADDR, + portNum=portnums_pb2.PortNum.STORE_FORWARD_APP, + ) + def onResponseTelemetry(self, p: dict): """on response for telemetry""" if p["decoded"]["portnum"] == "TELEMETRY_APP": diff --git a/meshtastic/protobuf/storeforward_pb2.pyi b/meshtastic/protobuf/storeforward_pb2.pyi index ea4ff3950..db2ee5fc2 100644 --- a/meshtastic/protobuf/storeforward_pb2.pyi +++ b/meshtastic/protobuf/storeforward_pb2.pyi @@ -137,7 +137,8 @@ class StoreAndForward(_message.Message): """ SYNC: StoreAndForward._Type.ValueType # 2 """ - Client to server: where each of the client's streams stands. + Client to server: where each of the client's streams stands. From a client app to its + own node, with nothing else set: sync now. """ FRAME: StoreAndForward._Type.ValueType # 3 """ @@ -176,7 +177,8 @@ class StoreAndForward(_message.Message): """ SYNC: StoreAndForward.Type.ValueType # 2 """ - Client to server: where each of the client's streams stands. + Client to server: where each of the client's streams stands. From a client app to its + own node, with nothing else set: sync now. """ FRAME: StoreAndForward.Type.ValueType # 3 """ diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index fb8e5a1ca..46bb51af2 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -7,7 +7,7 @@ import pytest from hypothesis import given, strategies as st -from ..protobuf import config_pb2, packet_pb2 +from ..protobuf import config_pb2, packet_pb2, portnums_pb2 from .. import BROADCAST_ADDR, LOCAL_ADDR from ..mesh_interface import SENSOR_REPLY_PART_GAP_SECS, MeshInterface, _timeago from ..node import Node @@ -874,3 +874,17 @@ def fake_wait(ack, maxSecs=None): assert list(sent[0].sensor_readings.keys) == [55] and not sent[0].sensor_readings.values assert waits == [None, SENSOR_REPLY_PART_GAP_SECS, SENSOR_REPLY_PART_GAP_SECS] iface.close() + + +@pytest.mark.unit +def test_requestStoreForwardSync_sends_an_empty_sync_to_the_node_itself(): + """A store-and-forward sync request is a SYNC with nothing else set, addressed to our own node.""" + iface = MeshInterface(noProto=True) + sent = [] + iface.sendData = lambda m, **kw: sent.append((m, kw)) + iface.requestStoreForwardSync() + m, kw = sent[0] + assert m.type == m.SYNC and not m.HasField("sync") + assert kw["destinationId"] == LOCAL_ADDR and kw["portNum"] == portnums_pb2.PortNum.STORE_FORWARD_APP + iface.close() + diff --git a/protobufs b/protobufs index e41fb3fd8..fccdbe757 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit e41fb3fd8e28148361d8939f7a0bf820322b00e0 +Subproject commit fccdbe7572ca5c047898ae385410eefb88bba10d