diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 617fe1c..e6f0bf0 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -15,6 +15,7 @@ import pyqrcode import traceback import pkg_resources from datetime import datetime +import timeago from easy_table import EasyTable from google.protobuf.json_format import MessageToJson @@ -107,11 +108,13 @@ def formatFloat(value, formatStr="{:.2f}", unit="", default="N/A"): def getLH(ts, default="N/A"): return datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') if ts else default -# Print Nodes +#Returns time ago for the last heard +def getTimeAgo(ts, default="N/A"): + return timeago.format(datetime.fromtimestamp(ts), datetime.now()) if ts else default - -def printNodes(nodes): - # Create the table and define the structure +#Print Nodes +def printNodes(nodes, myId): + #Create the table and define the structure table = EasyTable("Nodes") table.setCorners("/", "\\", "\\", "/") table.setOuterStructure("|", "-") @@ -119,17 +122,28 @@ def printNodes(nodes): tableData = [] for node in nodes: - # aux var to get not defined keys - LH = getLH(node['position'].get("time")) - lat = formatFloat(node['position'].get("latitude"), "{:.4f}", "°") - lon = formatFloat(node['position'].get("longitude"), "{:.4f}", "°") - alt = formatFloat(node['position'].get("altitude"), "{:.0f}", " m") - batt = formatFloat(node['position'].get("batteryLevel"), "{:.2f}", "%") - snr = formatFloat(node.get("snr"), "{:.2f}", " dB") - tableData.append({"User": node['user']['longName'], - "Position": "Lat:"+lat+", Lon:"+lon+", Alt:"+alt, - "Battery": batt, "SNR": snr, "LastHeard": LH}) - table.setData(tableData) + if node['user']['id'] == myId: + continue + #aux var to get not defined keys + lat=formatFloat(node['position'].get("latitude"), "{:.4f}", "°") + lon=formatFloat(node['position'].get("longitude"), "{:.4f}", "°") + alt=formatFloat(node['position'].get("altitude"), "{:.0f}", " m") + batt=formatFloat(node['position'].get("batteryLevel"), "{:.2f}", "%") + snr=formatFloat(node.get("snr"), "{:.2f}", " dB") + LH= getLH(node['position'].get("time")) + timeAgo = getTimeAgo(node['position'].get("time")) + tableData.append({"N":0, "User":node['user']['longName'], + "AKA":node['user']['shortName'], "ID":node['user']['id'], + "Position":lat+", "+lon+", "+alt, + "Battery":batt, "SNR":snr, + "LastHeard":LH, "Since":timeAgo}) + + Rows = sorted(tableData, key=lambda k: k['LastHeard'], reverse=True) + RowsOk = sorted(Rows, key=lambda k:k ['LastHeard'].startswith("N/A")) + for i in range(len(RowsOk)): + RowsOk[i]['N'] = i+1 + table.setData(RowsOk) + table.displayTable() @@ -289,7 +303,7 @@ def onConnected(interface): if args.nodes: closeNow = True - printNodes(interface.nodes.values()) + printNodes(interface.nodes.values(), interface.getMyNodeInfo()['user']['id']) if args.qr: closeNow = True diff --git a/setup.py b/setup.py index 03363ee..23da458 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ setup( include_package_data=True, install_requires=["pyserial>=3.4", "protobuf>=3.13.0", "pypubsub>=4.0.3", "dotmap>=1.3.14", "pexpect>=4.6.0", "pyqrcode>=1.2.1", - "pygatt>=4.0.5", "easy-table==0.0.4"], + "pygatt>=4.0.5", "easy-table==0.0.4", "timeago==1.0.15"], extras_require={ 'tunnel': ["pytap2>=2.0.0"] },