# Setup Guide — IoT SmartBin

## Prerequisites

- **PlatformIO** (VS Code extension or CLI)
- **Node.js** >= 18.x
- **npm** >= 9.x
- **Docker** & **Docker Compose** (for Mosquitto, optional Redis)
- **Laragon** (optional, for MySQL in production)

---

## 1. Infrastructure Setup

### Start Mosquitto (Docker)
```bash
cd infra
docker-compose up -d mosquitto
```

Verify:
```bash
# Subscribe to all smartbin topics
mosquitto_sub -h localhost -p 1883 -t "smartbin/#" -v

# In another terminal, publish test message
mosquitto_pub -h localhost -p 1883 -t "smartbin/dev/tenantA/jakarta-utara/bin-001/telemetry" \
  -m '{"ts":1700000000,"deviceId":"bin-001","fill_percent":50,"status":"MEDIUM"}'
```

### Optional: Start Redis
```bash
cd infra
docker-compose up -d redis
```

---

## 2. Firmware — ESP32 DevKit

### Hardware Setup
See [docs/wiring.md](wiring.md) for complete wiring diagram.

### Configuration
Edit `firmware/esp32_devkit/include/config.h`:
- WiFi SSID & password
- MQTT broker IP/port
- tenantId, siteId, deviceId
- Sensor calibration (BIN_DEPTH_CM, SENSOR_OFFSET_CM)

### Build & Flash
```bash
cd firmware/esp32_devkit
pio run -t upload
pio device monitor -b 115200
```

### Verify
Check serial output for WiFi and MQTT connection, then:
```bash
mosquitto_sub -h localhost -t "smartbin/dev/tenantA/jakarta-utara/bin-001/#" -v
```

---

## 3. Firmware — ESP32-CAM

### Flash Mode
1. Connect GPIO0 to GND
2. Connect USB-TTL as per [docs/wiring.md](wiring.md)
3. Power cycle

### Build & Flash
```bash
cd firmware/esp32_cam
pio run -t upload
```

4. Disconnect GPIO0 from GND
5. Power cycle

### Verify
Open browser:
- Capture: `http://<ESP32-CAM-IP>/capture`
- Stream: `http://<ESP32-CAM-IP>/stream`

---

## 4. Backend Services

### Install dependencies
```bash
cd backend/ingestion-service && npm install
cd ../api-service && npm install
cd ../route-service && npm install
```

### Configure
Copy `.env.example` to `.env` in each service and adjust values.

### Run
```bash
# Terminal 1 — Ingestion
cd backend/ingestion-service && npm start

# Terminal 2 — API
cd backend/api-service && npm start

# Terminal 3 — Route
cd backend/route-service && npm start
```

Or use Docker Compose:
```bash
cd infra
docker-compose up -d
```

---

## 5. Frontend Dashboard

### Install & Run
```bash
cd frontend
npm install
npm run dev
```

Open browser: `http://localhost:5173`

### Build for Production
```bash
npm run build
```

---

## 6. End-to-End Test

1. Start Mosquitto (`docker-compose up mosquitto`)
2. Start ingestion-service (`npm start`)
3. Start api-service (`npm start`)
4. Start frontend (`npm run dev`)
5. Power on ESP32 DevKit → check MQTT messages
6. Open dashboard → select site → see telemetry in real-time
7. Test route optimization:
```bash
curl -X POST http://localhost:3002/api/v1/tenants/tenantA/routes/optimal \
  -H "Content-Type: application/json" \
  -d '{"siteId":"jakarta-utara","depot":{"lat":-6.1,"lon":106.9},"vehicleCount":2,"maxStopsPerVehicle":30,"bins":[{"deviceId":"bin-001","lat":-6.123,"lon":106.987,"fill_percent":85}]}'
```

---

## 7. MQTT Testing (Without Hardware)

Simulate a device:
```bash
# Publish telemetry
mosquitto_pub -h localhost -p 1883 \
  -t "smartbin/dev/tenantA/jakarta-utara/bin-001/telemetry" \
  -m '{"ts":1700000000,"tenantId":"tenantA","siteId":"jakarta-utara","deviceId":"bin-001","firmware":"1.0.0","us_cm":12.3,"ir_cm":14.8,"ir_mv":1860,"fill_percent":82,"status":"FULL","rssi":-55,"lat":-6.12345,"lon":106.98765,"battery":3.90}'

# Publish status (retained)
mosquitto_pub -h localhost -p 1883 -r \
  -t "smartbin/dev/tenantA/jakarta-utara/bin-001/status" \
  -m '{"ts":1700000000,"deviceId":"bin-001","status":"FULL","fill_percent":82}'

# Publish availability (retained)
mosquitto_pub -h localhost -p 1883 -r \
  -t "smartbin/dev/tenantA/jakarta-utara/bin-001/availability" \
  -m "online"
```
