Files
sibuti/transport/backend/app/services/event_detector.py

56 lines
1.7 KiB
Python
Raw Normal View History

2025-12-18 21:13:49 +03:00
from datetime import datetime, timedelta
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession
from app.models import Vehicle, Position, Event
from app.config import settings
async def detect_events(
db: AsyncSession,
vehicle: Vehicle,
current: Position,
previous: Optional[Position]
) -> list[Event]:
"""Обнаружение событий на основе новой позиции"""
events = []
# Check for overspeed
if current.speed > settings.overspeed_limit:
event = Event(
vehicle_id=vehicle.id,
timestamp=current.timestamp,
type="OVERSPEED",
payload={
"speed": current.speed,
"limit": settings.overspeed_limit,
"lat": current.lat,
"lon": current.lon
}
)
db.add(event)
await db.commit()
await db.refresh(event)
events.append(event)
# Check for long stop (if speed is 0 and was 0 for a while)
if previous and current.speed < 2 and previous.speed < 2:
time_diff = current.timestamp - previous.timestamp
if time_diff >= timedelta(minutes=settings.long_stop_minutes):
event = Event(
vehicle_id=vehicle.id,
timestamp=current.timestamp,
type="LONG_STOP",
payload={
"duration_minutes": time_diff.total_seconds() / 60,
"lat": current.lat,
"lon": current.lon
}
)
db.add(event)
await db.commit()
await db.refresh(event)
events.append(event)
return events