Compare commits

..

8 Commits

Author SHA1 Message Date
Ben Meadors
7422d9d314 Update 2025-03-04 08:15:55 -06:00
Ben Meadors
5ee0264737 Where's intellisense when you need it 2025-03-03 15:28:14 -06:00
Ben Meadors
ec13bd308a Remove print 2025-03-03 15:23:48 -06:00
Ben Meadors
2d88d8e918 Good lawd I did that in a hurry 2025-03-03 15:23:21 -06:00
Ben Meadors
fb48fc20b3 Optionals 2025-03-03 07:56:03 -06:00
Ben Meadors
336e5154a3 Add args for cli 2025-03-03 06:58:45 -06:00
Ben Meadors
3008e039fb Bump version 2025-03-03 06:51:12 -06:00
Ben Meadors
4bf61d4c98 Add backup / restore admin commands 2025-03-03 06:48:06 -06:00
5 changed files with 92 additions and 18 deletions

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -1,10 +1,4 @@
<div align="center" markdown="1">
<img src=".github/meshtastic_logo.png" alt="Meshtastic Logo" width="80"/>
<h1 align="center"> Meshtastic Python
</h1>
<p style="font-size:15px;" align="center">A Python library and client for use with Meshtastic devices. </p>
# Meshtastic Python
[![codecov](https://codecov.io/gh/meshtastic/python/branch/master/graph/badge.svg?token=TIWPJL73KV)](https://codecov.io/gh/meshtastic/python)
![PyPI - Downloads](https://img.shields.io/pypi/dm/meshtastic)
@@ -13,20 +7,17 @@
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
![GPL-3.0](https://img.shields.io/badge/License-GPL%20v3-blue.svg)
</div>
<div align="center">
<a href="https://meshtastic.org/docs/software/python/cli/installation">Getting Started Guide</a>
-
<a href="https://python.meshtastic.org">API Documentation</a>
</div>
## Overview
A Python client for use with Meshtastic devices.
This small library (and example application) provides an easy API for sending and receiving messages over mesh radios.
It also provides access to any of the operations/data available in the device user interface or the Android application.
Events are delivered using a publish-subscribe model, and you can subscribe to only the message types you are interested in.
**[Getting Started Guide](https://meshtastic.org/docs/software/python/cli/installation)**
**[API Documentation](https://python.meshtastic.org)**
## Call for Contributors
This library and CLI has gone without a consistent maintainer for a while, and there's many improvements that could be made. We're all volunteers here and help is extremely appreciated, whether in implementing your own needs or helping maintain the library and CLI in general.

View File

@@ -59,7 +59,7 @@ except ImportError as e:
have_powermon = False
powermon_exception = e
meter = None
from meshtastic.protobuf import channel_pb2, config_pb2, portnums_pb2
from meshtastic.protobuf import admin_pb2, channel_pb2, config_pb2, portnums_pb2
from meshtastic.version import get_active_version
def onReceive(packet, interface) -> None:
@@ -462,6 +462,22 @@ def onConnected(interface):
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).removeFavorite(args.remove_favorite_node)
if args.backup_prefs:
closeNow = True
waitForAckNak = True
print(f"Backing up preferences to {args.backup_prefs}")
interface.getNode(args.dest, False, **getNode_kwargs).backupPreferences(args.backup_prefs)
if args.restore_prefs:
closeNow = True
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).restorePreferences(args.restore_prefs)
if args.remove_backup_prefs:
closeNow = True
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).removePreferencesBackups(args.remove_backup_prefs)
if args.set_ignored_node:
closeNow = True
waitForAckNak = True
@@ -1794,12 +1810,40 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars
action="store_true",
)
group.add_argument(
"--backup-prefs",
help="Tell the destination node to create a backup preferences file."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--restore-prefs",
help="Tell the destination node to remove backup preferences files."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--remove-backup-prefs",
help="Tell the destination node to remove backup preferences files."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--remove-node",
help="Tell the destination node to remove a specific node from its NodeDB. "
"Use the node ID with a '!' or '0x' prefix or the node number.",
metavar="!xxxxxxxx"
)
group.add_argument(
"--set-favorite-node",
help="Tell the destination node to set the specified node to be favorited on the NodeDB. "

View File

@@ -707,8 +707,47 @@ class Node:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def backupPreferences(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to backup preferences to flash."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.backup_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def restorePreferences(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to restore preferences from backup."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.restore_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def removePreferencesBackups(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to remove backup preferences from the filesystem."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.remove_backup_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def removeFavorite(self, nodeId: Union[int, str]):
"""Tell the node to set the specified node ID to be un-favorited on the NodeDB on the device"""
"""Tell the node to set the specified node ID to be un-favorited on the NodeDB on the device."""
self.ensureSessionKey()
if isinstance(nodeId, str):
if nodeId.startswith("!"):

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "meshtastic"
version = "2.6.0"
version = "2.6.0a1"
description = "Python API & client shell for talking to Meshtastic devices"
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
license = "GPL-3.0-only"