from typing import Optional from pydantic import BaseModel, Field class GPSQueryRequest(BaseModel): device_id: str = Field(..., description="设备ID,如 TalkingQ_001") class VolumeRequest(BaseModel): device_id: str = Field(..., description="设备ID") level: int = Field(..., ge=0, le=100, description="音量等级 0-100") class OTARequest(BaseModel): device_id: str = Field(..., description="设备ID") url: str = Field(..., description="固件下载地址") version: str = Field(..., description="目标版本号") class NFCNoticeRequest(BaseModel): device_id: str = Field(..., description="设备ID") url: str = Field(..., description="提示音地址") class NFCListenRequest(BaseModel): device_id: str = Field(..., description="设备ID") uuid: str = Field(..., description="NFC卡片UUID") class NFCUnreadRequest(BaseModel): device_id: str = Field(..., description="设备ID") url: str = Field(..., description="未读留言音频地址") class NFCBindRequest(BaseModel): device_id: str = Field(..., description="设备ID") uuid: str = Field(..., description="NFC卡片UUID") class CommandResponse(BaseModel): code: int = 0 message: str = "success" msg_id: str = Field(..., description="消息ID") device_id: str = Field(..., description="设备ID") class DeviceResponseData(BaseModel): msg_id: str status: Optional[str] = None data: Optional[dict] = None timestamp: Optional[float] = None class DeviceStatusResponse(BaseModel): device_id: str online: bool last_seen: Optional[float] = None