Cache TB data: backend/api/routes/control.py
Browse files
backend/api/routes/control.py
CHANGED
|
@@ -61,14 +61,23 @@ async def control_budget():
|
|
| 61 |
)
|
| 62 |
|
| 63 |
|
|
|
|
|
|
|
|
|
|
| 64 |
@router.get("/trackers")
|
| 65 |
async def control_trackers():
|
| 66 |
-
"""Live tracker angles from ThingsBoard."""
|
|
|
|
|
|
|
|
|
|
| 67 |
try:
|
| 68 |
from src.tracker_dispatcher import TrackerDispatcher
|
| 69 |
dispatcher = TrackerDispatcher()
|
| 70 |
angles = dispatcher.read_current_angles()
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
| 72 |
except Exception as exc:
|
| 73 |
log.error("Tracker fetch failed: %s", exc)
|
| 74 |
raise HTTPException(status_code=502, detail=f"Tracker fetch failed: {exc}")
|
|
|
|
| 61 |
)
|
| 62 |
|
| 63 |
|
| 64 |
+
_tracker_cache: dict = {"data": None, "expires": 0.0}
|
| 65 |
+
|
| 66 |
+
|
| 67 |
@router.get("/trackers")
|
| 68 |
async def control_trackers():
|
| 69 |
+
"""Live tracker angles from ThingsBoard (5-min TTL cache)."""
|
| 70 |
+
import time as _time
|
| 71 |
+
if _tracker_cache["data"] and _time.monotonic() < _tracker_cache["expires"]:
|
| 72 |
+
return _tracker_cache["data"]
|
| 73 |
try:
|
| 74 |
from src.tracker_dispatcher import TrackerDispatcher
|
| 75 |
dispatcher = TrackerDispatcher()
|
| 76 |
angles = dispatcher.read_current_angles()
|
| 77 |
+
result = {"trackers": angles, "source": "ThingsBoard"}
|
| 78 |
+
_tracker_cache["data"] = result
|
| 79 |
+
_tracker_cache["expires"] = _time.monotonic() + 300 # 5 min
|
| 80 |
+
return result
|
| 81 |
except Exception as exc:
|
| 82 |
log.error("Tracker fetch failed: %s", exc)
|
| 83 |
raise HTTPException(status_code=502, detail=f"Tracker fetch failed: {exc}")
|