diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82d1c99..543db54 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: - "3.9" - "3.10" - "3.11" + - "3.12" steps: - uses: actions/checkout@v4 - name: Install Python 3 @@ -58,6 +59,7 @@ jobs: - "3.9" - "3.10" - "3.11" + - "3.12" steps: - uses: actions/checkout@v4 - name: Install Python 3 diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 42df8ae..a51309d 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -371,13 +371,14 @@ class MeshInterface: # pylint: disable=R0902 def sendData( self, data, - destinationId: Union[int, str] = BROADCAST_ADDR, - portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.PRIVATE_APP, - wantAck: bool = False, - wantResponse: bool = False, - onResponse: Optional[Callable[[dict], Any]] = None, - onResponseAckPermitted: bool = False, - channelIndex: int = 0, + destinationId: Union[int, str]=BROADCAST_ADDR, + portNum: portnums_pb2.PortNum.ValueType=portnums_pb2.PortNum.PRIVATE_APP, + wantAck: bool=False, + wantResponse: bool=False, + onResponse: Optional[Callable[[dict], Any]]=None, + onResponseAckPermitted: bool=False, + channelIndex: int=0, + hopLimit: Optional[int]=None, ): """Send a data packet to some other node @@ -400,7 +401,8 @@ class MeshInterface: # pylint: disable=R0902 for regular ACKs (True) or just data responses & NAKs (False) Note that if the onResponse callback is called 'onAckNak' this will implicitly be true. - channelIndex - channel number to use + channelIndex -- channel number to use + hopLimit -- hop limit to use Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -431,10 +433,8 @@ class MeshInterface: # pylint: disable=R0902 if onResponse is not None: logging.debug(f"Setting a response handler for requestId {meshPacket.id}") - self._addResponseHandler( - meshPacket.id, onResponse, ackPermitted=onResponseAckPermitted - ) - p = self._sendPacket(meshPacket, destinationId, wantAck=wantAck) + self._addResponseHandler(meshPacket.id, onResponse, ackPermitted=onResponseAckPermitted) + p = self._sendPacket(meshPacket, destinationId, wantAck=wantAck, hopLimit=hopLimit) return p def sendPosition( @@ -539,6 +539,7 @@ class MeshInterface: # pylint: disable=R0902 wantResponse=True, onResponse=self.onResponseTraceRoute, channelIndex=channelIndex, + hopLimit=hopLimit, ) # extend timeout based on number of nodes, limit by configured hopLimit waitFactor = min(len(self.nodes) - 1 if self.nodes else 0, hopLimit) @@ -645,8 +646,9 @@ class MeshInterface: # pylint: disable=R0902 def _sendPacket( self, meshPacket: mesh_pb2.MeshPacket, - destinationId: Union[int, str] = BROADCAST_ADDR, - wantAck: bool = False, + destinationId: Union[int,str]=BROADCAST_ADDR, + wantAck: bool=False, + hopLimit: Optional[int]=None ): """Send a MeshPacket to the specified node (or if unspecified, broadcast). You probably don't want this - use sendData instead. @@ -688,9 +690,12 @@ class MeshInterface: # pylint: disable=R0902 meshPacket.to = nodeNum meshPacket.want_ack = wantAck - loraConfig = getattr(self.localNode.localConfig, "lora") - hopLimit = getattr(loraConfig, "hop_limit") - meshPacket.hop_limit = hopLimit + + if hopLimit is not None: + meshPacket.hop_limit = hopLimit + else: + loraConfig = getattr(self.localNode.localConfig, "lora") + meshPacket.hop_limit = getattr(loraConfig, "hop_limit") # if the user hasn't set an ID for this packet (likely and recommended), # we should pick a new unique ID so the message can be tracked. diff --git a/meshtastic/node.py b/meshtastic/node.py index 31a5b03..48b9508 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -128,7 +128,7 @@ class Node: print("Requesting current config from remote node (this can take a while).") msgIndex = configType.index - if configType.containing_type.full_name in ("meshtastic.LocalConfig", "LocalConfig"): + if configType.containing_type.name == "LocalConfig": p = admin_pb2.AdminMessage() p.get_config_request = msgIndex self._sendAdmin(p, wantResponse=True, onResponse=onResponse) diff --git a/poetry.lock b/poetry.lock index 54490f2..4c4b23d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -324,13 +324,13 @@ files = [ [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -3021,6 +3021,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, diff --git a/pyproject.toml b/pyproject.toml index 368dcfb..d089606 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.3.13" +version = "2.3.14" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only"