mirror of
https://github.com/meshtastic/python.git
synced 2026-01-02 04:47:54 -05:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
01ffd83d64 | ||
|
|
7c89e231bd | ||
|
|
4673824236 | ||
|
|
d87eddfd33 | ||
|
|
31f322f1c2 | ||
|
|
89b41c1a19 | ||
|
|
1a5ca789c2 | ||
|
|
03ac322583 | ||
|
|
c63814358a | ||
|
|
663fabce74 | ||
|
|
6243965044 | ||
|
|
b180b6fb15 | ||
|
|
4c7ac60be6 | ||
|
|
0b086d10f8 | ||
|
|
426795fccd | ||
|
|
fb88ee114c |
@@ -80,7 +80,6 @@ from typing import *
|
|||||||
|
|
||||||
import google.protobuf.json_format
|
import google.protobuf.json_format
|
||||||
import serial # type: ignore[import-untyped]
|
import serial # type: ignore[import-untyped]
|
||||||
from dotmap import DotMap # type: ignore[import-untyped]
|
|
||||||
from google.protobuf.json_format import MessageToJson
|
from google.protobuf.json_format import MessageToJson
|
||||||
from pubsub import pub # type: ignore[import-untyped]
|
from pubsub import pub # type: ignore[import-untyped]
|
||||||
from tabulate import tabulate
|
from tabulate import tabulate
|
||||||
|
|||||||
@@ -13,12 +13,21 @@ import sys
|
|||||||
import time
|
import time
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
import pyqrcode # type: ignore[import-untyped]
|
try:
|
||||||
|
import pyqrcode # type: ignore[import-untyped]
|
||||||
|
except ImportError as e:
|
||||||
|
pyqrcode = None
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
from google.protobuf.json_format import MessageToDict
|
from google.protobuf.json_format import MessageToDict
|
||||||
from pubsub import pub # type: ignore[import-untyped]
|
from pubsub import pub # type: ignore[import-untyped]
|
||||||
|
|
||||||
import meshtastic.test
|
try:
|
||||||
|
import meshtastic.test
|
||||||
|
have_test = True
|
||||||
|
except ImportError as e:
|
||||||
|
have_test = False
|
||||||
|
|
||||||
import meshtastic.util
|
import meshtastic.util
|
||||||
from meshtastic import BROADCAST_ADDR, mt_config, remote_hardware
|
from meshtastic import BROADCAST_ADDR, mt_config, remote_hardware
|
||||||
from meshtastic.ble_interface import BLEInterface
|
from meshtastic.ble_interface import BLEInterface
|
||||||
@@ -479,6 +488,8 @@ def onConnected(interface):
|
|||||||
"air_quality": "air_quality_metrics",
|
"air_quality": "air_quality_metrics",
|
||||||
"airquality": "air_quality_metrics",
|
"airquality": "air_quality_metrics",
|
||||||
"power": "power_metrics",
|
"power": "power_metrics",
|
||||||
|
"localstats": "local_stats",
|
||||||
|
"local_stats": "local_stats",
|
||||||
}
|
}
|
||||||
telemType = telemMap.get(args.request_telemetry, "device_metrics")
|
telemType = telemMap.get(args.request_telemetry, "device_metrics")
|
||||||
print(
|
print(
|
||||||
@@ -889,8 +900,11 @@ def onConnected(interface):
|
|||||||
else:
|
else:
|
||||||
urldesc = "Primary channel URL"
|
urldesc = "Primary channel URL"
|
||||||
print(f"{urldesc}: {url}")
|
print(f"{urldesc}: {url}")
|
||||||
qr = pyqrcode.create(url)
|
if pyqrcode is not None:
|
||||||
print(qr.terminal())
|
qr = pyqrcode.create(url)
|
||||||
|
print(qr.terminal())
|
||||||
|
else:
|
||||||
|
print("Install pyqrcode to view a QR code printed to terminal.")
|
||||||
|
|
||||||
log_set: Optional = None # type: ignore[annotation-unchecked]
|
log_set: Optional = None # type: ignore[annotation-unchecked]
|
||||||
# we need to keep a reference to the logset so it doesn't get GCed early
|
# we need to keep a reference to the logset so it doesn't get GCed early
|
||||||
@@ -1141,11 +1155,14 @@ def common():
|
|||||||
parser.print_help(sys.stderr)
|
parser.print_help(sys.stderr)
|
||||||
meshtastic.util.our_exit("", 1)
|
meshtastic.util.our_exit("", 1)
|
||||||
elif args.test:
|
elif args.test:
|
||||||
result = meshtastic.test.testAll()
|
if not have_test:
|
||||||
if not result:
|
meshtastic.util.our_exit("Test module could not be important. Ensure you have the 'dotmap' module installed.")
|
||||||
meshtastic.util.our_exit("Warning: Test was not successful.")
|
|
||||||
else:
|
else:
|
||||||
meshtastic.util.our_exit("Test was a success.", 0)
|
result = meshtastic.test.testAll()
|
||||||
|
if not result:
|
||||||
|
meshtastic.util.our_exit("Warning: Test was not successful.")
|
||||||
|
else:
|
||||||
|
meshtastic.util.our_exit("Test was a success.", 0)
|
||||||
else:
|
else:
|
||||||
if args.seriallog == "stdout":
|
if args.seriallog == "stdout":
|
||||||
logfile = sys.stdout
|
logfile = sys.stdout
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ from decimal import Decimal
|
|||||||
from typing import Any, Callable, Dict, List, Optional, Union
|
from typing import Any, Callable, Dict, List, Optional, Union
|
||||||
|
|
||||||
import google.protobuf.json_format
|
import google.protobuf.json_format
|
||||||
import print_color # type: ignore[import-untyped]
|
try:
|
||||||
|
import print_color # type: ignore[import-untyped]
|
||||||
|
except ImportError as e:
|
||||||
|
print_color = None
|
||||||
|
|
||||||
from pubsub import pub # type: ignore[import-untyped]
|
from pubsub import pub # type: ignore[import-untyped]
|
||||||
from tabulate import tabulate
|
from tabulate import tabulate
|
||||||
|
|
||||||
@@ -153,7 +157,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def _printLogLine(line, interface):
|
def _printLogLine(line, interface):
|
||||||
"""Print a line of log output."""
|
"""Print a line of log output."""
|
||||||
if interface.debugOut == sys.stdout:
|
if print_color is not None and interface.debugOut == sys.stdout:
|
||||||
# this isn't quite correct (could cause false positives), but currently our formatting differs between different log representations
|
# this isn't quite correct (could cause false positives), but currently our formatting differs between different log representations
|
||||||
if "DEBUG" in line:
|
if "DEBUG" in line:
|
||||||
print_color.print(line, color="cyan", end=None)
|
print_color.print(line, color="cyan", end=None)
|
||||||
@@ -617,6 +621,8 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
r.air_quality_metrics.CopyFrom(telemetry_pb2.AirQualityMetrics())
|
r.air_quality_metrics.CopyFrom(telemetry_pb2.AirQualityMetrics())
|
||||||
elif telemetryType == "power_metrics":
|
elif telemetryType == "power_metrics":
|
||||||
r.power_metrics.CopyFrom(telemetry_pb2.PowerMetrics())
|
r.power_metrics.CopyFrom(telemetry_pb2.PowerMetrics())
|
||||||
|
elif telemetryType == "local_stats":
|
||||||
|
r.local_stats.CopyFrom(telemetry_pb2.LocalStats())
|
||||||
else: # fall through to device metrics
|
else: # fall through to device metrics
|
||||||
if self.nodesByNum is not None:
|
if self.nodesByNum is not None:
|
||||||
node = self.nodesByNum.get(self.localNode.nodeNum)
|
node = self.nodesByNum.get(self.localNode.nodeNum)
|
||||||
|
|||||||
2
meshtastic/protobuf/atak_pb2.pyi
generated
2
meshtastic/protobuf/atak_pb2.pyi
generated
@@ -256,7 +256,7 @@ class TAKPacket(google.protobuf.message.Message):
|
|||||||
detail: builtins.bytes
|
detail: builtins.bytes
|
||||||
"""
|
"""
|
||||||
Generic CoT detail XML
|
Generic CoT detail XML
|
||||||
May be compressed / truncated by the sender
|
May be compressed / truncated by the sender (EUD)
|
||||||
"""
|
"""
|
||||||
@property
|
@property
|
||||||
def contact(self) -> global___Contact:
|
def contact(self) -> global___Contact:
|
||||||
|
|||||||
28
meshtastic/protobuf/config_pb2.py
generated
28
meshtastic/protobuf/config_pb2.py
generated
File diff suppressed because one or more lines are too long
24
meshtastic/protobuf/config_pb2.pyi
generated
24
meshtastic/protobuf/config_pb2.pyi
generated
@@ -1202,6 +1202,18 @@ class Config(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Singapore 923mhz
|
Singapore 923mhz
|
||||||
"""
|
"""
|
||||||
|
PH_433: Config.LoRaConfig._RegionCode.ValueType # 19
|
||||||
|
"""
|
||||||
|
Philippines 433mhz
|
||||||
|
"""
|
||||||
|
PH_868: Config.LoRaConfig._RegionCode.ValueType # 20
|
||||||
|
"""
|
||||||
|
Philippines 868mhz
|
||||||
|
"""
|
||||||
|
PH_915: Config.LoRaConfig._RegionCode.ValueType # 21
|
||||||
|
"""
|
||||||
|
Philippines 915mhz
|
||||||
|
"""
|
||||||
|
|
||||||
class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ...
|
class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ...
|
||||||
UNSET: Config.LoRaConfig.RegionCode.ValueType # 0
|
UNSET: Config.LoRaConfig.RegionCode.ValueType # 0
|
||||||
@@ -1280,6 +1292,18 @@ class Config(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Singapore 923mhz
|
Singapore 923mhz
|
||||||
"""
|
"""
|
||||||
|
PH_433: Config.LoRaConfig.RegionCode.ValueType # 19
|
||||||
|
"""
|
||||||
|
Philippines 433mhz
|
||||||
|
"""
|
||||||
|
PH_868: Config.LoRaConfig.RegionCode.ValueType # 20
|
||||||
|
"""
|
||||||
|
Philippines 868mhz
|
||||||
|
"""
|
||||||
|
PH_915: Config.LoRaConfig.RegionCode.ValueType # 21
|
||||||
|
"""
|
||||||
|
Philippines 915mhz
|
||||||
|
"""
|
||||||
|
|
||||||
class _ModemPreset:
|
class _ModemPreset:
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
|
|||||||
26
meshtastic/protobuf/module_config_pb2.py
generated
26
meshtastic/protobuf/module_config_pb2.py
generated
File diff suppressed because one or more lines are too long
28
meshtastic/protobuf/module_config_pb2.pyi
generated
28
meshtastic/protobuf/module_config_pb2.pyi
generated
@@ -835,6 +835,9 @@ class ModuleConfig(google.protobuf.message.Message):
|
|||||||
POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int
|
POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int
|
||||||
POWER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
|
POWER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
|
||||||
POWER_SCREEN_ENABLED_FIELD_NUMBER: builtins.int
|
POWER_SCREEN_ENABLED_FIELD_NUMBER: builtins.int
|
||||||
|
HEALTH_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int
|
||||||
|
HEALTH_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
|
||||||
|
HEALTH_SCREEN_ENABLED_FIELD_NUMBER: builtins.int
|
||||||
device_update_interval: builtins.int
|
device_update_interval: builtins.int
|
||||||
"""
|
"""
|
||||||
Interval in seconds of how often we should try to send our
|
Interval in seconds of how often we should try to send our
|
||||||
@@ -870,18 +873,30 @@ class ModuleConfig(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
power_measurement_enabled: builtins.bool
|
power_measurement_enabled: builtins.bool
|
||||||
"""
|
"""
|
||||||
Interval in seconds of how often we should try to send our
|
Enable/disable Power metrics
|
||||||
air quality metrics to the mesh
|
|
||||||
"""
|
"""
|
||||||
power_update_interval: builtins.int
|
power_update_interval: builtins.int
|
||||||
"""
|
"""
|
||||||
Interval in seconds of how often we should try to send our
|
Interval in seconds of how often we should try to send our
|
||||||
air quality metrics to the mesh
|
power metrics to the mesh
|
||||||
"""
|
"""
|
||||||
power_screen_enabled: builtins.bool
|
power_screen_enabled: builtins.bool
|
||||||
"""
|
"""
|
||||||
|
Enable/Disable the power measurement module on-device display
|
||||||
|
"""
|
||||||
|
health_measurement_enabled: builtins.bool
|
||||||
|
"""
|
||||||
|
Preferences for the (Health) Telemetry Module
|
||||||
|
Enable/Disable the telemetry measurement module measurement collection
|
||||||
|
"""
|
||||||
|
health_update_interval: builtins.int
|
||||||
|
"""
|
||||||
Interval in seconds of how often we should try to send our
|
Interval in seconds of how often we should try to send our
|
||||||
air quality metrics to the mesh
|
health metrics to the mesh
|
||||||
|
"""
|
||||||
|
health_screen_enabled: builtins.bool
|
||||||
|
"""
|
||||||
|
Enable/Disable the health telemetry module on-device display
|
||||||
"""
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -896,8 +911,11 @@ class ModuleConfig(google.protobuf.message.Message):
|
|||||||
power_measurement_enabled: builtins.bool = ...,
|
power_measurement_enabled: builtins.bool = ...,
|
||||||
power_update_interval: builtins.int = ...,
|
power_update_interval: builtins.int = ...,
|
||||||
power_screen_enabled: builtins.bool = ...,
|
power_screen_enabled: builtins.bool = ...,
|
||||||
|
health_measurement_enabled: builtins.bool = ...,
|
||||||
|
health_update_interval: builtins.int = ...,
|
||||||
|
health_screen_enabled: builtins.bool = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def ClearField(self, field_name: typing.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ...
|
def ClearField(self, field_name: typing.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "health_measurement_enabled", b"health_measurement_enabled", "health_screen_enabled", b"health_screen_enabled", "health_update_interval", b"health_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ...
|
||||||
|
|
||||||
@typing.final
|
@typing.final
|
||||||
class CannedMessageConfig(google.protobuf.message.Message):
|
class CannedMessageConfig(google.protobuf.message.Message):
|
||||||
|
|||||||
18
meshtastic/protobuf/telemetry_pb2.py
generated
18
meshtastic/protobuf/telemetry_pb2.py
generated
File diff suppressed because one or more lines are too long
95
meshtastic/protobuf/telemetry_pb2.pyi
generated
95
meshtastic/protobuf/telemetry_pb2.pyi
generated
@@ -143,6 +143,14 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra
|
|||||||
"""
|
"""
|
||||||
Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor
|
Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor
|
||||||
"""
|
"""
|
||||||
|
MAX30102: _TelemetrySensorType.ValueType # 30
|
||||||
|
"""
|
||||||
|
MAX30102 Pulse Oximeter and Heart-Rate Sensor
|
||||||
|
"""
|
||||||
|
MLX90614: _TelemetrySensorType.ValueType # 31
|
||||||
|
"""
|
||||||
|
MLX90614 non-contact IR temperature sensor.
|
||||||
|
"""
|
||||||
|
|
||||||
class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
|
class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -269,6 +277,14 @@ CUSTOM_SENSOR: TelemetrySensorType.ValueType # 29
|
|||||||
"""
|
"""
|
||||||
Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor
|
Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor
|
||||||
"""
|
"""
|
||||||
|
MAX30102: TelemetrySensorType.ValueType # 30
|
||||||
|
"""
|
||||||
|
MAX30102 Pulse Oximeter and Heart-Rate Sensor
|
||||||
|
"""
|
||||||
|
MLX90614: TelemetrySensorType.ValueType # 31
|
||||||
|
"""
|
||||||
|
MLX90614 non-contact IR temperature sensor.
|
||||||
|
"""
|
||||||
global___TelemetrySensorType = TelemetrySensorType
|
global___TelemetrySensorType = TelemetrySensorType
|
||||||
|
|
||||||
@typing.final
|
@typing.final
|
||||||
@@ -677,6 +693,9 @@ class LocalStats(google.protobuf.message.Message):
|
|||||||
NUM_PACKETS_RX_BAD_FIELD_NUMBER: builtins.int
|
NUM_PACKETS_RX_BAD_FIELD_NUMBER: builtins.int
|
||||||
NUM_ONLINE_NODES_FIELD_NUMBER: builtins.int
|
NUM_ONLINE_NODES_FIELD_NUMBER: builtins.int
|
||||||
NUM_TOTAL_NODES_FIELD_NUMBER: builtins.int
|
NUM_TOTAL_NODES_FIELD_NUMBER: builtins.int
|
||||||
|
NUM_RX_DUPE_FIELD_NUMBER: builtins.int
|
||||||
|
NUM_TX_RELAY_FIELD_NUMBER: builtins.int
|
||||||
|
NUM_TX_RELAY_CANCELED_FIELD_NUMBER: builtins.int
|
||||||
uptime_seconds: builtins.int
|
uptime_seconds: builtins.int
|
||||||
"""
|
"""
|
||||||
How long the device has been running since the last reboot (in seconds)
|
How long the device has been running since the last reboot (in seconds)
|
||||||
@@ -695,7 +714,7 @@ class LocalStats(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
num_packets_rx: builtins.int
|
num_packets_rx: builtins.int
|
||||||
"""
|
"""
|
||||||
Number of packets received good
|
Number of packets received (both good and bad)
|
||||||
"""
|
"""
|
||||||
num_packets_rx_bad: builtins.int
|
num_packets_rx_bad: builtins.int
|
||||||
"""
|
"""
|
||||||
@@ -709,6 +728,20 @@ class LocalStats(google.protobuf.message.Message):
|
|||||||
"""
|
"""
|
||||||
Number of nodes total
|
Number of nodes total
|
||||||
"""
|
"""
|
||||||
|
num_rx_dupe: builtins.int
|
||||||
|
"""
|
||||||
|
Number of received packets that were duplicates (due to multiple nodes relaying).
|
||||||
|
If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role.
|
||||||
|
"""
|
||||||
|
num_tx_relay: builtins.int
|
||||||
|
"""
|
||||||
|
Number of packets we transmitted that were a relay for others (not originating from ourselves).
|
||||||
|
"""
|
||||||
|
num_tx_relay_canceled: builtins.int
|
||||||
|
"""
|
||||||
|
Number of times we canceled a packet to be relayed, because someone else did it before us.
|
||||||
|
This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you.
|
||||||
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -720,11 +753,55 @@ class LocalStats(google.protobuf.message.Message):
|
|||||||
num_packets_rx_bad: builtins.int = ...,
|
num_packets_rx_bad: builtins.int = ...,
|
||||||
num_online_nodes: builtins.int = ...,
|
num_online_nodes: builtins.int = ...,
|
||||||
num_total_nodes: builtins.int = ...,
|
num_total_nodes: builtins.int = ...,
|
||||||
|
num_rx_dupe: builtins.int = ...,
|
||||||
|
num_tx_relay: builtins.int = ...,
|
||||||
|
num_tx_relay_canceled: builtins.int = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_total_nodes", b"num_total_nodes", "uptime_seconds", b"uptime_seconds"]) -> None: ...
|
def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_rx_dupe", b"num_rx_dupe", "num_total_nodes", b"num_total_nodes", "num_tx_relay", b"num_tx_relay", "num_tx_relay_canceled", b"num_tx_relay_canceled", "uptime_seconds", b"uptime_seconds"]) -> None: ...
|
||||||
|
|
||||||
global___LocalStats = LocalStats
|
global___LocalStats = LocalStats
|
||||||
|
|
||||||
|
@typing.final
|
||||||
|
class HealthMetrics(google.protobuf.message.Message):
|
||||||
|
"""
|
||||||
|
Health telemetry metrics
|
||||||
|
"""
|
||||||
|
|
||||||
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
||||||
|
|
||||||
|
HEART_BPM_FIELD_NUMBER: builtins.int
|
||||||
|
SPO2_FIELD_NUMBER: builtins.int
|
||||||
|
TEMPERATURE_FIELD_NUMBER: builtins.int
|
||||||
|
heart_bpm: builtins.int
|
||||||
|
"""
|
||||||
|
Heart rate (beats per minute)
|
||||||
|
"""
|
||||||
|
spO2: builtins.int
|
||||||
|
"""
|
||||||
|
SpO2 (blood oxygen saturation) level
|
||||||
|
"""
|
||||||
|
temperature: builtins.float
|
||||||
|
"""
|
||||||
|
Body temperature in degrees Celsius
|
||||||
|
"""
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
heart_bpm: builtins.int | None = ...,
|
||||||
|
spO2: builtins.int | None = ...,
|
||||||
|
temperature: builtins.float | None = ...,
|
||||||
|
) -> None: ...
|
||||||
|
def HasField(self, field_name: typing.Literal["_heart_bpm", b"_heart_bpm", "_spO2", b"_spO2", "_temperature", b"_temperature", "heart_bpm", b"heart_bpm", "spO2", b"spO2", "temperature", b"temperature"]) -> builtins.bool: ...
|
||||||
|
def ClearField(self, field_name: typing.Literal["_heart_bpm", b"_heart_bpm", "_spO2", b"_spO2", "_temperature", b"_temperature", "heart_bpm", b"heart_bpm", "spO2", b"spO2", "temperature", b"temperature"]) -> None: ...
|
||||||
|
@typing.overload
|
||||||
|
def WhichOneof(self, oneof_group: typing.Literal["_heart_bpm", b"_heart_bpm"]) -> typing.Literal["heart_bpm"] | None: ...
|
||||||
|
@typing.overload
|
||||||
|
def WhichOneof(self, oneof_group: typing.Literal["_spO2", b"_spO2"]) -> typing.Literal["spO2"] | None: ...
|
||||||
|
@typing.overload
|
||||||
|
def WhichOneof(self, oneof_group: typing.Literal["_temperature", b"_temperature"]) -> typing.Literal["temperature"] | None: ...
|
||||||
|
|
||||||
|
global___HealthMetrics = HealthMetrics
|
||||||
|
|
||||||
@typing.final
|
@typing.final
|
||||||
class Telemetry(google.protobuf.message.Message):
|
class Telemetry(google.protobuf.message.Message):
|
||||||
"""
|
"""
|
||||||
@@ -739,6 +816,7 @@ class Telemetry(google.protobuf.message.Message):
|
|||||||
AIR_QUALITY_METRICS_FIELD_NUMBER: builtins.int
|
AIR_QUALITY_METRICS_FIELD_NUMBER: builtins.int
|
||||||
POWER_METRICS_FIELD_NUMBER: builtins.int
|
POWER_METRICS_FIELD_NUMBER: builtins.int
|
||||||
LOCAL_STATS_FIELD_NUMBER: builtins.int
|
LOCAL_STATS_FIELD_NUMBER: builtins.int
|
||||||
|
HEALTH_METRICS_FIELD_NUMBER: builtins.int
|
||||||
time: builtins.int
|
time: builtins.int
|
||||||
"""
|
"""
|
||||||
Seconds since 1970 - or 0 for unknown/unset
|
Seconds since 1970 - or 0 for unknown/unset
|
||||||
@@ -773,6 +851,12 @@ class Telemetry(google.protobuf.message.Message):
|
|||||||
Local device mesh statistics
|
Local device mesh statistics
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@property
|
||||||
|
def health_metrics(self) -> global___HealthMetrics:
|
||||||
|
"""
|
||||||
|
Health telemetry metrics
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
@@ -782,10 +866,11 @@ class Telemetry(google.protobuf.message.Message):
|
|||||||
air_quality_metrics: global___AirQualityMetrics | None = ...,
|
air_quality_metrics: global___AirQualityMetrics | None = ...,
|
||||||
power_metrics: global___PowerMetrics | None = ...,
|
power_metrics: global___PowerMetrics | None = ...,
|
||||||
local_stats: global___LocalStats | None = ...,
|
local_stats: global___LocalStats | None = ...,
|
||||||
|
health_metrics: global___HealthMetrics | None = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def HasField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ...
|
def HasField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ...
|
||||||
def ClearField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ...
|
def ClearField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ...
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics", "local_stats"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics", "local_stats", "health_metrics"] | None: ...
|
||||||
|
|
||||||
global___Telemetry = Telemetry
|
global___Telemetry = Telemetry
|
||||||
|
|
||||||
|
|||||||
@@ -675,5 +675,8 @@ def check_if_newer_version() -> Optional[str]:
|
|||||||
|
|
||||||
def message_to_json(message: Message, multiline: bool=False) -> str:
|
def message_to_json(message: Message, multiline: bool=False) -> str:
|
||||||
"""Return protobuf message as JSON. Always print all fields, even when not present in data."""
|
"""Return protobuf message as JSON. Always print all fields, even when not present in data."""
|
||||||
json = MessageToJson(message, always_print_fields_with_no_presence=True)
|
try:
|
||||||
|
json = MessageToJson(message, always_print_fields_with_no_presence=True)
|
||||||
|
except TypeError:
|
||||||
|
json = MessageToJson(message, including_default_value_fields=True) # type: ignore[call-arg] # pylint: disable=E1123
|
||||||
return stripnl(json) if not multiline else json
|
return stripnl(json) if not multiline else json
|
||||||
|
|||||||
1522
poetry.lock
generated
1522
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
Submodule protobufs updated: 83c78e26e3...c9ae7fd478
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "meshtastic"
|
name = "meshtastic"
|
||||||
version = "2.5.4"
|
version = "2.5.6"
|
||||||
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"
|
||||||
@@ -9,19 +9,16 @@ readme = "README.md"
|
|||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.9,<3.14" # 3.9 is needed for pandas, bleak requires <3.14
|
python = "^3.9,<3.14" # 3.9 is needed for pandas, bleak requires <3.14
|
||||||
pyserial = "^3.5"
|
pyserial = "^3.5"
|
||||||
protobuf = ">=5.26.0"
|
protobuf = ">=4.21.12"
|
||||||
dotmap = "^1.3.30"
|
|
||||||
pexpect = "^4.9.0"
|
|
||||||
pyqrcode = "^1.2.1"
|
|
||||||
tabulate = "^0.9.0"
|
tabulate = "^0.9.0"
|
||||||
webencodings = "^0.5.1"
|
|
||||||
requests = "^2.31.0"
|
requests = "^2.31.0"
|
||||||
pyparsing = "^3.1.2"
|
|
||||||
pyyaml = "^6.0.1"
|
pyyaml = "^6.0.1"
|
||||||
pypubsub = "^4.0.3"
|
pypubsub = "^4.0.3"
|
||||||
bleak = "^0.22.3"
|
bleak = "^0.22.3"
|
||||||
packaging = "^24.0"
|
packaging = "^24.0"
|
||||||
print-color = "^0.4.6"
|
pyqrcode = { version = "^1.2.1", optional = true }
|
||||||
|
dotmap = { version = "^1.3.30", optional = true }
|
||||||
|
print-color = { version = "^0.4.6", optional = true }
|
||||||
dash = { version = "^2.17.1", optional = true }
|
dash = { version = "^2.17.1", optional = true }
|
||||||
pytap2 = { version = "^2.3.0", optional = true }
|
pytap2 = { version = "^2.3.0", optional = true }
|
||||||
dash-bootstrap-components = { version = "^1.6.0", optional = true }
|
dash-bootstrap-components = { version = "^1.6.0", optional = true }
|
||||||
@@ -37,7 +34,7 @@ autopep8 = "^2.1.0"
|
|||||||
pylint = "^3.2.3"
|
pylint = "^3.2.3"
|
||||||
pyinstaller = "^6.8.0"
|
pyinstaller = "^6.8.0"
|
||||||
mypy = "^1.10.0"
|
mypy = "^1.10.0"
|
||||||
mypy-protobuf = "^3.6.0"
|
mypy-protobuf = "^3.3.0"
|
||||||
types-protobuf = "^5.26.0.20240422"
|
types-protobuf = "^5.26.0.20240422"
|
||||||
types-tabulate = "^0.9.0.20240106"
|
types-tabulate = "^0.9.0.20240106"
|
||||||
types-requests = "^2.31.0.20240406"
|
types-requests = "^2.31.0.20240406"
|
||||||
@@ -67,6 +64,7 @@ ipywidgets = "^8.1.3"
|
|||||||
jupyterlab-widgets = "^3.0.11"
|
jupyterlab-widgets = "^3.0.11"
|
||||||
|
|
||||||
[tool.poetry.extras]
|
[tool.poetry.extras]
|
||||||
|
cli = ["pyqrcode", "print-color", "dotmap"]
|
||||||
tunnel = ["pytap2"]
|
tunnel = ["pytap2"]
|
||||||
analysis = ["dash", "dash-bootstrap-components", "pandas", "pandas-stubs"]
|
analysis = ["dash", "dash-bootstrap-components", "pandas", "pandas-stubs"]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user