""" 查询单个设备详情 — GET /aibox/get_device?board_id=xxx """ import json import logging from datetime import datetime from chongming_worker import rpc_method logger = logging.getLogger(__name__) @rpc_method( subject="aibox_sophon_adapter.get_device", method="GET", summary="查询单个设备详情", ) async def get_device(board_id: str, worker_id: str = "") -> dict: """根据 BoardId 查询设备的完整心跳数据和在线状态""" from ..global_var import db, heartbeat_timeout try: if db is None: raise RuntimeError("Database not initialized") async with db.get_session() as session: from ..models.orm import BoardHeartbeat from sqlalchemy import select stmt = select(BoardHeartbeat).where(BoardHeartbeat.board_id == board_id) # type: ignore result = await session.execute(stmt) record: BoardHeartbeat | None = result.scalar_one_or_none() if record is None: return {"error": f"设备不存在: {board_id}"} now = datetime.now() elapsed = (now - record.last_ping_time).total_seconds() is_online = elapsed <= heartbeat_timeout ping_data = {} try: ping_data = json.loads(record.ping_data) if record.ping_data else {} except json.JSONDecodeError: pass return { "board_id": record.board_id, "board_ip": record.board_ip, "board_platform": record.board_platform, "board_type": record.board_type, "board_temp": record.board_temp, "status": record.status, "version": record.version, "system_info": record.system_info, "grant_code": record.grant_code, "grant_desc": record.grant_desc, "is_online": is_online, "last_ping_time": record.last_ping_time.isoformat() if record.last_ping_time else None, "elapsed_seconds": round(elapsed, 1), "ping_data": ping_data, } except Exception as e: logger.error(f"[get_device] 查询失败 (board_id={board_id}): {e}") return {"error": str(e)}