mirror of
https://github.com/meshtastic/python.git
synced 2026-01-01 20:38:03 -05:00
Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7d9c7219a | ||
|
|
c60b5d4b05 | ||
|
|
83d82c518a | ||
|
|
8a95ce4636 | ||
|
|
0261313fc5 | ||
|
|
c1a6234694 | ||
|
|
66e32f812a | ||
|
|
eb85439000 | ||
|
|
885eb4898d | ||
|
|
172c123990 | ||
|
|
fcdd83838b | ||
|
|
58967e1d91 | ||
|
|
17f7e8e20e | ||
|
|
9b5a889676 | ||
|
|
ce7c61861f | ||
|
|
4adcbb6787 | ||
|
|
125f63419e | ||
|
|
cad5d18aff | ||
|
|
706d0649c1 | ||
|
|
167044907d | ||
|
|
ab1669994f | ||
|
|
6f67f33378 | ||
|
|
e60c8ea105 | ||
|
|
d633f8c895 | ||
|
|
ca82e1ce2b | ||
|
|
0ae23eec7e | ||
|
|
2fa85bac1f | ||
|
|
58fc614fb7 | ||
|
|
795b652069 | ||
|
|
213faa0cae | ||
|
|
68a2009e0e | ||
|
|
c76e4dac87 | ||
|
|
428be9fbce | ||
|
|
d83f7b2307 | ||
|
|
eb453a2e8a | ||
|
|
308ac93399 | ||
|
|
84417f0bb1 | ||
|
|
0bb3389b3b | ||
|
|
22b3062151 | ||
|
|
373b8a3139 | ||
|
|
51b543ff40 | ||
|
|
8752a0de6e | ||
|
|
7160e79fbf | ||
|
|
b73fcbff88 | ||
|
|
1b5b07e752 | ||
|
|
f5fa30cb22 | ||
|
|
46a8db286c |
12
.vscode/launch.json
vendored
12
.vscode/launch.json
vendored
@@ -4,6 +4,7 @@
|
|||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "meshtastic BLE",
|
"name": "meshtastic BLE",
|
||||||
"type": "debugpy",
|
"type": "debugpy",
|
||||||
@@ -261,7 +262,14 @@
|
|||||||
"module": "meshtastic",
|
"module": "meshtastic",
|
||||||
"justMyCode": true,
|
"justMyCode": true,
|
||||||
"args": ["--nodes", "--show-fields", "AKA,Pubkey,Role,Role,Role,Latitude,Latitude,deviceMetrics.voltage"]
|
"args": ["--nodes", "--show-fields", "AKA,Pubkey,Role,Role,Role,Latitude,Latitude,deviceMetrics.voltage"]
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"name": "meshtastic --export-config",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "meshtastic",
|
||||||
|
"justMyCode": true,
|
||||||
|
"args": ["--export-config", "config.json"]
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ set -e
|
|||||||
#gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/*
|
#gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/*
|
||||||
#gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/*
|
#gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/*
|
||||||
|
|
||||||
|
POETRYDIR=$(poetry env info --path)
|
||||||
|
|
||||||
|
if [[ -z "${POETRYDIR}" ]]; then
|
||||||
|
poetry install
|
||||||
|
fi
|
||||||
|
|
||||||
# protoc looks for mypy plugin in the python path
|
# protoc looks for mypy plugin in the python path
|
||||||
source $(poetry env info --path)/bin/activate
|
source $(poetry env info --path)/bin/activate
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ owner_short: BOB
|
|||||||
|
|
||||||
channel_url: https://www.meshtastic.org/e/#CgMSAQESCDgBQANIAVAe
|
channel_url: https://www.meshtastic.org/e/#CgMSAQESCDgBQANIAVAe
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
location:
|
location:
|
||||||
lat: 35.88888
|
lat: 35.88888
|
||||||
lon: -93.88888
|
lon: -93.88888
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type of packet, you should subscribe to the full topic name. If you want to see
|
|||||||
- `meshtastic.receive.data.portnum(packet)` (where portnum is an integer or well known PortNum enum)
|
- `meshtastic.receive.data.portnum(packet)` (where portnum is an integer or well known PortNum enum)
|
||||||
- `meshtastic.node.updated(node = NodeInfo)` - published when a node in the DB changes (appears, location changed, username changed, etc...)
|
- `meshtastic.node.updated(node = NodeInfo)` - published when a node in the DB changes (appears, location changed, username changed, etc...)
|
||||||
- `meshtastic.log.line(line)` - a raw unparsed log line from the radio
|
- `meshtastic.log.line(line)` - a raw unparsed log line from the radio
|
||||||
|
- `meshtastic.clientNotification(notification, interface) - a ClientNotification sent from the radio
|
||||||
|
|
||||||
We receive position, user, or data packets from the mesh. You probably only care about `meshtastic.receive.data`. The first argument for
|
We receive position, user, or data packets from the mesh. You probably only care about `meshtastic.receive.data`. The first argument for
|
||||||
that publish will be the packet. Text or binary data packets (from `sendData` or `sendText`) will both arrive this way. If you print packet
|
that publish will be the packet. Text or binary data packets (from `sendData` or `sendText`) will both arrive this way. If you print packet
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
# We just hit the 1600 line limit for main.py, but I currently have a huge set of powermon/structured logging changes
|
# We just hit the 1600 line limit for main.py, but I currently have a huge set of powermon/structured logging changes
|
||||||
# later we can have a separate changelist to refactor main.py into smaller files
|
# later we can have a separate changelist to refactor main.py into smaller files
|
||||||
# pylint: disable=too-many-lines
|
# pylint: disable=R0917,C0302
|
||||||
|
|
||||||
from typing import List, Optional, Union
|
from typing import List, Optional, Union
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
@@ -339,7 +339,7 @@ def onConnected(interface):
|
|||||||
# can include lat/long/alt etc: latitude = 37.5, longitude = -122.1
|
# can include lat/long/alt etc: latitude = 37.5, longitude = -122.1
|
||||||
interface.getNode(args.dest, False, **getNode_kwargs).setFixedPosition(lat, lon, alt)
|
interface.getNode(args.dest, False, **getNode_kwargs).setFixedPosition(lat, lon, alt)
|
||||||
|
|
||||||
if args.set_owner or args.set_owner_short:
|
if args.set_owner or args.set_owner_short or args.set_is_unmessageable:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
waitForAckNak = True
|
waitForAckNak = True
|
||||||
|
|
||||||
@@ -358,11 +358,23 @@ def onConnected(interface):
|
|||||||
print(f"Setting device owner to {args.set_owner} and short name to {args.set_owner_short}")
|
print(f"Setting device owner to {args.set_owner} and short name to {args.set_owner_short}")
|
||||||
elif args.set_owner:
|
elif args.set_owner:
|
||||||
print(f"Setting device owner to {args.set_owner}")
|
print(f"Setting device owner to {args.set_owner}")
|
||||||
else: # short name only
|
elif args.set_owner_short and not args.set_owner:
|
||||||
print(f"Setting device owner short to {args.set_owner_short}")
|
print(f"Setting device owner short to {args.set_owner_short}")
|
||||||
interface.getNode(args.dest, False, **getNode_kwargs).setOwner(long_name=args.set_owner, short_name=args.set_owner_short)
|
|
||||||
|
|
||||||
# TODO: add to export-config and configure
|
if args.set_is_unmessageable:
|
||||||
|
unmessagable = (
|
||||||
|
meshtastic.util.fromStr(args.set_is_unmessageable)
|
||||||
|
if isinstance(args.set_is_unmessageable, str)
|
||||||
|
else args.set_is_unmessageable
|
||||||
|
)
|
||||||
|
|
||||||
|
if unmessagable is not None:
|
||||||
|
print(f"Setting device owner is_unmessageable to {unmessagable}")
|
||||||
|
interface.getNode(
|
||||||
|
args.dest, False, **getNode_kwargs).setOwner(long_name=args.set_owner,
|
||||||
|
short_name=args.set_owner_short, is_unmessagable=unmessagable
|
||||||
|
)
|
||||||
|
|
||||||
if args.set_canned_message:
|
if args.set_canned_message:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
waitForAckNak = True
|
waitForAckNak = True
|
||||||
@@ -371,7 +383,6 @@ def onConnected(interface):
|
|||||||
args.set_canned_message
|
args.set_canned_message
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: add to export-config and configure
|
|
||||||
if args.set_ringtone:
|
if args.set_ringtone:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
waitForAckNak = True
|
waitForAckNak = True
|
||||||
@@ -705,6 +716,16 @@ def onConnected(interface):
|
|||||||
interface.getNode(args.dest, **getNode_kwargs).setURL(configuration["channelUrl"])
|
interface.getNode(args.dest, **getNode_kwargs).setURL(configuration["channelUrl"])
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
if "canned_messages" in configuration:
|
||||||
|
print("Setting canned message messages to", configuration["canned_messages"])
|
||||||
|
interface.getNode(args.dest, **getNode_kwargs).set_canned_message(configuration["canned_messages"])
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
if "ringtone" in configuration:
|
||||||
|
print("Setting ringtone to", configuration["ringtone"])
|
||||||
|
interface.getNode(args.dest, **getNode_kwargs).set_ringtone(configuration["ringtone"])
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
if "location" in configuration:
|
if "location" in configuration:
|
||||||
alt = 0
|
alt = 0
|
||||||
lat = 0.0
|
lat = 0.0
|
||||||
@@ -755,9 +776,20 @@ def onConnected(interface):
|
|||||||
if args.dest != BROADCAST_ADDR:
|
if args.dest != BROADCAST_ADDR:
|
||||||
print("Exporting configuration of remote nodes is not supported.")
|
print("Exporting configuration of remote nodes is not supported.")
|
||||||
return
|
return
|
||||||
# export the configuration (the opposite of '--configure')
|
|
||||||
closeNow = True
|
closeNow = True
|
||||||
export_config(interface)
|
config_txt = export_config(interface)
|
||||||
|
|
||||||
|
if args.export_config == "-":
|
||||||
|
# Output to stdout (preserves legacy use of `> file.yaml`)
|
||||||
|
print(config_txt)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
with open(args.export_config, "w", encoding="utf-8") as f:
|
||||||
|
f.write(config_txt)
|
||||||
|
print(f"Exported configuration to {args.export_config}")
|
||||||
|
except Exception as e:
|
||||||
|
meshtastic.util.our_exit(f"ERROR: Failed to write config file: {e}")
|
||||||
|
|
||||||
if args.ch_set_url:
|
if args.ch_set_url:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
@@ -928,12 +960,14 @@ def onConnected(interface):
|
|||||||
if args.get_canned_message:
|
if args.get_canned_message:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
print("")
|
print("")
|
||||||
interface.getNode(args.dest, **getNode_kwargs).get_canned_message()
|
messages = interface.getNode(args.dest, **getNode_kwargs).get_canned_message()
|
||||||
|
print(f"canned_plugin_message:{messages}")
|
||||||
|
|
||||||
if args.get_ringtone:
|
if args.get_ringtone:
|
||||||
closeNow = True
|
closeNow = True
|
||||||
print("")
|
print("")
|
||||||
interface.getNode(args.dest, **getNode_kwargs).get_ringtone()
|
ringtone = interface.getNode(args.dest, **getNode_kwargs).get_ringtone()
|
||||||
|
print(f"ringtone:{ringtone}")
|
||||||
|
|
||||||
if args.info:
|
if args.info:
|
||||||
print("")
|
print("")
|
||||||
@@ -1088,15 +1122,38 @@ def subscribe() -> None:
|
|||||||
|
|
||||||
# pub.subscribe(onNode, "meshtastic.node")
|
# pub.subscribe(onNode, "meshtastic.node")
|
||||||
|
|
||||||
|
def set_missing_flags_false(config_dict: dict, true_defaults: set[tuple[str, str]]) -> None:
|
||||||
|
"""Ensure that missing default=True keys are present in the config_dict and set to False."""
|
||||||
|
for path in true_defaults:
|
||||||
|
d = config_dict
|
||||||
|
for key in path[:-1]:
|
||||||
|
if key not in d or not isinstance(d[key], dict):
|
||||||
|
d[key] = {}
|
||||||
|
d = d[key]
|
||||||
|
if path[-1] not in d:
|
||||||
|
d[path[-1]] = False
|
||||||
|
|
||||||
def export_config(interface) -> str:
|
def export_config(interface) -> str:
|
||||||
"""used in --export-config"""
|
"""used in --export-config"""
|
||||||
configObj = {}
|
configObj = {}
|
||||||
|
|
||||||
|
# A list of configuration keys that should be set to False if they are missing
|
||||||
|
true_defaults = {
|
||||||
|
("bluetooth", "enabled"),
|
||||||
|
("lora", "sx126xRxBoostedGain"),
|
||||||
|
("lora", "txEnabled"),
|
||||||
|
("lora", "usePreset"),
|
||||||
|
("position", "positionBroadcastSmartEnabled"),
|
||||||
|
("security", "serialEnabled"),
|
||||||
|
("mqtt", "encryptionEnabled"),
|
||||||
|
}
|
||||||
|
|
||||||
owner = interface.getLongName()
|
owner = interface.getLongName()
|
||||||
owner_short = interface.getShortName()
|
owner_short = interface.getShortName()
|
||||||
channel_url = interface.localNode.getURL()
|
channel_url = interface.localNode.getURL()
|
||||||
myinfo = interface.getMyNodeInfo()
|
myinfo = interface.getMyNodeInfo()
|
||||||
|
canned_messages = interface.getCannedMessage()
|
||||||
|
ringtone = interface.getRingtone()
|
||||||
pos = myinfo.get("position")
|
pos = myinfo.get("position")
|
||||||
lat = None
|
lat = None
|
||||||
lon = None
|
lon = None
|
||||||
@@ -1115,6 +1172,10 @@ def export_config(interface) -> str:
|
|||||||
configObj["channelUrl"] = channel_url
|
configObj["channelUrl"] = channel_url
|
||||||
else:
|
else:
|
||||||
configObj["channel_url"] = channel_url
|
configObj["channel_url"] = channel_url
|
||||||
|
if canned_messages:
|
||||||
|
configObj["canned_messages"] = canned_messages
|
||||||
|
if ringtone:
|
||||||
|
configObj["ringtone"] = ringtone
|
||||||
# lat and lon don't make much sense without the other (so fill with 0s), and alt isn't meaningful without both
|
# lat and lon don't make much sense without the other (so fill with 0s), and alt isn't meaningful without both
|
||||||
if lat or lon:
|
if lat or lon:
|
||||||
configObj["location"] = {"lat": lat or float(0), "lon": lon or float(0)}
|
configObj["location"] = {"lat": lat or float(0), "lon": lon or float(0)}
|
||||||
@@ -1145,6 +1206,8 @@ def export_config(interface) -> str:
|
|||||||
else:
|
else:
|
||||||
configObj["config"] = config
|
configObj["config"] = config
|
||||||
|
|
||||||
|
set_missing_flags_false(configObj["config"], true_defaults)
|
||||||
|
|
||||||
module_config = MessageToDict(interface.localNode.moduleConfig)
|
module_config = MessageToDict(interface.localNode.moduleConfig)
|
||||||
if module_config:
|
if module_config:
|
||||||
# Convert inner keys to correct snake/camelCase
|
# Convert inner keys to correct snake/camelCase
|
||||||
@@ -1160,7 +1223,6 @@ def export_config(interface) -> str:
|
|||||||
config_txt = "# start of Meshtastic configure yaml\n" #checkme - "config" (now changed to config_out)
|
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
|
#was used as a string here and a Dictionary above
|
||||||
config_txt += yaml.dump(configObj)
|
config_txt += yaml.dump(configObj)
|
||||||
print(config_txt)
|
|
||||||
return config_txt
|
return config_txt
|
||||||
|
|
||||||
|
|
||||||
@@ -1460,8 +1522,10 @@ def addImportExportArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar
|
|||||||
)
|
)
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"--export-config",
|
"--export-config",
|
||||||
help="Export the configuration in yaml(.yml) format.",
|
nargs="?",
|
||||||
action="store_true",
|
const="-", # default to "-" if no value provided
|
||||||
|
metavar="FILE",
|
||||||
|
help="Export device config as YAML (to stdout if no file given)"
|
||||||
)
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
@@ -1583,6 +1647,11 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
|
|||||||
"--set-ham", help="Set licensed Ham ID and turn off encryption", action="store"
|
"--set-ham", help="Set licensed Ham ID and turn off encryption", action="store"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
group.add_argument(
|
||||||
|
"--set-is-unmessageable", "--set-is-unmessagable",
|
||||||
|
help="Set if a node is messageable or not", action="store"
|
||||||
|
)
|
||||||
|
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"--ch-set-url", "--seturl",
|
"--ch-set-url", "--seturl",
|
||||||
help="Set all channels and set LoRa config from a supplied URL",
|
help="Set all channels and set LoRa config from a supplied URL",
|
||||||
|
|||||||
@@ -411,7 +411,8 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
wantResponse: bool = False,
|
wantResponse: bool = False,
|
||||||
onResponse: Optional[Callable[[dict], Any]] = None,
|
onResponse: Optional[Callable[[dict], Any]] = None,
|
||||||
channelIndex: int = 0,
|
channelIndex: int = 0,
|
||||||
portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.TEXT_MESSAGE_APP
|
portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.TEXT_MESSAGE_APP,
|
||||||
|
replyId: Optional[int]=None,
|
||||||
):
|
):
|
||||||
"""Send a utf8 string to some other node, if the node has a display it
|
"""Send a utf8 string to some other node, if the node has a display it
|
||||||
will also be shown on the device.
|
will also be shown on the device.
|
||||||
@@ -428,6 +429,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
send an application layer response
|
send an application layer response
|
||||||
portNum -- the application portnum (similar to IP port numbers)
|
portNum -- the application portnum (similar to IP port numbers)
|
||||||
of the destination, see portnums.proto for a list
|
of the destination, see portnums.proto for a list
|
||||||
|
replyId -- the ID of the message that this packet is a response to
|
||||||
|
|
||||||
Returns the sent packet. The id field will be populated in this packet
|
Returns the sent packet. The id field will be populated in this packet
|
||||||
and can be used to track future message acks/naks.
|
and can be used to track future message acks/naks.
|
||||||
@@ -441,6 +443,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
wantResponse=wantResponse,
|
wantResponse=wantResponse,
|
||||||
onResponse=onResponse,
|
onResponse=onResponse,
|
||||||
channelIndex=channelIndex,
|
channelIndex=channelIndex,
|
||||||
|
replyId=replyId
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -451,7 +454,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
onResponse: Optional[Callable[[dict], Any]] = None,
|
onResponse: Optional[Callable[[dict], Any]] = None,
|
||||||
channelIndex: int = 0,
|
channelIndex: int = 0,
|
||||||
):
|
):
|
||||||
"""Send an alert text to some other node. This is similar to a text message,
|
"""Send an alert text to some other node. This is similar to a text message,
|
||||||
but carries a higher priority and is capable of generating special notifications
|
but carries a higher priority and is capable of generating special notifications
|
||||||
on certain clients.
|
on certain clients.
|
||||||
|
|
||||||
@@ -503,6 +506,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
pkiEncrypted: Optional[bool]=False,
|
pkiEncrypted: Optional[bool]=False,
|
||||||
publicKey: Optional[bytes]=None,
|
publicKey: Optional[bytes]=None,
|
||||||
priority: mesh_pb2.MeshPacket.Priority.ValueType=mesh_pb2.MeshPacket.Priority.RELIABLE,
|
priority: mesh_pb2.MeshPacket.Priority.ValueType=mesh_pb2.MeshPacket.Priority.RELIABLE,
|
||||||
|
replyId: Optional[int]=None,
|
||||||
): # pylint: disable=R0913
|
): # pylint: disable=R0913
|
||||||
"""Send a data packet to some other node
|
"""Send a data packet to some other node
|
||||||
|
|
||||||
@@ -527,6 +531,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
will implicitly be true.
|
will implicitly be true.
|
||||||
channelIndex -- channel number to use
|
channelIndex -- channel number to use
|
||||||
hopLimit -- hop limit to use
|
hopLimit -- hop limit to use
|
||||||
|
replyId -- the ID of the message that this packet is a response to
|
||||||
|
|
||||||
Returns the sent packet. The id field will be populated in this packet
|
Returns the sent packet. The id field will be populated in this packet
|
||||||
and can be used to track future message acks/naks.
|
and can be used to track future message acks/naks.
|
||||||
@@ -554,6 +559,8 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
meshPacket.decoded.portnum = portNum
|
meshPacket.decoded.portnum = portNum
|
||||||
meshPacket.decoded.want_response = wantResponse
|
meshPacket.decoded.want_response = wantResponse
|
||||||
meshPacket.id = self._generatePacketId()
|
meshPacket.id = self._generatePacketId()
|
||||||
|
if replyId is not None:
|
||||||
|
meshPacket.decoded.reply_id = replyId
|
||||||
if priority is not None:
|
if priority is not None:
|
||||||
meshPacket.priority = priority
|
meshPacket.priority = priority
|
||||||
|
|
||||||
@@ -884,7 +891,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
Send a waypoint deletion packet to some other node (normally a broadcast)
|
Send a waypoint deletion packet to some other node (normally a broadcast)
|
||||||
|
|
||||||
NB: The id must be the waypoint's id and not the id of the packet creation.
|
NB: The id must be the waypoint's id and not the id of the packet creation.
|
||||||
|
|
||||||
Returns the sent packet. The id field will be populated in this packet and
|
Returns the sent packet. The id field will be populated in this packet and
|
||||||
can be used to track future message acks/naks.
|
can be used to track future message acks/naks.
|
||||||
"""
|
"""
|
||||||
@@ -1077,6 +1084,20 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
return user.get("publicKey", None)
|
return user.get("publicKey", None)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def getCannedMessage(self):
|
||||||
|
"""Get canned message"""
|
||||||
|
node = self.localNode
|
||||||
|
if node is not None:
|
||||||
|
return node.get_canned_message()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def getRingtone(self):
|
||||||
|
"""Get ringtone"""
|
||||||
|
node = self.localNode
|
||||||
|
if node is not None:
|
||||||
|
return node.get_ringtone()
|
||||||
|
return None
|
||||||
|
|
||||||
def _waitConnected(self, timeout=30.0):
|
def _waitConnected(self, timeout=30.0):
|
||||||
"""Block until the initial node db download is complete, or timeout
|
"""Block until the initial node db download is complete, or timeout
|
||||||
and raise an exception"""
|
and raise an exception"""
|
||||||
@@ -1323,6 +1344,14 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
self._handleLogRecord(fromRadio.log_record)
|
self._handleLogRecord(fromRadio.log_record)
|
||||||
elif fromRadio.HasField("queueStatus"):
|
elif fromRadio.HasField("queueStatus"):
|
||||||
self._handleQueueStatusFromRadio(fromRadio.queueStatus)
|
self._handleQueueStatusFromRadio(fromRadio.queueStatus)
|
||||||
|
elif fromRadio.HasField("clientNotification"):
|
||||||
|
publishingThread.queueWork(
|
||||||
|
lambda: pub.sendMessage(
|
||||||
|
"meshtastic.clientNotification",
|
||||||
|
notification=fromRadio.clientNotification,
|
||||||
|
interface=self,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
elif fromRadio.HasField("mqttClientProxyMessage"):
|
elif fromRadio.HasField("mqttClientProxyMessage"):
|
||||||
publishingThread.queueWork(
|
publishingThread.queueWork(
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ class Node:
|
|||||||
return c.index
|
return c.index
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: bool=False):
|
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"""
|
"""Set device owner name"""
|
||||||
logging.debug(f"in setOwner nodeNum:{self.nodeNum}")
|
logging.debug(f"in setOwner nodeNum:{self.nodeNum}")
|
||||||
self.ensureSessionKey()
|
self.ensureSessionKey()
|
||||||
@@ -321,11 +321,14 @@ class Node:
|
|||||||
short_name = short_name[:nChars]
|
short_name = short_name[:nChars]
|
||||||
print(f"Maximum is 4 characters, truncated to {short_name}")
|
print(f"Maximum is 4 characters, truncated to {short_name}")
|
||||||
p.set_owner.short_name = short_name
|
p.set_owner.short_name = short_name
|
||||||
|
if is_unmessagable is not None:
|
||||||
|
p.set_owner.is_unmessagable = is_unmessagable
|
||||||
|
|
||||||
# Note: These debug lines are used in unit tests
|
# Note: These debug lines are used in unit tests
|
||||||
logging.debug(f"p.set_owner.long_name:{p.set_owner.long_name}:")
|
logging.debug(f"p.set_owner.long_name:{p.set_owner.long_name}:")
|
||||||
logging.debug(f"p.set_owner.short_name:{p.set_owner.short_name}:")
|
logging.debug(f"p.set_owner.short_name:{p.set_owner.short_name}:")
|
||||||
logging.debug(f"p.set_owner.is_licensed:{p.set_owner.is_licensed}")
|
logging.debug(f"p.set_owner.is_licensed:{p.set_owner.is_licensed}")
|
||||||
|
logging.debug(f"p.set_owner.is_unmessagable:{p.set_owner.is_unmessagable}:")
|
||||||
# If sending to a remote node, wait for ACK/NAK
|
# If sending to a remote node, wait for ACK/NAK
|
||||||
if self == self.iface.localNode:
|
if self == self.iface.localNode:
|
||||||
onResponse = None
|
onResponse = None
|
||||||
@@ -454,7 +457,6 @@ class Node:
|
|||||||
if self.ringtonePart:
|
if self.ringtonePart:
|
||||||
self.ringtone += self.ringtonePart
|
self.ringtone += self.ringtonePart
|
||||||
|
|
||||||
print(f"ringtone:{self.ringtone}")
|
|
||||||
logging.debug(f"ringtone:{self.ringtone}")
|
logging.debug(f"ringtone:{self.ringtone}")
|
||||||
return self.ringtone
|
return self.ringtone
|
||||||
|
|
||||||
@@ -530,7 +532,6 @@ class Node:
|
|||||||
if self.cannedPluginMessageMessages:
|
if self.cannedPluginMessageMessages:
|
||||||
self.cannedPluginMessage += self.cannedPluginMessageMessages
|
self.cannedPluginMessage += self.cannedPluginMessageMessages
|
||||||
|
|
||||||
print(f"canned_plugin_message:{self.cannedPluginMessage}")
|
|
||||||
logging.debug(f"canned_plugin_message:{self.cannedPluginMessage}")
|
logging.debug(f"canned_plugin_message:{self.cannedPluginMessage}")
|
||||||
return self.cannedPluginMessage
|
return self.cannedPluginMessage
|
||||||
|
|
||||||
|
|||||||
4
meshtastic/protobuf/admin_pb2.py
generated
4
meshtastic/protobuf/admin_pb2.py
generated
File diff suppressed because one or more lines are too long
96
meshtastic/protobuf/config_pb2.py
generated
96
meshtastic/protobuf/config_pb2.py
generated
File diff suppressed because one or more lines are too long
53
meshtastic/protobuf/config_pb2.pyi
generated
53
meshtastic/protobuf/config_pb2.pyi
generated
@@ -299,6 +299,12 @@ class Config(google.protobuf.message.Message):
|
|||||||
Non-notification system buzzer tones only.
|
Non-notification system buzzer tones only.
|
||||||
Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts.
|
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):
|
class BuzzerMode(_BuzzerMode, metaclass=_BuzzerModeEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -326,6 +332,12 @@ class Config(google.protobuf.message.Message):
|
|||||||
Non-notification system buzzer tones only.
|
Non-notification system buzzer tones only.
|
||||||
Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts.
|
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.
|
||||||
|
"""
|
||||||
|
|
||||||
ROLE_FIELD_NUMBER: builtins.int
|
ROLE_FIELD_NUMBER: builtins.int
|
||||||
SERIAL_ENABLED_FIELD_NUMBER: builtins.int
|
SERIAL_ENABLED_FIELD_NUMBER: builtins.int
|
||||||
@@ -1202,6 +1214,7 @@ class Config(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
gps_format: global___Config.DisplayConfig.GpsCoordinateFormat.ValueType
|
gps_format: global___Config.DisplayConfig.GpsCoordinateFormat.ValueType
|
||||||
"""
|
"""
|
||||||
|
Deprecated in 2.7.4: Unused
|
||||||
How the GPS coordinates are formatted on the OLED screen.
|
How the GPS coordinates are formatted on the OLED screen.
|
||||||
"""
|
"""
|
||||||
auto_screen_carousel_secs: builtins.int
|
auto_screen_carousel_secs: builtins.int
|
||||||
@@ -1367,6 +1380,26 @@ class Config(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Philippines 915mhz
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ...
|
class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ...
|
||||||
UNSET: Config.LoRaConfig.RegionCode.ValueType # 0
|
UNSET: Config.LoRaConfig.RegionCode.ValueType # 0
|
||||||
@@ -1457,6 +1490,26 @@ class Config(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Philippines 915mhz
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
class _ModemPreset:
|
class _ModemPreset:
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
|
|||||||
30
meshtastic/protobuf/device_ui_pb2.py
generated
30
meshtastic/protobuf/device_ui_pb2.py
generated
@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xa9\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\r\n\tBULGARIAN\x10\x11\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xda\x04\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12\x36\n\x0c\x63ompass_mode\x18\x10 \x01(\x0e\x32 .meshtastic.protobuf.CompassMode\x12\x18\n\x10screen_rgb_color\x18\x11 \x01(\r\x12\x1b\n\x13is_clockface_analog\x18\x12 \x01(\x08\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*>\n\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*\xa9\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\r\n\tBULGARIAN\x10\x11\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||||
|
|
||||||
_globals = globals()
|
_globals = globals()
|
||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
||||||
@@ -21,18 +21,20 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.device_
|
|||||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||||
DESCRIPTOR._options = None
|
DESCRIPTOR._options = None
|
||||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||||
_globals['_THEME']._serialized_start=1002
|
_globals['_COMPASSMODE']._serialized_start=1113
|
||||||
_globals['_THEME']._serialized_end=1039
|
_globals['_COMPASSMODE']._serialized_end=1175
|
||||||
_globals['_LANGUAGE']._serialized_start=1042
|
_globals['_THEME']._serialized_start=1177
|
||||||
_globals['_LANGUAGE']._serialized_end=1339
|
_globals['_THEME']._serialized_end=1214
|
||||||
|
_globals['_LANGUAGE']._serialized_start=1217
|
||||||
|
_globals['_LANGUAGE']._serialized_end=1514
|
||||||
_globals['_DEVICEUICONFIG']._serialized_start=61
|
_globals['_DEVICEUICONFIG']._serialized_start=61
|
||||||
_globals['_DEVICEUICONFIG']._serialized_end=552
|
_globals['_DEVICEUICONFIG']._serialized_end=663
|
||||||
_globals['_NODEFILTER']._serialized_start=555
|
_globals['_NODEFILTER']._serialized_start=666
|
||||||
_globals['_NODEFILTER']._serialized_end=722
|
_globals['_NODEFILTER']._serialized_end=833
|
||||||
_globals['_NODEHIGHLIGHT']._serialized_start=724
|
_globals['_NODEHIGHLIGHT']._serialized_start=835
|
||||||
_globals['_NODEHIGHLIGHT']._serialized_end=850
|
_globals['_NODEHIGHLIGHT']._serialized_end=961
|
||||||
_globals['_GEOPOINT']._serialized_start=852
|
_globals['_GEOPOINT']._serialized_start=963
|
||||||
_globals['_GEOPOINT']._serialized_end=913
|
_globals['_GEOPOINT']._serialized_end=1024
|
||||||
_globals['_MAP']._serialized_start=915
|
_globals['_MAP']._serialized_start=1026
|
||||||
_globals['_MAP']._serialized_end=1000
|
_globals['_MAP']._serialized_end=1111
|
||||||
# @@protoc_insertion_point(module_scope)
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|||||||
57
meshtastic/protobuf/device_ui_pb2.pyi
generated
57
meshtastic/protobuf/device_ui_pb2.pyi
generated
@@ -17,6 +17,41 @@ else:
|
|||||||
|
|
||||||
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
||||||
|
|
||||||
|
class _CompassMode:
|
||||||
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
|
V: typing_extensions.TypeAlias = ValueType
|
||||||
|
|
||||||
|
class _CompassModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CompassMode.ValueType], builtins.type):
|
||||||
|
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
|
||||||
|
DYNAMIC: _CompassMode.ValueType # 0
|
||||||
|
"""
|
||||||
|
Compass with dynamic ring and heading
|
||||||
|
"""
|
||||||
|
FIXED_RING: _CompassMode.ValueType # 1
|
||||||
|
"""
|
||||||
|
Compass with fixed ring and heading
|
||||||
|
"""
|
||||||
|
FREEZE_HEADING: _CompassMode.ValueType # 2
|
||||||
|
"""
|
||||||
|
Compass with heading and freeze option
|
||||||
|
"""
|
||||||
|
|
||||||
|
class CompassMode(_CompassMode, metaclass=_CompassModeEnumTypeWrapper): ...
|
||||||
|
|
||||||
|
DYNAMIC: CompassMode.ValueType # 0
|
||||||
|
"""
|
||||||
|
Compass with dynamic ring and heading
|
||||||
|
"""
|
||||||
|
FIXED_RING: CompassMode.ValueType # 1
|
||||||
|
"""
|
||||||
|
Compass with fixed ring and heading
|
||||||
|
"""
|
||||||
|
FREEZE_HEADING: CompassMode.ValueType # 2
|
||||||
|
"""
|
||||||
|
Compass with heading and freeze option
|
||||||
|
"""
|
||||||
|
global___CompassMode = CompassMode
|
||||||
|
|
||||||
class _Theme:
|
class _Theme:
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
V: typing_extensions.TypeAlias = ValueType
|
V: typing_extensions.TypeAlias = ValueType
|
||||||
@@ -249,6 +284,9 @@ class DeviceUIConfig(google.protobuf.message.Message):
|
|||||||
NODE_HIGHLIGHT_FIELD_NUMBER: builtins.int
|
NODE_HIGHLIGHT_FIELD_NUMBER: builtins.int
|
||||||
CALIBRATION_DATA_FIELD_NUMBER: builtins.int
|
CALIBRATION_DATA_FIELD_NUMBER: builtins.int
|
||||||
MAP_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
|
||||||
version: builtins.int
|
version: builtins.int
|
||||||
"""
|
"""
|
||||||
A version integer used to invalidate saved files when we make incompatible changes.
|
A version integer used to invalidate saved files when we make incompatible changes.
|
||||||
@@ -285,6 +323,20 @@ class DeviceUIConfig(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
8 integers for screen calibration data
|
8 integers for screen calibration data
|
||||||
"""
|
"""
|
||||||
|
compass_mode: global___CompassMode.ValueType
|
||||||
|
"""
|
||||||
|
Compass mode
|
||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
@property
|
@property
|
||||||
def node_filter(self) -> global___NodeFilter:
|
def node_filter(self) -> global___NodeFilter:
|
||||||
"""
|
"""
|
||||||
@@ -321,9 +373,12 @@ class DeviceUIConfig(google.protobuf.message.Message):
|
|||||||
node_highlight: global___NodeHighlight | None = ...,
|
node_highlight: global___NodeHighlight | None = ...,
|
||||||
calibration_data: builtins.bytes = ...,
|
calibration_data: builtins.bytes = ...,
|
||||||
map_data: global___Map | None = ...,
|
map_data: global___Map | None = ...,
|
||||||
|
compass_mode: global___CompassMode.ValueType = ...,
|
||||||
|
screen_rgb_color: builtins.int = ...,
|
||||||
|
is_clockface_analog: builtins.bool = ...,
|
||||||
) -> None: ...
|
) -> 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 HasField(self, field_name: typing.Literal["map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight"]) -> builtins.bool: ...
|
||||||
def ClearField(self, field_name: typing.Literal["alert_enabled", b"alert_enabled", "banner_enabled", b"banner_enabled", "calibration_data", b"calibration_data", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_lock", b"screen_lock", "screen_timeout", b"screen_timeout", "settings_lock", b"settings_lock", "theme", b"theme", "version", b"version"]) -> None: ...
|
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", "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
|
global___DeviceUIConfig = DeviceUIConfig
|
||||||
|
|
||||||
|
|||||||
6
meshtastic/protobuf/deviceonly_pb2.py
generated
6
meshtastic/protobuf/deviceonly_pb2.py
generated
@@ -12,14 +12,14 @@ _sym_db = _symbol_database.Default()
|
|||||||
|
|
||||||
|
|
||||||
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
|
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
|
||||||
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
|
|
||||||
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
|
|
||||||
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
||||||
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__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 telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
|
||||||
from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2
|
from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\"\x94\x02\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xf0\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\"\x94\x02\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xf0\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
|
||||||
|
|
||||||
_globals = globals()
|
_globals = globals()
|
||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
||||||
|
|||||||
146
meshtastic/protobuf/mesh_pb2.py
generated
146
meshtastic/protobuf/mesh_pb2.py
generated
File diff suppressed because one or more lines are too long
154
meshtastic/protobuf/mesh_pb2.pyi
generated
154
meshtastic/protobuf/mesh_pb2.pyi
generated
@@ -442,15 +442,15 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._
|
|||||||
Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin
|
Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin
|
||||||
"""
|
"""
|
||||||
LINK_32: _HardwareModel.ValueType # 98
|
LINK_32: _HardwareModel.ValueType # 98
|
||||||
"""*
|
"""
|
||||||
Lilygo LINK32 board with sensors
|
Lilygo LINK32 board with sensors
|
||||||
"""
|
"""
|
||||||
SEEED_WIO_TRACKER_L1: _HardwareModel.ValueType # 99
|
SEEED_WIO_TRACKER_L1: _HardwareModel.ValueType # 99
|
||||||
"""*
|
"""
|
||||||
Seeed Tracker L1
|
Seeed Tracker L1
|
||||||
"""
|
"""
|
||||||
SEEED_WIO_TRACKER_L1_EINK: _HardwareModel.ValueType # 100
|
SEEED_WIO_TRACKER_L1_EINK: _HardwareModel.ValueType # 100
|
||||||
"""*
|
"""
|
||||||
Seeed Tracker L1 EINK driver
|
Seeed Tracker L1 EINK driver
|
||||||
"""
|
"""
|
||||||
QWANTZ_TINY_ARMS: _HardwareModel.ValueType # 101
|
QWANTZ_TINY_ARMS: _HardwareModel.ValueType # 101
|
||||||
@@ -458,17 +458,34 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._
|
|||||||
Reserved ID for future and past use
|
Reserved ID for future and past use
|
||||||
"""
|
"""
|
||||||
T_DECK_PRO: _HardwareModel.ValueType # 102
|
T_DECK_PRO: _HardwareModel.ValueType # 102
|
||||||
"""*
|
"""
|
||||||
Lilygo T-Deck Pro
|
Lilygo T-Deck Pro
|
||||||
"""
|
"""
|
||||||
T_LORA_PAGER: _HardwareModel.ValueType # 103
|
T_LORA_PAGER: _HardwareModel.ValueType # 103
|
||||||
"""*
|
"""
|
||||||
Lilygo TLora Pager
|
Lilygo TLora Pager
|
||||||
"""
|
"""
|
||||||
GAT562_MESH_TRIAL_TRACKER: _HardwareModel.ValueType # 104
|
GAT562_MESH_TRIAL_TRACKER: _HardwareModel.ValueType # 104
|
||||||
"""*
|
"""
|
||||||
GAT562 Mesh Trial Tracker
|
GAT562 Mesh Trial Tracker
|
||||||
"""
|
"""
|
||||||
|
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/
|
||||||
|
"""
|
||||||
PRIVATE_HW: _HardwareModel.ValueType # 255
|
PRIVATE_HW: _HardwareModel.ValueType # 255
|
||||||
"""
|
"""
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -894,15 +911,15 @@ CROWPANEL: HardwareModel.ValueType # 97
|
|||||||
Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin
|
Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin
|
||||||
"""
|
"""
|
||||||
LINK_32: HardwareModel.ValueType # 98
|
LINK_32: HardwareModel.ValueType # 98
|
||||||
"""*
|
"""
|
||||||
Lilygo LINK32 board with sensors
|
Lilygo LINK32 board with sensors
|
||||||
"""
|
"""
|
||||||
SEEED_WIO_TRACKER_L1: HardwareModel.ValueType # 99
|
SEEED_WIO_TRACKER_L1: HardwareModel.ValueType # 99
|
||||||
"""*
|
"""
|
||||||
Seeed Tracker L1
|
Seeed Tracker L1
|
||||||
"""
|
"""
|
||||||
SEEED_WIO_TRACKER_L1_EINK: HardwareModel.ValueType # 100
|
SEEED_WIO_TRACKER_L1_EINK: HardwareModel.ValueType # 100
|
||||||
"""*
|
"""
|
||||||
Seeed Tracker L1 EINK driver
|
Seeed Tracker L1 EINK driver
|
||||||
"""
|
"""
|
||||||
QWANTZ_TINY_ARMS: HardwareModel.ValueType # 101
|
QWANTZ_TINY_ARMS: HardwareModel.ValueType # 101
|
||||||
@@ -910,17 +927,34 @@ QWANTZ_TINY_ARMS: HardwareModel.ValueType # 101
|
|||||||
Reserved ID for future and past use
|
Reserved ID for future and past use
|
||||||
"""
|
"""
|
||||||
T_DECK_PRO: HardwareModel.ValueType # 102
|
T_DECK_PRO: HardwareModel.ValueType # 102
|
||||||
"""*
|
"""
|
||||||
Lilygo T-Deck Pro
|
Lilygo T-Deck Pro
|
||||||
"""
|
"""
|
||||||
T_LORA_PAGER: HardwareModel.ValueType # 103
|
T_LORA_PAGER: HardwareModel.ValueType # 103
|
||||||
"""*
|
"""
|
||||||
Lilygo TLora Pager
|
Lilygo TLora Pager
|
||||||
"""
|
"""
|
||||||
GAT562_MESH_TRIAL_TRACKER: HardwareModel.ValueType # 104
|
GAT562_MESH_TRIAL_TRACKER: HardwareModel.ValueType # 104
|
||||||
"""*
|
"""
|
||||||
GAT562 Mesh Trial Tracker
|
GAT562 Mesh Trial Tracker
|
||||||
"""
|
"""
|
||||||
|
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/
|
||||||
|
"""
|
||||||
PRIVATE_HW: HardwareModel.ValueType # 255
|
PRIVATE_HW: HardwareModel.ValueType # 255
|
||||||
"""
|
"""
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -1102,6 +1136,77 @@ If you see this failure in the field please post in the forum because we are int
|
|||||||
"""
|
"""
|
||||||
global___CriticalErrorCode = CriticalErrorCode
|
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
|
||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
|
DIY_EDITION: FirmwareEdition.ValueType # 127
|
||||||
|
"""
|
||||||
|
Placeholder for DIY and unofficial events
|
||||||
|
"""
|
||||||
|
global___FirmwareEdition = FirmwareEdition
|
||||||
|
|
||||||
class _ExcludedModules:
|
class _ExcludedModules:
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
V: typing_extensions.TypeAlias = ValueType
|
V: typing_extensions.TypeAlias = ValueType
|
||||||
@@ -1764,6 +1869,11 @@ class Routing(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Admin packet sent using PKC, but not from a public key on the admin key list
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
class Error(_Error, metaclass=_ErrorEnumTypeWrapper):
|
class Error(_Error, metaclass=_ErrorEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -1837,6 +1947,11 @@ class Routing(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Admin packet sent using PKC, but not from a public key on the admin key list
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
ROUTE_REQUEST_FIELD_NUMBER: builtins.int
|
ROUTE_REQUEST_FIELD_NUMBER: builtins.int
|
||||||
ROUTE_REPLY_FIELD_NUMBER: builtins.int
|
ROUTE_REPLY_FIELD_NUMBER: builtins.int
|
||||||
@@ -2567,6 +2682,8 @@ class MyNodeInfo(google.protobuf.message.Message):
|
|||||||
MIN_APP_VERSION_FIELD_NUMBER: builtins.int
|
MIN_APP_VERSION_FIELD_NUMBER: builtins.int
|
||||||
DEVICE_ID_FIELD_NUMBER: builtins.int
|
DEVICE_ID_FIELD_NUMBER: builtins.int
|
||||||
PIO_ENV_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
|
my_node_num: builtins.int
|
||||||
"""
|
"""
|
||||||
Tells the phone what our node number is, default starting value is
|
Tells the phone what our node number is, default starting value is
|
||||||
@@ -2590,6 +2707,15 @@ class MyNodeInfo(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
The PlatformIO environment used to build this firmware
|
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__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -2598,8 +2724,10 @@ class MyNodeInfo(google.protobuf.message.Message):
|
|||||||
min_app_version: builtins.int = ...,
|
min_app_version: builtins.int = ...,
|
||||||
device_id: builtins.bytes = ...,
|
device_id: builtins.bytes = ...,
|
||||||
pio_env: builtins.str = ...,
|
pio_env: builtins.str = ...,
|
||||||
|
firmware_edition: global___FirmwareEdition.ValueType = ...,
|
||||||
|
nodedb_count: builtins.int = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def ClearField(self, field_name: typing.Literal["device_id", b"device_id", "min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "pio_env", b"pio_env", "reboot_count", b"reboot_count"]) -> 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
|
global___MyNodeInfo = MyNodeInfo
|
||||||
|
|
||||||
|
|||||||
48
meshtastic/protobuf/module_config_pb2.py
generated
48
meshtastic/protobuf/module_config_pb2.py
generated
File diff suppressed because one or more lines are too long
8
meshtastic/protobuf/module_config_pb2.pyi
generated
8
meshtastic/protobuf/module_config_pb2.pyi
generated
@@ -564,6 +564,10 @@ class ModuleConfig(google.protobuf.message.Message):
|
|||||||
"""VE.Direct is a serial protocol used by Victron Energy products
|
"""VE.Direct is a serial protocol used by Victron Energy products
|
||||||
https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable
|
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/
|
||||||
|
"""
|
||||||
|
|
||||||
class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper):
|
class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -583,6 +587,10 @@ class ModuleConfig(google.protobuf.message.Message):
|
|||||||
"""VE.Direct is a serial protocol used by Victron Energy products
|
"""VE.Direct is a serial protocol used by Victron Energy products
|
||||||
https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable
|
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/
|
||||||
|
"""
|
||||||
|
|
||||||
ENABLED_FIELD_NUMBER: builtins.int
|
ENABLED_FIELD_NUMBER: builtins.int
|
||||||
ECHO_FIELD_NUMBER: builtins.int
|
ECHO_FIELD_NUMBER: builtins.int
|
||||||
|
|||||||
4
meshtastic/protobuf/portnums_pb2.py
generated
4
meshtastic/protobuf/portnums_pb2.py
generated
@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xe5\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xf6\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||||
|
|
||||||
_globals = globals()
|
_globals = globals()
|
||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
||||||
@@ -22,5 +22,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|||||||
DESCRIPTOR._options = None
|
DESCRIPTOR._options = None
|
||||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||||
_globals['_PORTNUM']._serialized_start=60
|
_globals['_PORTNUM']._serialized_start=60
|
||||||
_globals['_PORTNUM']._serialized_end=673
|
_globals['_PORTNUM']._serialized_end=690
|
||||||
# @@protoc_insertion_point(module_scope)
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|||||||
12
meshtastic/protobuf/portnums_pb2.pyi
generated
12
meshtastic/protobuf/portnums_pb2.pyi
generated
@@ -188,6 +188,12 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy
|
|||||||
Reticulum Network Stack Tunnel App
|
Reticulum Network Stack Tunnel App
|
||||||
ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface
|
ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface
|
||||||
"""
|
"""
|
||||||
|
CAYENNE_APP: _PortNum.ValueType # 77
|
||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
PRIVATE_APP: _PortNum.ValueType # 256
|
PRIVATE_APP: _PortNum.ValueType # 256
|
||||||
"""
|
"""
|
||||||
Private applications should use portnums >= 256.
|
Private applications should use portnums >= 256.
|
||||||
@@ -386,6 +392,12 @@ RETICULUM_TUNNEL_APP: PortNum.ValueType # 76
|
|||||||
Reticulum Network Stack Tunnel App
|
Reticulum Network Stack Tunnel App
|
||||||
ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface
|
ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface
|
||||||
"""
|
"""
|
||||||
|
CAYENNE_APP: PortNum.ValueType # 77
|
||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
PRIVATE_APP: PortNum.ValueType # 256
|
PRIVATE_APP: PortNum.ValueType # 256
|
||||||
"""
|
"""
|
||||||
Private applications should use portnums >= 256.
|
Private applications should use portnums >= 256.
|
||||||
|
|||||||
32
meshtastic/protobuf/telemetry_pb2.py
generated
32
meshtastic/protobuf/telemetry_pb2.py
generated
File diff suppressed because one or more lines are too long
240
meshtastic/protobuf/telemetry_pb2.pyi
generated
240
meshtastic/protobuf/telemetry_pb2.pyi
generated
@@ -183,6 +183,22 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra
|
|||||||
"""
|
"""
|
||||||
PCT2075 Temperature Sensor
|
PCT2075 Temperature Sensor
|
||||||
"""
|
"""
|
||||||
|
ADS1X15: _TelemetrySensorType.ValueType # 40
|
||||||
|
"""
|
||||||
|
ADS1X15 ADC
|
||||||
|
"""
|
||||||
|
ADS1X15_ALT: _TelemetrySensorType.ValueType # 41
|
||||||
|
"""
|
||||||
|
ADS1X15 ADC_ALT
|
||||||
|
"""
|
||||||
|
SFA30: _TelemetrySensorType.ValueType # 42
|
||||||
|
"""
|
||||||
|
Sensirion SFA30 Formaldehyde sensor
|
||||||
|
"""
|
||||||
|
SEN5X: _TelemetrySensorType.ValueType # 43
|
||||||
|
"""
|
||||||
|
SEN5X PM SENSORS
|
||||||
|
"""
|
||||||
|
|
||||||
class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
|
class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -349,6 +365,22 @@ PCT2075: TelemetrySensorType.ValueType # 39
|
|||||||
"""
|
"""
|
||||||
PCT2075 Temperature Sensor
|
PCT2075 Temperature Sensor
|
||||||
"""
|
"""
|
||||||
|
ADS1X15: TelemetrySensorType.ValueType # 40
|
||||||
|
"""
|
||||||
|
ADS1X15 ADC
|
||||||
|
"""
|
||||||
|
ADS1X15_ALT: TelemetrySensorType.ValueType # 41
|
||||||
|
"""
|
||||||
|
ADS1X15 ADC_ALT
|
||||||
|
"""
|
||||||
|
SFA30: TelemetrySensorType.ValueType # 42
|
||||||
|
"""
|
||||||
|
Sensirion SFA30 Formaldehyde sensor
|
||||||
|
"""
|
||||||
|
SEN5X: TelemetrySensorType.ValueType # 43
|
||||||
|
"""
|
||||||
|
SEN5X PM SENSORS
|
||||||
|
"""
|
||||||
global___TelemetrySensorType = TelemetrySensorType
|
global___TelemetrySensorType = TelemetrySensorType
|
||||||
|
|
||||||
@typing.final
|
@typing.final
|
||||||
@@ -617,6 +649,16 @@ class PowerMetrics(google.protobuf.message.Message):
|
|||||||
CH2_CURRENT_FIELD_NUMBER: builtins.int
|
CH2_CURRENT_FIELD_NUMBER: builtins.int
|
||||||
CH3_VOLTAGE_FIELD_NUMBER: builtins.int
|
CH3_VOLTAGE_FIELD_NUMBER: builtins.int
|
||||||
CH3_CURRENT_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
|
ch1_voltage: builtins.float
|
||||||
"""
|
"""
|
||||||
Voltage (Ch1)
|
Voltage (Ch1)
|
||||||
@@ -641,6 +683,46 @@ class PowerMetrics(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Current (Ch3)
|
Current (Ch3)
|
||||||
"""
|
"""
|
||||||
|
ch4_voltage: builtins.float
|
||||||
|
"""
|
||||||
|
Voltage (Ch4)
|
||||||
|
"""
|
||||||
|
ch4_current: builtins.float
|
||||||
|
"""
|
||||||
|
Current (Ch4)
|
||||||
|
"""
|
||||||
|
ch5_voltage: builtins.float
|
||||||
|
"""
|
||||||
|
Voltage (Ch5)
|
||||||
|
"""
|
||||||
|
ch5_current: builtins.float
|
||||||
|
"""
|
||||||
|
Current (Ch5)
|
||||||
|
"""
|
||||||
|
ch6_voltage: builtins.float
|
||||||
|
"""
|
||||||
|
Voltage (Ch6)
|
||||||
|
"""
|
||||||
|
ch6_current: builtins.float
|
||||||
|
"""
|
||||||
|
Current (Ch6)
|
||||||
|
"""
|
||||||
|
ch7_voltage: builtins.float
|
||||||
|
"""
|
||||||
|
Voltage (Ch7)
|
||||||
|
"""
|
||||||
|
ch7_current: builtins.float
|
||||||
|
"""
|
||||||
|
Current (Ch7)
|
||||||
|
"""
|
||||||
|
ch8_voltage: builtins.float
|
||||||
|
"""
|
||||||
|
Voltage (Ch8)
|
||||||
|
"""
|
||||||
|
ch8_current: builtins.float
|
||||||
|
"""
|
||||||
|
Current (Ch8)
|
||||||
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -650,9 +732,19 @@ class PowerMetrics(google.protobuf.message.Message):
|
|||||||
ch2_current: builtins.float | None = ...,
|
ch2_current: builtins.float | None = ...,
|
||||||
ch3_voltage: builtins.float | None = ...,
|
ch3_voltage: builtins.float | None = ...,
|
||||||
ch3_current: 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: ...
|
) -> 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", "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"]) -> builtins.bool: ...
|
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", "ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage"]) -> None: ...
|
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
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_ch1_current", b"_ch1_current"]) -> typing.Literal["ch1_current"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_ch1_current", b"_ch1_current"]) -> typing.Literal["ch1_current"] | None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
@@ -665,6 +757,26 @@ class PowerMetrics(google.protobuf.message.Message):
|
|||||||
def WhichOneof(self, oneof_group: typing.Literal["_ch3_current", b"_ch3_current"]) -> typing.Literal["ch3_current"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_ch3_current", b"_ch3_current"]) -> typing.Literal["ch3_current"] | None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_ch3_voltage", b"_ch3_voltage"]) -> typing.Literal["ch3_voltage"] | None: ...
|
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
|
global___PowerMetrics = PowerMetrics
|
||||||
|
|
||||||
@@ -689,58 +801,118 @@ class AirQualityMetrics(google.protobuf.message.Message):
|
|||||||
PARTICLES_50UM_FIELD_NUMBER: builtins.int
|
PARTICLES_50UM_FIELD_NUMBER: builtins.int
|
||||||
PARTICLES_100UM_FIELD_NUMBER: builtins.int
|
PARTICLES_100UM_FIELD_NUMBER: builtins.int
|
||||||
CO2_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
|
||||||
pm10_standard: builtins.int
|
pm10_standard: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Standard PM1.0
|
Concentration Units Standard PM1.0 in ug/m3
|
||||||
"""
|
"""
|
||||||
pm25_standard: builtins.int
|
pm25_standard: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Standard PM2.5
|
Concentration Units Standard PM2.5 in ug/m3
|
||||||
"""
|
"""
|
||||||
pm100_standard: builtins.int
|
pm100_standard: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Standard PM10.0
|
Concentration Units Standard PM10.0 in ug/m3
|
||||||
"""
|
"""
|
||||||
pm10_environmental: builtins.int
|
pm10_environmental: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Environmental PM1.0
|
Concentration Units Environmental PM1.0 in ug/m3
|
||||||
"""
|
"""
|
||||||
pm25_environmental: builtins.int
|
pm25_environmental: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Environmental PM2.5
|
Concentration Units Environmental PM2.5 in ug/m3
|
||||||
"""
|
"""
|
||||||
pm100_environmental: builtins.int
|
pm100_environmental: builtins.int
|
||||||
"""
|
"""
|
||||||
Concentration Units Environmental PM10.0
|
Concentration Units Environmental PM10.0 in ug/m3
|
||||||
"""
|
"""
|
||||||
particles_03um: builtins.int
|
particles_03um: builtins.int
|
||||||
"""
|
"""
|
||||||
0.3um Particle Count
|
0.3um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
particles_05um: builtins.int
|
particles_05um: builtins.int
|
||||||
"""
|
"""
|
||||||
0.5um Particle Count
|
0.5um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
particles_10um: builtins.int
|
particles_10um: builtins.int
|
||||||
"""
|
"""
|
||||||
1.0um Particle Count
|
1.0um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
particles_25um: builtins.int
|
particles_25um: builtins.int
|
||||||
"""
|
"""
|
||||||
2.5um Particle Count
|
2.5um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
particles_50um: builtins.int
|
particles_50um: builtins.int
|
||||||
"""
|
"""
|
||||||
5.0um Particle Count
|
5.0um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
particles_100um: builtins.int
|
particles_100um: builtins.int
|
||||||
"""
|
"""
|
||||||
10.0um Particle Count
|
10.0um Particle Count in #/0.1l
|
||||||
"""
|
"""
|
||||||
co2: builtins.int
|
co2: builtins.int
|
||||||
"""
|
"""
|
||||||
CO2 concentration in ppm
|
CO2 concentration in ppm
|
||||||
"""
|
"""
|
||||||
|
co2_temperature: builtins.float
|
||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -757,12 +929,34 @@ class AirQualityMetrics(google.protobuf.message.Message):
|
|||||||
particles_50um: builtins.int | None = ...,
|
particles_50um: builtins.int | None = ...,
|
||||||
particles_100um: builtins.int | None = ...,
|
particles_100um: builtins.int | None = ...,
|
||||||
co2: 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 = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def HasField(self, field_name: typing.Literal["_co2", b"_co2", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_50um", b"_particles_50um", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "co2", b"co2", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_50um", b"particles_50um", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard"]) -> builtins.bool: ...
|
def HasField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> builtins.bool: ...
|
||||||
def ClearField(self, field_name: typing.Literal["_co2", b"_co2", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_50um", b"_particles_50um", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "co2", b"co2", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_50um", b"particles_50um", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard"]) -> None: ...
|
def ClearField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_co2", b"_co2"]) -> typing.Literal["co2"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_co2", b"_co2"]) -> typing.Literal["co2"] | None: ...
|
||||||
@typing.overload
|
@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: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_particles_03um", b"_particles_03um"]) -> typing.Literal["particles_03um"] | None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_particles_05um", b"_particles_05um"]) -> typing.Literal["particles_05um"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_particles_05um", b"_particles_05um"]) -> typing.Literal["particles_05um"] | None: ...
|
||||||
@@ -773,8 +967,12 @@ class AirQualityMetrics(google.protobuf.message.Message):
|
|||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_particles_25um", b"_particles_25um"]) -> typing.Literal["particles_25um"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_particles_25um", b"_particles_25um"]) -> typing.Literal["particles_25um"] | None: ...
|
||||||
@typing.overload
|
@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: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_particles_50um", b"_particles_50um"]) -> typing.Literal["particles_50um"] | None: ...
|
||||||
@typing.overload
|
@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: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_pm100_environmental", b"_pm100_environmental"]) -> typing.Literal["pm100_environmental"] | None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_pm100_standard", b"_pm100_standard"]) -> typing.Literal["pm100_standard"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_pm100_standard", b"_pm100_standard"]) -> typing.Literal["pm100_standard"] | None: ...
|
||||||
@@ -786,6 +984,16 @@ class AirQualityMetrics(google.protobuf.message.Message):
|
|||||||
def WhichOneof(self, oneof_group: typing.Literal["_pm25_environmental", b"_pm25_environmental"]) -> typing.Literal["pm25_environmental"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["_pm25_environmental", b"_pm25_environmental"]) -> typing.Literal["pm25_environmental"] | None: ...
|
||||||
@typing.overload
|
@typing.overload
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["_pm25_standard", b"_pm25_standard"]) -> typing.Literal["pm25_standard"] | None: ...
|
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_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
|
global___AirQualityMetrics = AirQualityMetrics
|
||||||
|
|
||||||
|
|||||||
@@ -207,6 +207,18 @@ nano_g1 = SupportedDevice(
|
|||||||
usb_product_id_in_hex="55d4",
|
usb_product_id_in_hex="55d4",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
seeed_xiao_s3 = SupportedDevice(
|
||||||
|
name = "Seeed Xiao ESP32-S3",
|
||||||
|
version = "",
|
||||||
|
for_firmware="seeed-xiao-esp32s3",
|
||||||
|
baseport_on_linux="ttyACM",
|
||||||
|
baseport_on_mac="cu.usbmodem",
|
||||||
|
usb_vendor_id_in_hex="2886",
|
||||||
|
usb_product_id_in_hex="0059",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
supported_devices = [
|
supported_devices = [
|
||||||
tbeam_v0_7,
|
tbeam_v0_7,
|
||||||
tbeam_v1_1,
|
tbeam_v1_1,
|
||||||
@@ -226,4 +238,5 @@ supported_devices = [
|
|||||||
rak4631_19003,
|
rak4631_19003,
|
||||||
rak11200,
|
rak11200,
|
||||||
nano_g1,
|
nano_g1,
|
||||||
|
seeed_xiao_s3,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ from meshtastic.__main__ import (
|
|||||||
onNode,
|
onNode,
|
||||||
onReceive,
|
onReceive,
|
||||||
tunnelMain,
|
tunnelMain,
|
||||||
|
set_missing_flags_false,
|
||||||
)
|
)
|
||||||
from meshtastic import mt_config
|
from meshtastic import mt_config
|
||||||
|
|
||||||
@@ -454,6 +455,37 @@ def test_main_set_owner_short_to_bob(capsys):
|
|||||||
assert err == ""
|
assert err == ""
|
||||||
mo.assert_called()
|
mo.assert_called()
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_main_set_is_unmessageable_to_true(capsys):
|
||||||
|
"""Test --set-is-unmessageable true"""
|
||||||
|
sys.argv = ["", "--set-is-unmessageable", "true"]
|
||||||
|
mt_config.args = sys.argv
|
||||||
|
|
||||||
|
iface = MagicMock(autospec=SerialInterface)
|
||||||
|
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
|
||||||
|
main()
|
||||||
|
out, err = capsys.readouterr()
|
||||||
|
assert re.search(r"Connected to radio", out, re.MULTILINE)
|
||||||
|
assert re.search(r"Setting device owner is_unmessageable to True", out, re.MULTILINE)
|
||||||
|
assert err == ""
|
||||||
|
mo.assert_called()
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_main_set_is_unmessagable_to_true(capsys):
|
||||||
|
"""Test --set-is-unmessagable true"""
|
||||||
|
sys.argv = ["", "--set-is-unmessagable", "true"]
|
||||||
|
mt_config.args = sys.argv
|
||||||
|
|
||||||
|
iface = MagicMock(autospec=SerialInterface)
|
||||||
|
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
|
||||||
|
main()
|
||||||
|
out, err = capsys.readouterr()
|
||||||
|
assert re.search(r"Connected to radio", out, re.MULTILINE)
|
||||||
|
assert re.search(r"Setting device owner is_unmessageable to True", out, re.MULTILINE)
|
||||||
|
assert err == ""
|
||||||
|
mo.assert_called()
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
@pytest.mark.usefixtures("reset_mt_config")
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
@@ -494,6 +526,44 @@ def test_main_get_canned_messages(capsys, caplog, iface_with_nodes):
|
|||||||
assert err == ""
|
assert err == ""
|
||||||
mo.assert_called()
|
mo.assert_called()
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_main_set_ringtone(capsys):
|
||||||
|
"""Test --set-ringtone"""
|
||||||
|
sys.argv = ["", "--set-ringtone", "foo,bar"]
|
||||||
|
mt_config.args = sys.argv
|
||||||
|
|
||||||
|
iface = MagicMock(autospec=SerialInterface)
|
||||||
|
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
|
||||||
|
main()
|
||||||
|
out, err = capsys.readouterr()
|
||||||
|
assert re.search(r"Connected to radio", out, re.MULTILINE)
|
||||||
|
assert re.search(r"Setting ringtone to foo,bar", out, re.MULTILINE)
|
||||||
|
assert err == ""
|
||||||
|
mo.assert_called()
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_main_get_ringtone(capsys, caplog, iface_with_nodes):
|
||||||
|
"""Test --get-ringtone"""
|
||||||
|
sys.argv = ["", "--get-ringtone"]
|
||||||
|
mt_config.args = sys.argv
|
||||||
|
|
||||||
|
iface = iface_with_nodes
|
||||||
|
iface.devPath = "bar"
|
||||||
|
|
||||||
|
mocked_node = MagicMock(autospec=Node)
|
||||||
|
mocked_node.get_ringtone.return_value = "foo,bar"
|
||||||
|
iface.localNode = mocked_node
|
||||||
|
|
||||||
|
with caplog.at_level(logging.DEBUG):
|
||||||
|
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
|
||||||
|
main()
|
||||||
|
out, err = capsys.readouterr()
|
||||||
|
assert re.search(r"Connected to radio", out, re.MULTILINE)
|
||||||
|
assert re.search(r"ringtone:foo,bar", out, re.MULTILINE)
|
||||||
|
assert err == ""
|
||||||
|
mo.assert_called()
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
@pytest.mark.usefixtures("reset_mt_config")
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
@@ -1724,6 +1794,8 @@ def test_main_export_config(capsys):
|
|||||||
mo.getLongName.return_value = "foo"
|
mo.getLongName.return_value = "foo"
|
||||||
mo.getShortName.return_value = "oof"
|
mo.getShortName.return_value = "oof"
|
||||||
mo.localNode.getURL.return_value = "bar"
|
mo.localNode.getURL.return_value = "bar"
|
||||||
|
mo.getCannedMessage.return_value = "foo|bar"
|
||||||
|
mo.getRingtone.return_value = "24:d=32,o=5"
|
||||||
mo.getMyNodeInfo().get.return_value = {
|
mo.getMyNodeInfo().get.return_value = {
|
||||||
"latitudeI": 1100000000,
|
"latitudeI": 1100000000,
|
||||||
"longitudeI": 1200000000,
|
"longitudeI": 1200000000,
|
||||||
@@ -1738,7 +1810,8 @@ position_broadcast_smart: true
|
|||||||
fixed_position: true
|
fixed_position: true
|
||||||
position_flags: 35"""
|
position_flags: 35"""
|
||||||
export_config(mo)
|
export_config(mo)
|
||||||
out, err = capsys.readouterr()
|
out = export_config(mo)
|
||||||
|
err = ""
|
||||||
|
|
||||||
# ensure we do not output this line
|
# ensure we do not output this line
|
||||||
assert not re.search(r"Connected to radio", out, re.MULTILINE)
|
assert not re.search(r"Connected to radio", out, re.MULTILINE)
|
||||||
@@ -1825,6 +1898,41 @@ position_flags: 35"""
|
|||||||
# mo.assert_called()
|
# mo.assert_called()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
def test_set_missing_flags_false():
|
||||||
|
"""Test set_missing_flags_false() function"""
|
||||||
|
config = {
|
||||||
|
"bluetooth": {
|
||||||
|
"enabled": True
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"txEnabled": True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false_defaults = {
|
||||||
|
("bluetooth", "enabled"),
|
||||||
|
("lora", "sx126xRxBoostedGain"),
|
||||||
|
("lora", "txEnabled"),
|
||||||
|
("lora", "usePreset"),
|
||||||
|
("position", "positionBroadcastSmartEnabled"),
|
||||||
|
("security", "serialEnabled"),
|
||||||
|
("mqtt", "encryptionEnabled"),
|
||||||
|
}
|
||||||
|
|
||||||
|
set_missing_flags_false(config, false_defaults)
|
||||||
|
|
||||||
|
# Preserved
|
||||||
|
assert config["bluetooth"]["enabled"] is True
|
||||||
|
assert config["lora"]["txEnabled"] is True
|
||||||
|
|
||||||
|
# Added
|
||||||
|
assert config["lora"]["usePreset"] is False
|
||||||
|
assert config["lora"]["sx126xRxBoostedGain"] is False
|
||||||
|
assert config["position"]["positionBroadcastSmartEnabled"] is False
|
||||||
|
assert config["security"]["serialEnabled"] is False
|
||||||
|
assert config["mqtt"]["encryptionEnabled"] is False
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
@pytest.mark.usefixtures("reset_mt_config")
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
def test_main_gpio_rd_no_gpio_channel(capsys):
|
def test_main_gpio_rd_no_gpio_channel(capsys):
|
||||||
|
|||||||
@@ -525,6 +525,28 @@ def test_getMyNodeInfo():
|
|||||||
myinfo = iface.getMyNodeInfo()
|
myinfo = iface.getMyNodeInfo()
|
||||||
assert myinfo == anode
|
assert myinfo == anode
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_getCannedMessage():
|
||||||
|
"""Test MeshInterface.getCannedMessage()"""
|
||||||
|
iface = MeshInterface(noProto=True)
|
||||||
|
node = MagicMock()
|
||||||
|
node.get_canned_message.return_value = "Hi|Bye|Yes"
|
||||||
|
iface.localNode = node
|
||||||
|
result = iface.getCannedMessage()
|
||||||
|
assert result == "Hi|Bye|Yes"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
|
def test_getRingtone():
|
||||||
|
"""Test MeshInterface.getRingtone()"""
|
||||||
|
iface = MeshInterface(noProto=True)
|
||||||
|
node = MagicMock()
|
||||||
|
node.get_ringtone.return_value = "foo,bar"
|
||||||
|
iface.localNode = node
|
||||||
|
result = iface.getRingtone()
|
||||||
|
assert result == "foo,bar"
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
@pytest.mark.usefixtures("reset_mt_config")
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
@@ -543,7 +565,6 @@ def test_generatePacketId(capsys):
|
|||||||
assert err == ""
|
assert err == ""
|
||||||
assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
|
assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
@pytest.mark.usefixtures("reset_mt_config")
|
@pytest.mark.usefixtures("reset_mt_config")
|
||||||
def test_fixupPosition_empty_pos():
|
def test_fixupPosition_empty_pos():
|
||||||
|
|||||||
@@ -563,7 +563,7 @@ def test_active_ports_on_supported_devices_mac_duplicates_check(mock_platform, m
|
|||||||
def test_message_to_json_shows_all():
|
def test_message_to_json_shows_all():
|
||||||
"""Test that message_to_json prints fields that aren't included in data passed in"""
|
"""Test that message_to_json prints fields that aren't included in data passed in"""
|
||||||
actual = json.loads(message_to_json(mesh_pb2.MyNodeInfo()))
|
actual = json.loads(message_to_json(mesh_pb2.MyNodeInfo()))
|
||||||
expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0, "deviceId": "", "pioEnv": "" }
|
expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0, "deviceId": "", "pioEnv": "", 'firmwareEdition': 'VANILLA', 'nodedbCount': 0 }
|
||||||
assert actual == expected
|
assert actual == expected
|
||||||
|
|
||||||
@pytest.mark.unit
|
@pytest.mark.unit
|
||||||
|
|||||||
1
nanopb
Submodule
1
nanopb
Submodule
Submodule nanopb added at 4380dd9e94
Submodule protobufs updated: c758376d04...1ecf94da98
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "meshtastic"
|
name = "meshtastic"
|
||||||
version = "2.6.4"
|
version = "2.7.0"
|
||||||
description = "Python API & client shell for talking to Meshtastic devices"
|
description = "Python API & client shell for talking to Meshtastic devices"
|
||||||
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
|
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
|
|||||||
Reference in New Issue
Block a user