Sistem kompor pintar dengan kontrol akses RFID, relay remote, dan monitoring arus. ESP32 sebagai perangkat IoT, FastAPI sebagai backend, EMQX sebagai MQTT broker.
graph LR
subgraph ESP32["ESP32"]
RFID[RFID Reader]
Relay[Relay]
LCD[LCD 16x2]
end
subgraph Server["Laptop Server"]
EMQX[EMQX Broker<br>port 1883]
Backend[FastAPI Backend<br>port 8000]
DB[(SQLite)]
end
Admin[Admin Dashboard<br>SSE Realtime]
User[User Register<br>Web Form]
ESP32 -- MQTT --> EMQX
EMQX -- MQTT --> Backend
Backend -- Read/Write --> DB
Backend -- SSE Events --> Admin
Admin -- HTTP POST --> Backend
User -- HTTP POST --> Backend
- Tap Kartu — ESP32 baca UID RFID → kirim via MQTT ke
tapcook/{device_id}/card - Backend — cek database: jika dikenal → balas
okviatapcook/{device_id}/auth; jika baru → buat kode 6-digit (berlaku 10 menit) + kirim event SSE ke admin - ESP32 — terima
ok→ toggle relay ON/OFF; saat ON tampilkan nama user, daya (Watt), durasi; saat tap-out tampilkan energi (kWh) & biaya (Rp) - Admin — dashboard real-time via SSE, lihat kode pending, user terdaftar, kontrol relay, reset WiFi, atur tarif listrik
- Web Register — user masukin kode + nama → kode redeemed → kartu aktif
| Topik | Arah | Format | Keterangan |
|---|---|---|---|
tapcook/{id}/card |
ESP32 → Backend | {"uid":"..."} |
RFID terdeteksi |
tapcook/{id}/auth |
Backend → ESP32 | {"status":"ok","uid":"...","name":"..."} |
Auth berhasil |
{"status":"unknown","uid":"..."} |
Kartu baru | ||
tapcook/{id}/cmd |
Backend → ESP32 | {"cmd":"relay_on"} |
Nyalakan relay |
{"cmd":"relay_off"} |
Matikan relay | ||
{"cmd":"reset_wifi"} |
Reset WiFi ke mode config | ||
{"cmd":"set_tariff","value":1444.7} |
Update tarif listrik (Rp/kWh) | ||
tapcook/{id}/status |
ESP32 → Backend | {"relay":true} |
Status relay terkini |
- Python 3.10+ +
pip3 - Docker (untuk EMQX MQTT broker)
- PlatformIO (VS Code + extension, atau CLI) untuk upload firmware ESP32
- ESP32 dev board + MFRC522 RFID + relay 1 channel + LCD I2C 16x2 + ACS712 current sensor
bash setup.shScript akan:
- Buat Python virtual environment + install dependencies
- Pull & run EMQX Docker container
- Deteksi IP laptop → update
src/config.h - Start backend di
http://localhost:8000
# Virtual env
cd backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# EMQX (MQTT broker)
docker run -d --name tapcook_emqx -p 1883:1883 -p 18083:18083 emqx:5.8
# Start backend
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadBackend siap di http://localhost:8000.
- Buka folder proyek di VS Code (dengan PlatformIO extension)
- Edit
src/config.h:MQTT_HOST→ ganti dengan IP laptop server (misal"192.168.1.10")DEVICE_ID→ boleh ganti kalau lebih dari 1 ESP32
- Upload:
pio run --target upload
- Buka Serial Monitor (
pio device monitoratau via VS Code) untuk lihat log
Pada first boot, ESP32 akan masuk Config Mode (WiFi AP: TAPCOOK-XXXX). Hubungkan HP/laptop ke AP tersebut, buka browser ke 192.168.4.1, pilih WiFi rumah, masukkan password. Setelah connect, ESP32 restart dan siap digunakan.
ESP32 perlu dikasih tahu IP baru server. Caranya:
- Di admin dashboard: klik Reset WiFi → ESP32 restart ke Config Mode
- Atau hapus NVS: tombol flash sambil power-up (sesuai implementasi)
- Ulangi proses setup WiFi seperti first boot
Atau upload ulang firmware setelah update
src/config.hdengan IP baru.
- Tap kartu RFID ke ESP32
- LCD tampilkan
tinyurl.com/tc-regis(atau langsung bukahttp://[IP_SERVER]:8000) - Admin dashboard akan muncul kode 6-digit baru (berlaku 10 menit)
- User buka halaman registrasi, masukkan kode + nama
- Berhasil — kartu terdaftar
- Tap kartu lagi → relay ON (atau OFF jika sudah ON)
Buka http://[IP_SERVER]:8000/admin:
| Fitur | Fungsi |
|---|---|
| ⏳ Pending | Daftar kode registrasi aktif + countdown |
| 👥 Terdaftar | User yang sudah terdaftar, bisa hapus |
| ⚡ Relay | Tombol ON/OFF relay remote (real-time via MQTT) |
| 🔌 Reset WiFi | Reset ESP32 ke Config Mode |
| ⚙️ Tarif | Atur tarif listrik (Rp/kWh) — langsung dikirim ke ESP32 via MQTT |
- Tap kartu terdaftar — toggle relay ON/OFF (hanya kartu yang sama bisa matikan)
- Tombol Relay di Admin — ON/OFF dari web (tidak terikat kartu)
- Monitoring — LCD menampilkan nama user (scroll jika >16 karakter), daya (Watt), durasi pemakaian (MM:SS) saat relay ON; saat tap-out tampilkan total energi (kWh) & biaya (Rp)
| Endpoint | Method | Deskripsi |
|---|---|---|
/api/tariff |
GET | Ambil tarif saat ini (Rp/kWh) |
/api/tariff |
POST | Set tarif — parameter tariff (float) — dikirim ke ESP32 via MQTT |
Perhitungan biaya dilakukan di ESP32:
Daya (W) = 220V × Arus_RMS × 0.85
Energi (kWh) = Σ(Daya × dt) / 3.600.000
Biaya (Rp) = Energi × Tarif
| Gejala | Kemungkinan | Solusi |
|---|---|---|
| ESP32 gak connect MQTT | IP server berubah | Cek MQTT_HOST di src/config.h, upload ulang atau Reset WiFi |
| Admin dashboard "Menunggu..." | ESP32 offline / MQTT disconnect | Cek Serial Monitor ESP32, cek docker ps EMQX |
| Tap kartu gak respon | MQTT broker mati | docker start tapcook_emqx, restart backend |
| Kode pending gak hilang | Timezone mismatch | Refresh halaman admin; kode expired bakal otomatis kehapus |
| LCD blank / error | Address I2C berbeda | Cek i2cdetect atau ganti 0x27 di main.cpp |
| Biaya selalu Rp0 | Tarif belum diset | Set tarif di Admin Dashboard > ⚙️ Tarif |
| Username gak muncul | Kartu didaftarkan sebelum fitur ini | Hapus & daftar ulang kartu |
tapcook/
├── backend/
│ ├── main.py # FastAPI server (routes, MQTT, SSE, tariff API)
│ ├── database.py # SQLAlchemy models + SQLite (User, PendingRegistration, Config)
│ ├── requirements.txt # Python dependencies
│ ├── templates/
│ │ ├── admin.html # Admin dashboard (+ tariff settings)
│ │ └── register.html # Halaman registrasi user
│ └── start.sh # Script start backend
├── src/
│ ├── main.cpp # Firmware ESP32
│ └── config.h # WiFi/MQTT konfigurasi
├── platformio.ini # PlatformIO config
├── docker-compose.yml # Docker services (opsional)
├── setup.sh # Auto setup script
└── _ref/ # Dokumen referensi tugas
docker stop tapcook_emqx
# atau kill backend:
pkill -f "uvicorn main:app"