56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
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
|