diff --git a/meshtastic/example_config.yaml b/meshtastic/example_config.yaml deleted file mode 100644 index 231b465..0000000 --- a/meshtastic/example_config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -owner: Bob TBeam - -channel_url: https://www.meshtastic.org/d/#CgUYAyIBAQ - -location: - lat: 35.88888 - lon: -93.88888 - alt: 304 - -user_prefs: - region: 1 - is_always_powered: 'true' - send_owner_interval: 2 - screen_on_secs: 31536000 - wait_bluetooth_secs: 31536000 diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index e7469d4..fee9166 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -461,7 +461,7 @@ class MeshInterface: Called by subclasses.""" fromRadio = mesh_pb2.FromRadio() fromRadio.ParseFromString(fromRadioBytes) - #logging.debug(f"fromRadioBytes: {fromRadioBytes}") + logging.debug(f"in mesh_interface.py _handleFromRadio() fromRadioBytes: {fromRadioBytes}") asDict = google.protobuf.json_format.MessageToDict(fromRadio) logging.debug(f"Received from radio: {fromRadio}") if fromRadio.HasField("my_info"): @@ -496,7 +496,8 @@ class MeshInterface: self.nodesByNum[node["num"]] = node if "user" in node: # Some nodes might not have user/ids assigned yet - self.nodes[node["user"]["id"]] = node + if "id" in node["user"]: + self.nodes[node["user"]["id"]] = node publishingThread.queueWork(lambda: pub.sendMessage("meshtastic.node.updated", node=node, interface=self)) elif fromRadio.config_complete_id == self.configId: diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 27c2f4e..78225be 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -182,3 +182,36 @@ def test_handleFromRadio_with_node_info(reset_globals, caplog, capsys): assert re.search(r'│ !28af67cc │ N/A │ N/A │ N/A', out, re.MULTILINE) assert err == '' iface.close() + + +@pytest.mark.unit +def test_handleFromRadio_with_node_info_tbeam1(reset_globals, caplog, capsys): + """Test _handleFromRadio with node_info""" + # Note: Captured the '--debug --info' for the bytes below. + from_radio_bytes = b'"=\x08\x80\xf8\xc8\xf6\x07\x12"\n\t!7ed23c00\x12\x07TBeam 1\x1a\x02T1"\x06\x94\xb9~\xd2<\x000\x04\x1a\x07 ]MN\x01\xbea%\xad\x01\xbea=\x00\x00,A' + iface = MeshInterface(noProto=True) + with caplog.at_level(logging.DEBUG): + iface._startConfig() + iface._handleFromRadio(from_radio_bytes) + assert re.search(r'Received nodeinfo', caplog.text, re.MULTILINE) + assert re.search(r'TBeam 1', caplog.text, re.MULTILINE) + assert re.search(r'2127707136', caplog.text, re.MULTILINE) + # validate some of showNodes() output + iface.showNodes() + out, err = capsys.readouterr() + assert re.search(r' 1 ', out, re.MULTILINE) + assert re.search(r'│ TBeam 1 │ ', out, re.MULTILINE) + assert re.search(r'│ !7ed23c00 │', out, re.MULTILINE) + assert err == '' + iface.close() + + +@pytest.mark.unit +def test_handleFromRadio_with_node_info_tbeam_with_bad_data(reset_globals, caplog, capsys): + """Test _handleFromRadio with node_info with some bad data (issue#172) - ensure we do not throw exception""" + # Note: Captured the '--debug --info' for the bytes below. + from_radio_bytes = b'"\x17\x08\xdc\x8a\x8a\xae\x02\x12\x08"\x06\x00\x00\x00\x00\x00\x00\x1a\x00=\x00\x00\xb8@' + iface = MeshInterface(noProto=True) + with caplog.at_level(logging.DEBUG): + iface._startConfig() + iface._handleFromRadio(from_radio_bytes)