Aplikasi web untuk petani kopi Indonesia. Memprediksi pH dan kualitas kopi dari data iklim, topografi, dan tanah kebun mereka sendiri.
Petani kopi di Indonesia jarang punya akses ke uji laboratorium. Karakter kopi mereka, termasuk tingkat keasamannya, baru ketahuan setelah panen sampai di tangan pembeli dan dinilai lewat uji cicip. Padahal hal yang membentuk karakter itu sudah ada jauh sebelumnya di kebun: ketinggian tempat, suhu harian, curah hujan, kemiringan lereng, dan kondisi tanah. Informasi itu sebenarnya tersedia lewat API publik, tapi bentuknya angka mentah yang tidak berarti apa-apa bagi petani.
Saya membangun Prediksi Kopi supaya petani bisa melihat perkiraan karakter kopinya lebih awal, memakai data kebunnya sendiri, tanpa harus mengumpulkan angka itu satu per satu.
Aplikasi berjalan sebagai dua layanan terpisah. Aplikasi web dibuat dengan Laravel dan menyimpan kebun, riwayat prediksi, isi Pustaka, serta forum. Layanan kedua adalah service machine learning dengan FastAPI yang memuat model scikit-learn dan hanya bisa dipanggil aplikasi web memakai API key, tidak pernah langsung dari browser.
Ketika petani menambah kebun, dia memilih lokasi sampai tingkat desa dari data wilayah Kemendagri yang saya impor ke database (91.599 baris), lalu menggeser penanda peta ke titik kebunnya. Setelah kebun tersimpan, tiga kelompok data lingkungan diambil di latar belakang lewat queue: iklim dari Open-Meteo archive, ketinggian dari Open-Meteo Elevation, dan kondisi tanah dari SoilGrids. Setiap kelompok mencatat sumbernya (otomatis atau manual) beserta waktu pengambilan, jadi petani tahu mana angka hasil API dan mana yang dia isi sendiri.
Kendala terbesar justru bukan soal kode. Data pH kopi asli yang saya punya cuma empat titik hasil uji laboratorium tingkat daerah. Itu jauh dari cukup untuk melatih model. Saya bisa saja tetap melatih sesuatu dan menyebutnya prediksi pH, tapi angkanya akan menyesatkan petani. Jadi saya ambil jalan lain: model machine learning dilatih untuk skor kualitas dan skor keasaman sensori memakai dataset CQI (1338 baris), sementara nilai pH ditampilkan sebagai perkiraan dari rumus dan diberi label terbuka bahwa itu bukan hasil model. Di halaman detail prediksi saya tambahkan kolom pH hasil lab, supaya data asli bisa terkumpul pelan-pelan. Model pH baru akan dilatih setelah datanya cukup.
Metrik model juga saya tampilkan apa adanya. Model kualitas mendapat R2 0,16 dan RMSE 2,81 di data uji, model keasaman R2 0,17 dan RMSE 0,29. Angka itu memang kecil, dan di halaman hasil saya sebut sebagai perkiraan kasar, bukan kepastian.
Kendala berikutnya datang dari API lingkungan. Satuannya tidak langsung bisa dipakai. Kemiringan lereng dari API berbentuk derajat sementara penyuluhan di lapangan memakai persen, dan komposisi pasir, debu, serta liat dari SoilGrids datang dalam gram per kilogram yang harus diubah dulu sebelum dipetakan ke 12 kelas tekstur USDA berbahasa Indonesia. Kesalahan pembagian di bagian ini sempat membuat semua tanah terbaca sebagai satu kelas yang sama.
Saat mengisi data awal untuk production, seeder saya kena HTTP 429 karena service ML membatasi 60 permintaan per menit, sedangkan riwayat prediksi memang dihitung sungguhan lewat model. Saya beri jeda 1,2 detik per prediksi di seeder, dan data tersimpan utuh.
Panel admin memakai template Bootstrap yang memuat ulang seluruh aset di setiap perpindahan halaman. Saya pasang Turbo Drive supaya aset dimuat sekali di awal, lalu menandai script vendor agar tidak dievaluasi ulang.
Saya mengerjakan project ini sendirian: perancangan skema database, backend Laravel, tampilan, integrasi API lingkungan, pelatihan dua model di scikit-learn, service FastAPI, penulisan 125 tes otomatis, sampai Dockerfile dan proses deploy ke Coolify.
Aplikasi sudah berjalan di prediksikopi.com dengan dua container (web dan ML) serta database MySQL di satu VPS. Seluruh tes otomatis lolos sebelum setiap deploy.
Yang ingin saya lanjutkan: mengumpulkan pH hasil lab dari pengguna sampai cukup untuk melatih model pH yang sebenarnya, lalu mengevaluasi ulang model kualitas dengan menambahkan fitur lingkungan kebun ke dalamnya. Setelah itu baru masuk akal membicarakan akurasi yang lebih serius.