Update backend/api/routes/control.py
Browse files
backend/api/routes/control.py
CHANGED
|
@@ -55,6 +55,32 @@ async def control_budget():
|
|
| 55 |
return {"status": "waiting", "message": "No budget computed yet"}
|
| 56 |
|
| 57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
_tracker_cache: dict = {"data": None, "expires": 0.0}
|
| 59 |
|
| 60 |
|
|
|
|
| 55 |
return {"status": "waiting", "message": "No budget computed yet"}
|
| 56 |
|
| 57 |
|
| 58 |
+
@router.get("/trackers/details")
|
| 59 |
+
async def tracker_details():
|
| 60 |
+
"""Tracker entity table — name, mode, angle, last activity for all trackers."""
|
| 61 |
+
try:
|
| 62 |
+
from src.data.thingsboard_client import ThingsBoardClient, TRACKER_KEYS
|
| 63 |
+
client = ThingsBoardClient()
|
| 64 |
+
trackers = []
|
| 65 |
+
for name in ["Tracker501", "Tracker502", "Tracker503", "Tracker509"]:
|
| 66 |
+
try:
|
| 67 |
+
vals = client.get_latest_telemetry(name, list(TRACKER_KEYS))
|
| 68 |
+
trackers.append({
|
| 69 |
+
"name": name,
|
| 70 |
+
"label": name.replace("Tracker", "Row "),
|
| 71 |
+
"angle": round(float(vals.get("angle", 0)), 1) if vals.get("angle") is not None else None,
|
| 72 |
+
"manual_mode": vals.get("manualMode"),
|
| 73 |
+
"set_angle": round(float(vals.get("setAngle", 0)), 1) if vals.get("setAngle") is not None else None,
|
| 74 |
+
"set_mode": vals.get("setMode"),
|
| 75 |
+
})
|
| 76 |
+
except Exception as exc:
|
| 77 |
+
trackers.append({"name": name, "label": name, "error": str(exc)})
|
| 78 |
+
return {"trackers": trackers}
|
| 79 |
+
except Exception as exc:
|
| 80 |
+
log.error("Tracker details failed: %s", exc)
|
| 81 |
+
return {"trackers": [], "error": str(exc)}
|
| 82 |
+
|
| 83 |
+
|
| 84 |
_tracker_cache: dict = {"data": None, "expires": 0.0}
|
| 85 |
|
| 86 |
|