# counter_dashboard.py — API Documentation ## Page ### `GET /` Renders the main dashboard HTML page (`dashboard.html`). --- ## API Endpoints ### `GET /api/live-video` MJPEG streaming endpoint. Serves live frames from the path configured in `LIVE_STREAM_FRAME_PATH` (default `/dev/shm/jetson-counter/live_frame.jpg`) as `multipart/x-mixed-replace`. **Response:** JPEG stream with `--frame` boundary delimiters. --- ### `GET /api/current-batch` Returns the currently active batch's data read from `current_batch.json`. **Success response:** ```json { "success": true, "counting_date": "2024-01-01", "batch_number": 12, "count": 342, "start_time": "2024-01-01T14:30:00", "last_detection_time": "2024-01-01T14:35:00" } ``` **Error response (no active batch, 200):** ```json { "success": false, "error": "No active batch", "count": 0, "batch_number": null, "counting_date": null } ``` --- ### `GET /api/previous-batch` Returns the most recently completed batch from the `batches` database table, with computed `duration_minutes`. **Success response:** ```json { "success": true, "date": "2024-01-01", "batch_number": 11, "count": 287, "start_time": "2024-01-01T14:00:00", "end_time": "2024-01-01T14:27:00", "duration_minutes": 27.0 } ``` --- ### `GET /api/summary` Returns today, yesterday, and all-time aggregate statistics plus average per day and best day. **Success response:** ```json { "today": { "date": "2024-01-01", "total_count": 1500, "total_batches": 8 }, "yesterday": { "date": "2023-12-31", "total_count": 1342, "total_batches": 7 }, "all_time": { "grand_total": 50000, "grand_batches": 260, "total_days": 45 }, "average_per_day": 1111.1, "best_day": { "date": "2023-12-15", "count": 2100 } } ``` --- ### `GET /api/daily-data` Returns daily summary rows for charting. **Query params:** | Param | Type | Default | Description | |--------|------|---------|---------------------------------| | `days` | int | 30 | Number of days to look back | **Response:** ```json [ { "date": "2024-01-01", "total_count": 1500, "total_batches": 8, "avg_per_batch": 187.5 } ] ``` --- ### `GET /api/day-detail/` Returns all batch records for a specific `counting_date` along with summary totals. **Path params:** | Param | Type | Description | |--------|--------|------------------------| | `date` | string | Date in `YYYY-MM-DD` | **Success response:** ```json { "date": "2024-01-01", "total_count": 1500, "total_batches": 8, "total_duration_minutes": 216.0, "avg_duration_minutes": 27.0, "batches": [ { "batch_number": 1, "count": 187, "start_time": "2024-01-01T08:00:00", "end_time": "2024-01-01T08:27:00", "duration_minutes": 27.0 } ] } ``` --- ### `GET /api/recent-batches` Returns the most recent batches with computed durations. **Query params:** | Param | Type | Default | Description | |---------|------|---------|---------------------------------| | `limit` | int | 10 | Max number of batches to return | **Response:** ```json [ { "date": "2024-01-01", "batch_number": 8, "count": 213, "start_time": "2024-01-01T16:30:00", "end_time": "2024-01-01T16:58:00", "duration_minutes": 28.0 } ] ``` --- ### `GET /api/available-dates` Returns all dates with data from the `daily_summaries` table, ordered by date descending. **Response:** ```json [ { "date": "2024-01-01", "total_count": 1500, "total_batches": 8 } ] ``` --- ## Export Endpoints (XLSX) ### `GET /api/export-daily-csv` Exports batch detail records for the last N days as an `.xlsx` file. **Query params:** | Param | Type | Default | Description | |--------|------|---------|-----------------------------| | `days` | int | 30 | Number of days to look back | **Response:** XLSX file download with columns: Date, Batch #, Count, Start Time, End Time, Duration (min). Filename format: `{SITE_NAME}_daily_records_{timestamp}.xlsx` --- ### `GET /api/export-day-csv/` Exports all batch records for a single date as an `.xlsx` file. **Path params:** | Param | Type | Description | |--------|--------|----------------------| | `date` | string | Date in `YYYY-MM-DD` | **Response:** XLSX file download with columns: Batch Number, Count, Start Time, End Time, Duration (min). Filename format: `{SITE_NAME}_day_detail_{date}.xlsx` --- ## Error Handling All endpoints return `{"success": false, "error": ""}` with HTTP 500 on unexpected errors. Database-unavailable errors (`sqlite3.OperationalError`) return HTTP 200 with an empty/default data structure. The `/api/live-video` endpoint returns HTTP 503 if the frame file is not found.