
All checks were successful
Meshtastic Map - See local Meshtastic Nodes / deploy (push) Successful in 1s
57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
from flask import Flask, render_template, jsonify, send_from_directory
|
|
import meshtastic.serial_interface
|
|
import meshtastic
|
|
import threading
|
|
import time
|
|
import os
|
|
|
|
|
|
app = Flask(__name__)
|
|
node_locations = {}
|
|
MY_NODE_ID = "!934f4430"
|
|
# MY_NODE_NUM = 2471445552
|
|
iface = meshtastic.serial_interface.SerialInterface()
|
|
# iface.nodes.clear()
|
|
|
|
def safe_dict(obj):
|
|
if isinstance(obj, dict):
|
|
return {k: safe_dict(v) for k, v in obj.items()}
|
|
elif isinstance(obj, list):
|
|
return [safe_dict(i) for i in obj]
|
|
elif isinstance(obj, bytes):
|
|
return obj.decode(errors="replace")
|
|
elif hasattr(obj, "__dict__"):
|
|
return safe_dict(vars(obj)) # Recursively process custom objects
|
|
elif hasattr(obj, "to_dict"):
|
|
return safe_dict(obj.to_dict()) # If object has a to_dict() method
|
|
else:
|
|
try:
|
|
return str(obj) # Fallback
|
|
except Exception:
|
|
return None
|
|
|
|
@app.route("/")
|
|
def index():
|
|
return render_template("map.html")
|
|
|
|
|
|
@app.route("/nodes")
|
|
def nodes():
|
|
data = {}
|
|
for node_id, node in iface.nodes.items():
|
|
data[node_id] = safe_dict(node)
|
|
|
|
return jsonify({
|
|
"myNodeId": MY_NODE_ID,
|
|
"nodes": data
|
|
})
|
|
|
|
# Serve favicon
|
|
@app.route('/favicon.ico')
|
|
def favicon():
|
|
return send_from_directory(os.path.join(app.root_path, 'static'),
|
|
'favicon.ico', mimetype='image/vnd.microsoft.icon')
|
|
|
|
if __name__ == "__main__":
|
|
app.run(host='0.0.0.0', port=8083)
|