초기 커밋
This commit is contained in:
37
app/processing/analyzers/device_analyzer.py
Normal file
37
app/processing/analyzers/device_analyzer.py
Normal file
@@ -0,0 +1,37 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from app.models.mongodb.device_log import DeviceLog
|
||||
|
||||
|
||||
async def analyze_device_status(
|
||||
device_id: str, start: datetime, end: datetime
|
||||
) -> dict:
|
||||
"""Analyze device status changes over a period."""
|
||||
logs = await (
|
||||
DeviceLog.find(
|
||||
DeviceLog.device_id == device_id,
|
||||
DeviceLog.event_type == "status_change",
|
||||
DeviceLog.timestamp >= start,
|
||||
DeviceLog.timestamp <= end,
|
||||
)
|
||||
.sort("+timestamp")
|
||||
.to_list()
|
||||
)
|
||||
|
||||
status_counts: dict[str, int] = {}
|
||||
for log in logs:
|
||||
status = log.payload.get("status", "unknown")
|
||||
status_counts[status] = status_counts.get(status, 0) + 1
|
||||
|
||||
total_events = len(logs)
|
||||
uptime_events = status_counts.get("online", 0)
|
||||
uptime_ratio = uptime_events / total_events if total_events > 0 else 0.0
|
||||
|
||||
return {
|
||||
"total_events": total_events,
|
||||
"status_counts": status_counts,
|
||||
"uptime_ratio": round(uptime_ratio, 4),
|
||||
"period": {"start": start.isoformat(), "end": end.isoformat()},
|
||||
}
|
||||
Reference in New Issue
Block a user