diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index e7886e6..3184d2a 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -314,35 +314,17 @@ def onConnected(interface): print("Setting device position and enabling fixed position setting") # can include lat/long/alt etc: latitude = 37.5, longitude = -122.1 interface.localNode.setFixedPosition(lat, lon, alt) - elif not args.no_time: - # We normally provide a current time to the mesh when we connect - if ( - interface.localNode.nodeNum in interface.nodesByNum - and "position" in interface.nodesByNum[interface.localNode.nodeNum] - ): - # send the same position the node already knows, just to update time - position = interface.nodesByNum[interface.localNode.nodeNum]["position"] - interface.sendPosition( - position.get("latitude", 0.0), - position.get("longitude", 0.0), - position.get("altitude", 0.0), - ) - else: - interface.sendPosition() - if args.set_owner: + if args.set_owner or args.set_owner_short: closeNow = True waitForAckNak = True - print(f"Setting device owner to {args.set_owner}") - interface.getNode(args.dest, False).setOwner(args.set_owner) - - if args.set_owner_short: - closeNow = True - waitForAckNak = True - print(f"Setting device owner short to {args.set_owner_short}") - interface.getNode(args.dest, False).setOwner( - long_name=None, short_name=args.set_owner_short - ) + if args.set_owner and 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: + print(f"Setting device owner to {args.set_owner}") + else: # short name only + print(f"Setting device owner short to {args.set_owner_short}") + interface.getNode(args.dest, False).setOwner(long_name=args.set_owner, short_name=args.set_owner_short) # TODO: add to export-config and configure if args.set_canned_message: @@ -778,7 +760,8 @@ def onConnected(interface): channelIndex = mt_config.channel_index if channelIndex is None: meshtastic.util.our_exit("Warning: Need to specify '--ch-index'.", 1) - ch = interface.getNode(args.dest).channels[channelIndex] + node = interface.getNode(args.dest) + ch = node.channels[channelIndex] if args.ch_enable or args.ch_disable: print( @@ -836,7 +819,7 @@ def onConnected(interface): ch.role = channel_pb2.Channel.Role.DISABLED print(f"Writing modified channels to device") - interface.getNode(args.dest).writeChannel(channelIndex) + node.writeChannel(channelIndex) if args.get_canned_message: closeNow = True @@ -1466,6 +1449,10 @@ def initParser(): group.add_argument("--set-owner", help="Set device owner name", action="store") + group.add_argument( + "--set-owner-short", help="Set device owner short name", action="store" + ) + group.add_argument( "--set-canned-message", help="Set the canned messages plugin message (up to 200 characters).", @@ -1478,10 +1465,6 @@ def initParser(): action="store", ) - group.add_argument( - "--set-owner-short", help="Set device owner short name", action="store" - ) - group.add_argument( "--set-ham", help="Set licensed Ham ID and turn off encryption", action="store" ) @@ -1587,7 +1570,7 @@ def initParser(): group.add_argument( "--no-time", - help="Suppress sending the current time to the mesh", + help="Deprecated. Retained for backwards compatibility in scripts, but is a no-op.", action="store_true", ) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index c061534..f07d922 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -443,7 +443,6 @@ class MeshInterface: # pylint: disable=R0902 latitude: float = 0.0, longitude: float = 0.0, altitude: int = 0, - timeSec: int = 0, destinationId: Union[int, str] = BROADCAST_ADDR, wantAck: bool = False, wantResponse: bool = False, @@ -455,8 +454,6 @@ class MeshInterface: # pylint: disable=R0902 Also, the device software will notice this packet and use it to automatically set its notion of the local position. - If timeSec is not specified (recommended), we will use the local machine time. - Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. """ @@ -473,11 +470,6 @@ class MeshInterface: # pylint: disable=R0902 p.altitude = int(altitude) logging.debug(f"p.altitude:{p.altitude}") - if timeSec == 0: - timeSec = int(time.time()) # returns unix timestamp in seconds - p.time = timeSec - logging.debug(f"p.time:{p.time}") - if wantResponse: onResponse = self.onResponsePosition else: @@ -852,19 +844,22 @@ class MeshInterface: # pylint: disable=R0902 lambda: pub.sendMessage("meshtastic.connection.lost", interface=self) ) + def sendHeartbeat(self): + """Sends a heartbeat to the radio. Can be used to verify the connection is healthy.""" + p = mesh_pb2.ToRadio() + p.heartbeat.CopyFrom(mesh_pb2.Heartbeat()) + self._sendToRadio(p) + def _startHeartbeat(self): """We need to send a heartbeat message to the device every X seconds""" def callback(): self.heartbeatTimer = None - i = 300 - logging.debug(f"Sending heartbeat, interval {i} seconds") - if i != 0: - self.heartbeatTimer = threading.Timer(i, callback) - self.heartbeatTimer.start() - p = mesh_pb2.ToRadio() - p.heartbeat.CopyFrom(mesh_pb2.Heartbeat()) - self._sendToRadio(p) + interval = 300 + logging.debug(f"Sending heartbeat, interval {interval} seconds") + self.heartbeatTimer = threading.Timer(interval, callback) + self.heartbeatTimer.start() + self.sendHeartbeat() callback() # run our periodic callback now, it will make another timer if necessary @@ -1015,13 +1010,6 @@ class MeshInterface: # pylint: disable=R0902 self.localNode.nodeNum = self.myInfo.my_node_num logging.debug(f"Received myinfo: {stripnl(fromRadio.my_info)}") - failmsg = None - - if failmsg: - self.failure = MeshInterface.MeshInterfaceError(failmsg) - self.isConnected.set() # let waitConnected return this exception - self.close() - elif fromRadio.HasField("metadata"): self.metadata = fromRadio.metadata logging.debug(f"Received device metadata: {stripnl(fromRadio.metadata)}") diff --git a/meshtastic/node.py b/meshtastic/node.py index 69f9058..ca1977c 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -5,7 +5,7 @@ import base64 import logging import time -from typing import Union +from typing import Optional, Union from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, localonly_pb2, mesh_pb2, portnums_pb2 from meshtastic.util import ( @@ -286,7 +286,7 @@ class Node: return c.index return 0 - def setOwner(self, long_name=None, short_name=None, is_licensed=False): + def setOwner(self, long_name: Optional[str]=None, short_name: Optional[str]=None, is_licensed: bool=False): """Set device owner name""" logging.debug(f"in setOwner nodeNum:{self.nodeNum}") self.ensureSessionKey() diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index f637c62..21f80c6 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -185,7 +185,7 @@ def test_sendPosition(caplog): with caplog.at_level(logging.DEBUG): iface.sendPosition() iface.close() - assert re.search(r"p.time:", caplog.text, re.MULTILINE) + # assert re.search(r"p.time:", caplog.text, re.MULTILINE) # TODO