from flask import Flask, render_template, jsonify import meshtastic.serial_interface import meshtastic import threading import time 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 }) if __name__ == "__main__": app.run(host='0.0.0.0', port=8083)