feat(ota): support JSON progress updates
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import asyncio
|
||||
import json
|
||||
import math
|
||||
import time
|
||||
from datetime import datetime
|
||||
from typing import Awaitable, Callable, Dict, Optional
|
||||
@@ -311,26 +312,39 @@ class TalkingQMQTTService:
|
||||
|
||||
async def _handle_ota_response(self, device_id: str, payload: dict):
|
||||
status = payload.get("status")
|
||||
data = payload.get("data", {})
|
||||
data = payload.get("data") or {}
|
||||
if not isinstance(data, dict):
|
||||
logger.warning(device_id, "", f"[OTA] invalid response data: {payload}")
|
||||
return
|
||||
|
||||
target_version = data.get("target_version") or data.get("version") or data.get("new_version")
|
||||
progress = data.get("progress")
|
||||
try:
|
||||
progress_value = float(progress) if progress is not None else None
|
||||
parsed_progress = float(progress) if progress is not None else None
|
||||
progress_value = (
|
||||
parsed_progress
|
||||
if parsed_progress is not None and math.isfinite(parsed_progress) and 0 <= parsed_progress <= 100
|
||||
else None
|
||||
)
|
||||
except (TypeError, ValueError):
|
||||
progress_value = None
|
||||
|
||||
if progress is not None and progress_value is None:
|
||||
logger.warning(device_id, "", f"[OTA] invalid progress value: {progress!r}")
|
||||
|
||||
if status == "accepted":
|
||||
current = data.get("current_version")
|
||||
target = data.get("target_version")
|
||||
logger.info(device_id, "", f"[OTA] 设备 {device_id} 已接受升级: {current} -> {target}")
|
||||
logger.info(device_id, "", f"[OTA] 设备 {device_id} 已接受升级: {current} -> {target_version}")
|
||||
|
||||
await self._schedule_persistence(
|
||||
device_id,
|
||||
"ota",
|
||||
device_firmware_update_manager.update_firmware_update(
|
||||
device_id=device_id,
|
||||
firmware_version=data.get("target_version") or data.get("version") or data.get("new_version") or "unknown",
|
||||
firmware_version=target_version or "unknown",
|
||||
update_status="accepted",
|
||||
progress=progress_value if progress_value is not None else 0.0,
|
||||
target_version=target_version,
|
||||
),
|
||||
)
|
||||
elif status == "updating":
|
||||
@@ -339,13 +353,14 @@ class TalkingQMQTTService:
|
||||
"ota",
|
||||
device_firmware_update_manager.update_firmware_update(
|
||||
device_id=device_id,
|
||||
firmware_version=data.get("version") or data.get("new_version") or "updating",
|
||||
firmware_version=target_version or "updating",
|
||||
update_status="updating",
|
||||
progress=progress_value,
|
||||
target_version=target_version,
|
||||
),
|
||||
)
|
||||
elif status == "success":
|
||||
new_version = data.get("new_version") or data.get("version")
|
||||
new_version = data.get("new_version") or data.get("version") or data.get("target_version")
|
||||
logger.info(device_id, "", f"[OTA] 设备 {device_id} 升级完成: {new_version}")
|
||||
|
||||
await self._schedule_persistence(
|
||||
@@ -367,6 +382,7 @@ class TalkingQMQTTService:
|
||||
firmware_version=new_version or "unknown",
|
||||
update_status="success",
|
||||
progress=100.0,
|
||||
target_version=target_version,
|
||||
),
|
||||
)
|
||||
elif status == "failed":
|
||||
@@ -375,9 +391,10 @@ class TalkingQMQTTService:
|
||||
"ota",
|
||||
device_firmware_update_manager.update_firmware_update(
|
||||
device_id=device_id,
|
||||
firmware_version=data.get("version") or data.get("new_version") or "unknown",
|
||||
firmware_version=target_version or "unknown",
|
||||
update_status="failed",
|
||||
progress=progress_value,
|
||||
target_version=target_version,
|
||||
),
|
||||
)
|
||||
logger.warning(device_id, "", f"[OTA] command failed: {payload}")
|
||||
|
||||
Reference in New Issue
Block a user