Requirements
A requirement is marked VERIFIED only when a physical measurement supports it, with the exact command and observed output recorded. See ADR-002: where the PRD and a measurement disagree, the measurement wins.
| ID | Requirement | Spec | Pri | Status | Tasks |
|---|---|---|---|---|---|
| REQ-001 | Wi-Fi SoftAP with internal DHCP Broadcast customizable SoftAP (e.g. NomadLink-XXXX), run internal DHCP server issuing 192.168.4.x addresses, and provide an admin page reachable on the local network. DEVIATION FROM SPEC (recorded per ADR-002, not silently absorbed): the spec asks for a captive-portal redirect, which this firmware cannot produce. lwIP's DNS server is compiled out of the Arduino core, so DHCP clients are handed public resolvers and an OS connectivity probe reaches the real internet with no interception point. Replaced with direct-IP access at http://192.168.4.1 plus mDNS at nomadlink.local. The DHCP pool is also 192.168.4.2-12, not .2-254, because the core ships CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8. See ADR-007. | FR-1.1 | P0 | PARTIALLY_VERIFIED | TASK-101, TASK-102, TASK-103 |
| REQ-002 | Wi-Fi STA scan, credential entry and auto-connect Web UI scans available networks, accepts SSID/password, auto-connects on boot with fallback to cellular. | FR-1.2 | P0 | NOT_STARTED | TASK-102, TASK-105 |
| REQ-003 | Cellular connection management over A7670E A7670E managed via UART AT commands / PPP. Automatic APN detection. Real-time monitoring of RSSI, registration state, operator name. | FR-1.3 | P0 | PARTIALLY_VERIFIED | TASK-106, TASK-107 |
| REQ-004 | Dual-WAN automatic failover with NAT routing Primary WAN is Wi-Fi STA, secondary is 4G LTE. On Wi-Fi loss or internet loss, seamlessly route all SoftAP client traffic over LTE via LwIP IP forwarding / NAT. Recovery within 3 seconds of packet loss detection. | FR-1.4 | P0 | PARTIALLY_VERIFIED | TASK-020, TASK-108, TASK-109, TASK-110 |
| REQ-005 | Camera capture and MJPEG stream over HTTP Capture frames from OV2640/OV5640 via ESP32-S3 camera interface using PSRAM for frame allocation. Stream MJPEG over HTTP /stream. | FR-2.1 | P1 | PARTIALLY_VERIFIED | TASK-201, TASK-202 |
| REQ-006 | Camera control web page Endpoint /camera with resolution (QVGA/VGA/SVGA), JPEG quality slider, frame rate adjustment, snapshot capture. | FR-2.2 | P2 | NOT_STARTED | TASK-203 |
| REQ-007 | GNSS acquisition, NMEA parsing and position fix Communicate with A7670E GNSS via AT commands. Parse raw NMEA to extract latitude, longitude, altitude, speed, fix status, satellite count. | FR-3.1 | P0 | VERIFIED | TASK-301, TASK-302 |
| REQ-008 | Cellular LBS position fallback When no GNSS fix is available, obtain an approximate position from the cellular network using AT+CLBS=1,1, reporting longitude/latitude and an accuracy radius in metres. | FR-3.1 (implicit; not in PRD) | P0 | VERIFIED | TASK-303 |
| REQ-009 | Location web page with live map Display live latitude, longitude, altitude, speed, satellite count. Embedded interactive Leaflet.js / OpenStreetMap map showing real-time location marker. | FR-3.2 | P2 | NOT_STARTED | TASK-304 |
| REQ-010 | Cloud broker credential configuration UI HiveMQ: broker URL, port (8883 MQTTS / 1883 MQTT), client ID, username, password, telemetry topic, command topic. Adafruit IO: username, AIO key, location feed key, command feed key. | FR-4.1 | P1 | NOT_STARTED | TASK-401, TASK-402 |
| REQ-011 | Telemetry publish controls and interval Select destination (Disabled / HiveMQ / Adafruit IO). Start/stop publication from web UI. Configurable interval 5 to 3600 seconds. | FR-4.2 | P1 | NOT_STARTED | TASK-403, TASK-404 |
| REQ-012 | Direct MQTT telemetry publish from device over LTE Publish device telemetry to a cloud broker directly from the device over the cellular data path, with no external bridge, tunnel or relay. No cloudflared, no reverse proxy, no machine-dependent relay. | FR-4.2 | P0 | PARTIALLY_VERIFIED | TASK-405, TASK-406 |
| REQ-013 | MQTT subscriber command engine Subscribe to command topic, parse JSON command payloads (command_id, action, params), execute GET_STATUS / TOGGLE_ROUTER / REBOOT / SEND_SMS / DIAL_NUMBER, and publish a result to a response topic with matching command_id. | FR-4.3 | P1 | NOT_STARTED | TASK-407, TASK-408 |
| REQ-014 | SMS receiver engine with whitelist Intercept incoming SMS via +CMTI URC, read with AT+CMGR, check sender against authorized whitelist before acting. | FR-5.1 | P1 | PARTIALLY_VERIFIED | TASK-501, TASK-502 |
| REQ-015 | SMS command parser and auto-reply Case-insensitive commands: STATUS (IP, WAN mode, signal, GPS), LOCATION (Google Maps link), STREAM ON/OFF, REBOOT, CALL <number>. Reply to sender via AT+CMGS. | FR-5.2 | P2 | NOT_STARTED | TASK-503 |
| REQ-016 | Incoming call management with auto-answer and whitelist Detect RING/+CLIP. Configurable auto-answer after N rings (ATA), auto-reject unauthorized (ATH), whitelist mode, web UI popup with Accept/Hang Up. | FR-6.1 | P1 | PARTIALLY_VERIFIED | TASK-601, TASK-602 |
| REQ-017 | Outgoing call execution and dialpad UI Dial arbitrary numbers or saved contacts from web dialpad or API (ATD<number>;). Show call duration, connection state, active status. Full-duplex I2S audio via MEMS mic and speaker DAC. | FR-6.2 | P2 | NOT_STARTED | TASK-603, TASK-604 |
| REQ-018 | Offline speech recognition engine (ESP-SR) ESP-SR with WakeNet + MultiNet running on ESP32-S3 vector instructions, fully offline, no cloud voice API and no per-use fees. | FR-7.1 | P2 | NOT_STARTED | TASK-701, TASK-702 |
| REQ-019 | Voice contacts directory with wake-word dialing Web UI to manage contacts and assign phonetic triggers (e.g. 'Call Amma' -> +91 <10-digit-number>). Sequence: wake word 'Hi ESP' with audio feedback beep, 5 second recognition window, command match, verbal confirmation, then ATD dial. | FR-7.2, FR-7.3 | P3 | NOT_STARTED | TASK-703 |
| REQ-020 | Asynchronous responsive web portal ESPAsyncWebServer-hosted SPA with navigation: Dashboard, Network & Router Setup, Live Camera, Location & Mapping, Telemetry & Commands, SMS Manager, Telephony & Voice Dialing. | Section 4 | P0 | PARTIALLY_VERIFIED | TASK-801, TASK-802, TASK-803 |
| REQ-021 | NVS persistence of configuration and secrets Persist Wi-Fi credentials, cloud API keys, contacts, voice trigger mappings, SMS whitelist and APN config across reboot in NVS / LittleFS. | NFR 5 | P0 | NOT_STARTED | TASK-404, TASK-402 |
| REQ-022 | Security hardening WPA2-PSK / WPA3-SAE SoftAP, HTTP Basic Auth on the admin portal, telephony and SMS whitelisting, TLS 1.2/1.3 for all cloud connectivity. No secrets in source control. | NFR 4 | P0 | NOT_STARTED | TASK-804, TASK-405 |
| REQ-023 | SD card storage for captures and logs FAT32 SD card mounted for storing camera snapshots, GNSS track logs and device logs. | Hardware table (Storage) | P2 | PARTIALLY_VERIFIED | TASK-805 |