Skip to content

cp200513/Motorq_Assignment_Phase_2

Repository files navigation

Connected Car Fleet — Phase 2 🚗📡

A container‑ready Flask + Gunicorn backend that ingests real‑time vehicle telemetry, generates alerts, and exposes fleet‑level analytics APIs. This repository is the Phase 2 deliverable for the MOTORQ assignment.


🗺 Project structure

├── app.py                 # Flask bootstrap – registers blueprints
├── blueprints/            # Modular route groups
│   ├── vehicles.py
│   ├── telemetry.py
│   └── analytics.py
├── db.py                  # SQLite connection + schema
├── state_tracker.py       # Out‑of‑order / sanity checks
├── telemetry_generator.py # Sends random telemetry every 30 s (optional)
├── generate_vals.py       # One‑shot seeder (10 vehicles + telemetry)
├── Dockerfile             # Builds the API image
├── docker-compose.yml     # Orchestrates api + generator
└── requirements.txt       # Python deps

🚀 Quick start

With Docker (recommended)

# build & start (API on http://localhost:8088)
docker compose up --build -d

# tail the logs
docker compose logs -f api

Without Docker

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export FLASK_APP=app.py
flask --app app.py --debug run  # http://localhost:5000

SQLite file: created automatically as motorq_test.db in the project root.


🛰 Seed demo data (10 vehicles + telemetry)

python generate_vals.py --host http://localhost:8088   # or 5000 if non‑docker

Need a constant stream? telemetry_generator.py (already running inside Docker as motorq-gen) posts random data every 30 s.


🔌 REST API

Method Endpoint Description Body / Query params
POST /vehicle/register Create / update a vehicle {VIN, manufacturer, model, fleetId, owner, registration_status}
GET  /vehicle/all List every vehicle
GET  /vehicle/<vin> Get one vehicle by VIN
GET  /vehicle/query Filter by fleetId / status ?fleetId=Corporate&registration_status=Active
POST /vehicle/inactive Mark a VIN decommissioned { "VIN": 123 }
POST /telemetry Ingest one telemetry record { VIN, latitude, longitude, speed, engine_status, fuel_percentage, odometer, diagnostic_codes }
GET  /alerts All alerts (speed > 100 km/h or fuel < 15 %)
GET  /analytics/ Global or owner‑filtered KPIs ?owner=Alice (opt.)
GET  /analytics/fleet/<owner> 24‑h fleet insights for that owner

All endpoints return JSON and meaningful HTTP status codes (400 on bad input, 404 on missing VIN, 409 on out‑of‑order telemetry, etc.).


📦 Docker images & services

Service Image tag Purpose Host port
api fleet-api Gunicorn + Flask REST backend 8088 → 5000
generator fleet-generator Posts random telemetry (demo load)

Change the host port by editing ports: in docker-compose.yml (e.g. "8000:5000").


⚙️ Environment variables

Variable Default Description
FLASK_ENV production Set to development to see tracebacks inside container
(none) SQLite path is hard‑coded to /app/motorq_test.db inside the image

🧪 Smoke test

# health
curl http://localhost:8088/vehicle/all

# register one more vehicle
curl -X POST http://localhost:8088/vehicle/register \
     -H "Content-Type: application/json" \
     -d '{"VIN":3001,"manufacturer":"Demo","model":"One","fleetId":"Corporate","owner":"QA","registration_status":"Active"}'

# post telemetry
curl -X POST http://localhost:8088/telemetry \
     -H "Content-Type: application/json" \
     -d '{"VIN":3001,"latitude":12.9,"longitude":77.6,"speed":112,"engine_status":"ON","fuel_percentage":12,"odometer":4567,"diagnostic_codes":"None"}'

# check alerts
curl http://localhost:8088/alerts | jq .

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published