FlotillasGPS - Sistema completo de monitoreo de flotillas GPS

Sistema completo para monitoreo y gestion de flotas de vehiculos con:
- Backend FastAPI con PostgreSQL/TimescaleDB
- Frontend React con TypeScript y TailwindCSS
- App movil React Native con Expo
- Soporte para dispositivos GPS, Meshtastic y celulares
- Video streaming en vivo con MediaMTX
- Geocercas, alertas, viajes y reportes
- Autenticacion JWT y WebSockets en tiempo real

Documentacion completa y guias de usuario incluidas.
This commit is contained in:
FlotillasGPS Developer
2026-01-21 08:18:00 +00:00
commit 51d78bacf4
248 changed files with 50171 additions and 0 deletions

View File

@@ -0,0 +1,139 @@
"""
Schemas Pydantic para Ubicación GPS.
"""
from datetime import datetime
from typing import List, Optional
from pydantic import Field
from app.schemas.base import BaseSchema, GeoJSONFeature
class UbicacionBase(BaseSchema):
"""Schema base de ubicación."""
lat: float = Field(..., ge=-90, le=90)
lng: float = Field(..., ge=-180, le=180)
velocidad: Optional[float] = Field(None, ge=0)
rumbo: Optional[float] = Field(None, ge=0, le=360)
altitud: Optional[float] = None
precision: Optional[float] = Field(None, ge=0)
satelites: Optional[int] = Field(None, ge=0)
class UbicacionCreate(UbicacionBase):
"""Schema para crear/recibir ubicación."""
vehiculo_id: Optional[int] = None # Puede venir por identificador de dispositivo
dispositivo_id: Optional[str] = None # Identificador del dispositivo
tiempo: Optional[datetime] = None # Si no se envía, usa timestamp del servidor
fuente: str = Field(default="gps", max_length=20)
bateria_dispositivo: Optional[float] = Field(None, ge=0, le=100)
bateria_vehiculo: Optional[float] = None
motor_encendido: Optional[bool] = None
odometro: Optional[float] = Field(None, ge=0)
hdop: Optional[float] = None
# Datos OBD opcionales
rpm: Optional[int] = Field(None, ge=0)
temperatura_motor: Optional[float] = None
nivel_combustible: Optional[float] = Field(None, ge=0, le=100)
class UbicacionBulkCreate(BaseSchema):
"""Schema para recibir múltiples ubicaciones."""
ubicaciones: List[UbicacionCreate]
class UbicacionResponse(UbicacionBase):
"""Schema de respuesta de ubicación."""
tiempo: datetime
vehiculo_id: int
fuente: str
bateria_dispositivo: Optional[float] = None
motor_encendido: Optional[bool] = None
odometro: Optional[float] = None
class UbicacionConVehiculo(UbicacionResponse):
"""Schema de ubicación con información del vehículo."""
vehiculo_nombre: str
vehiculo_placa: str
vehiculo_color: str
class HistorialUbicacionesRequest(BaseSchema):
"""Schema para solicitar historial de ubicaciones."""
vehiculo_id: int
desde: datetime
hasta: datetime
simplificar: bool = True # Simplificar ruta con Douglas-Peucker
intervalo_segundos: Optional[int] = None # Muestreo por intervalo
class HistorialUbicacionesResponse(BaseSchema):
"""Schema de respuesta de historial de ubicaciones."""
vehiculo_id: int
desde: datetime
hasta: datetime
total_puntos: int
distancia_km: float
tiempo_movimiento_segundos: int
velocidad_promedio: Optional[float] = None
velocidad_maxima: Optional[float] = None
ubicaciones: List[UbicacionResponse]
class UbicacionGeoJSON(GeoJSONFeature):
"""Schema de ubicación en formato GeoJSON."""
pass
class RutaGeoJSON(BaseSchema):
"""Schema de ruta completa en formato GeoJSON LineString."""
type: str = "Feature"
geometry: dict # LineString
properties: dict
# Schema para recibir ubicaciones de OsmAnd/Traccar
class OsmAndLocationCreate(BaseSchema):
"""Schema para ubicaciones recibidas de OsmAnd."""
id: str # Device identifier
lat: float
lon: float
timestamp: Optional[int] = None # Unix timestamp
speed: Optional[float] = None # km/h
bearing: Optional[float] = None # degrees
altitude: Optional[float] = None # meters
accuracy: Optional[float] = None # meters
batt: Optional[float] = None # battery percentage
class TraccarLocationCreate(BaseSchema):
"""Schema para ubicaciones recibidas de Traccar."""
id: int # Device ID in Traccar
deviceId: int
protocol: str
serverTime: datetime
deviceTime: datetime
fixTime: datetime
valid: bool
latitude: float
longitude: float
altitude: Optional[float] = None
speed: Optional[float] = None # knots
course: Optional[float] = None
address: Optional[str] = None
accuracy: Optional[float] = None
attributes: Optional[dict] = None