Files
chongming-plugins/aibox_sophon_adapter/router/get_device.py
T

66 lines
2.3 KiB
Python

"""
查询单个设备详情 — 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)}