{"name":"ChiliVision Laravel Smart Crop & Computer Vision API","version":"3.1.0-laravel-modular","framework":"Laravel 13.40.0","database":"chilivision_db","architecture":{"controller":"ChiliVisionApiController","services":["LeafInferenceService","PesticideScheduleService","GeminiChatService"],"scheduler_command":"chilivision:check-schedule"},"system_services":{"laravel":"ok","inference_engine":{"mode":"fastapi_warm","fastapi_enabled":true,"fastapi_online":true,"url":"http:\/\/127.0.0.1:8001"},"gemini_ai":{"enabled":true,"model":"gemini-3.5-flash-lite"},"telegram_bot":{"configured":true,"unreachable":false},"scheduler":{"command":"chilivision:check-schedule","interval":"everyMinute"}},"base_url":"https:\/\/chilivision.me\/api","total_groups":9,"total_primary_endpoints":24,"total_routes_including_aliases":42,"available_models":["yolov8n-chili","yolov10n-chili","yolov11n-chili","cnn-6ch-chili"],"timestamp":"2026-11-15T23:15:39+07:00","groups":[{"group_number":0,"group_key":"0_info_health_dashboard","title":"0. Info, Health & Ringkasan Dashboard","icon":"\u26a1","note":"Endpoint utilitas untuk memeriksa status server, ketersediaan model AI ONNX, daftar kamera, serta ringkasan real-time seluruh state sistem.","items":[{"method":"GET","endpoint":"\/api","aliases":["\/api?format=json"],"handler":"ChiliVisionApiController@apiInfo","description":"Menampilkan halaman dokumentasi interaktif REST API (di browser) atau spesifikasi JSON lengkap (?format=json).","parameters":"Query opsional: format=json (untuk paksa output raw JSON).","sample_payload":null},{"method":"GET","endpoint":"\/api\/health","aliases":["\/health"],"handler":"ChiliVisionApiController@health","description":"Status server Laravel, koneksi database TiDB Cloud, daftar model AI aktif, dan ringkasan system_services (FastAPI warm worker \/ CLI fallback, Gemini AI, Telegram Bot, Scheduler).","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"GET","endpoint":"\/api\/models","aliases":["\/models"],"handler":"ChiliVisionApiController@models (via LeafInferenceService)","description":"Daftar model AI Computer Vision (yolov8n-chili, yolov10n-chili, yolov11n-chili, cnn-6ch-chili) beserta status file model.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"GET","endpoint":"\/api\/telegram\/model","aliases":[],"handler":"ChiliVisionApiController@getTelegramModel","description":"Mengambil model AI Computer Vision yang sedang dipilih secara persisten untuk Telegram Bot & Web.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/telegram\/model","aliases":[],"handler":"ChiliVisionApiController@setTelegramModel","description":"Mengubah model AI aktif untuk deteksi foto daun (yolov8n-chili, yolov10n-chili, yolov11n-chili, atau cnn-6ch-chili).","parameters":"JSON \/ Form:\n\u2022 model_id (wajib): ID model dari \/api\/models","sample_payload":{"model_id":"yolov8n-chili"}},{"method":"GET","endpoint":"\/api\/cameras","aliases":["\/cameras"],"handler":"ChiliVisionApiController@cameras","description":"Daftar sumber kamera default yang terdaftar.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"GET","endpoint":"\/api\/dashboard\/state","aliases":[],"handler":"ChiliVisionApiController@dashboardState","description":"Mengambil seluruh state real-time sekaligus (deteksi daun, soil moisture, DHT11, histori semprot, jadwal pestisida, status ESP32, system_services, dan pesan chatbot).","parameters":"Tidak ada parameter.","sample_payload":null}]},{"group_number":1,"group_key":"1_gambar_daun","title":"1. API Gambar Daun & Deteksi Penyakit (Computer Vision)","icon":"\ud83c\udf43","note":"Inferensi berjalan melalui LeafInferenceService (FastAPI warm worker port 8001 dengan circuit breaker + fallback otomatis ke CLI Python). Jika visual daun tidak berubah, gambar tidak diduplikasi ke TiDB Cloud kecuali force_save=true.","items":[{"method":"GET","endpoint":"\/api\/leaf-image","aliases":["\/api\/gambar-daun"],"handler":"ChiliVisionApiController@getLatestLeafImage","description":"Mengambil deteksi daun terakhir beserta 10 riwayat deteksi terbaru dari tabel leaf_detections.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/leaf-image","aliases":["\/api\/gambar-daun","\/api\/predict","\/predict"],"handler":"ChiliVisionApiController@predictAndStoreLeaf -> LeafInferenceService","description":"Menjalankan inferensi AI (mengembalikan field inference_backend: fastapi|cli) pada foto daun cabai & menyimpan ke database jika kondisi daun berubah.","parameters":"multipart\/form-data:\n\u2022 file atau image (wajib, file gambar JPG\/PNG\/WEBP)\n\u2022 model_id (opsional, default: model terpilih \/ 'yolov8n-chili')\n\u2022 threshold (opsional, 0.10\u20130.95; default: 0.45 untuk YOLO, 0.50 untuk CNN 6-Channel)\n\u2022 force_save (opsional, boolean)","sample_payload":null}]},{"group_number":2,"group_key":"2_sensor_soil_moisture","title":"2. API Sensor Soil Moisture (Kelembapan Tanah)","icon":"\ud83c\udf31","note":"Alur: web > chatbot > database. Jika kelembapan tanah < 30% (Kering), sistem otomatis menjadwalkan penyemprotan air selama 5 detik.","items":[{"method":"GET","endpoint":"\/api\/sensor\/soil-moisture","aliases":["\/api\/soil-moisture"],"handler":"ChiliVisionApiController@getLatestSoilMoisture","description":"Mengambil pembacaan kelembapan tanah terakhir & 15 riwayat terbaru dari tabel soil_moisture_readings.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/sensor\/soil-moisture","aliases":["\/api\/soil-moisture"],"handler":"ChiliVisionApiController@storeSoilMoisture","description":"Mengirim pembacaan kelembapan tanah baru ke Web, meneruskan notifikasi ke Chatbot\/Telegram, dan menyimpan ke TiDB Cloud.","parameters":"JSON \/ Form:\n\u2022 moisture_percent (atau moisture \/ value): 0\u2013100 (wajib)\n\u2022 adc_value (opsional, integer)\n\u2022 source (opsional, default: 'api'; isi 'esp32' untuk mencatat heartbeat hardware)","sample_payload":{"moisture_percent":45.5,"adc_value":2950,"source":"api_docs_test"}}]},{"group_number":3,"group_key":"3_sensor_dht11","title":"3. API Sensor DHT11 (Suhu & Kelembapan Udara)","icon":"\ud83c\udf21\ufe0f","note":"Alur: web > chatbot > database. Menghitung heat index otomatis dan memberikan rekomendasi kondisi mikroklimat cabai.","items":[{"method":"GET","endpoint":"\/api\/sensor\/dht11","aliases":["\/api\/dht11"],"handler":"ChiliVisionApiController@getLatestDht11","description":"Mengambil pembacaan suhu & kelembapan udara terakhir beserta 15 riwayat terbaru dari tabel dht11_readings.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/sensor\/dht11","aliases":["\/api\/dht11"],"handler":"ChiliVisionApiController@storeDht11","description":"Mengirim pembacaan suhu & kelembapan udara baru ke Web, meneruskan notifikasi ke Chatbot\/Telegram, dan menyimpan ke TiDB Cloud.","parameters":"JSON \/ Form:\n\u2022 temperature (atau suhu): -10 s\/d 80 (wajib)\n\u2022 humidity (atau kelembapan_udara): 0\u2013100 (wajib)\n\u2022 source (opsional, default: 'api'; isi 'esp32' untuk mencatat heartbeat hardware)","sample_payload":{"temperature":29.8,"humidity":66,"source":"api_docs_test"}}]},{"group_number":4,"group_key":"4_histori_penyemprotan_pestisida","title":"4. API Histori & Jadwal Penyemprotan Pestisida","icon":"\ud83e\uddea","note":"Dikelola oleh PesticideScheduleService: menyimpan histori semprot serta mengevaluasi interval fleksibel dan jadwal target tanggal\/jam spesifik (dipicu otomatis oleh scheduler background).","items":[{"method":"GET","endpoint":"\/api\/spray\/pesticide\/history","aliases":["\/api\/histori-pestisida"],"handler":"ChiliVisionApiController@getPesticideSprayHistory -> PesticideScheduleService","description":"Mengambil waktu terakhir pestisida disemprot, info interval\/jadwal target tanggal spesifik, dan 20 riwayat terakhir.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/spray\/pesticide\/history","aliases":["\/api\/histori-pestisida"],"handler":"ChiliVisionApiController@storePesticideSprayHistory","description":"Mencatat log histori waktu penyemprotan pestisida ke tabel spray_histories.","parameters":"JSON \/ Form (opsional semua):\n\u2022 trigger_mode, triggered_by, duration_seconds, leaf_condition, notes, sprayed_at","sample_payload":{"trigger_mode":"manual","triggered_by":"api_docs_test","duration_seconds":5,"notes":"Pencatatan histori pestisida dari halaman dokumentasi API."}}]},{"group_number":5,"group_key":"5_histori_penyemprotan_air","title":"5. API Histori Penyemprotan Air","icon":"\ud83d\udca7","note":"Menyimpan dan menampilkan waktu terakhir penyemprotan air dari tabel spray_histories.","items":[{"method":"GET","endpoint":"\/api\/spray\/water\/history","aliases":["\/api\/histori-air"],"handler":"ChiliVisionApiController@getWaterSprayHistory","description":"Mengambil waktu terakhir air disemprot dan 20 riwayat penyemprotan air terakhir.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/spray\/water\/history","aliases":["\/api\/histori-air"],"handler":"ChiliVisionApiController@storeWaterSprayHistory","description":"Mencatat log histori waktu penyemprotan air ke tabel spray_histories.","parameters":"JSON \/ Form (opsional semua):\n\u2022 trigger_mode, triggered_by, duration_seconds, soil_moisture, notes, sprayed_at","sample_payload":{"trigger_mode":"manual","triggered_by":"api_docs_test","duration_seconds":5,"soil_moisture":42,"notes":"Pencatatan histori air dari halaman dokumentasi API."}}]},{"group_number":6,"group_key":"6_penyemprotan_manual","title":"6. API Penyemprotan Manual (Air & Pestisida)","icon":"\ud83d\udca6","note":"Digunakan oleh tombol di Web Dashboard maupun perintah manual untuk menyalakan pompa air\/pestisida dan memasukkannya ke antrean ESP32.","items":[{"method":"POST","endpoint":"\/api\/spray\/manual","aliases":["\/api\/penyemprotan-manual"],"handler":"ChiliVisionApiController@triggerManualSpray","description":"Memicu penyemprotan manual air atau pestisida, mencatat ke histori, dan memberi tahu Chatbot\/Telegram.","parameters":"JSON \/ Form:\n\u2022 type (atau jenis): 'water' \/ 'air' atau 'pesticide' \/ 'pestisida'\n\u2022 duration_seconds (opsional, 1\u201360 detik, default: 5)\n\u2022 triggered_by \/ source (opsional, default: 'web')\n\u2022 notes (opsional)","sample_payload":{"type":"water","duration_seconds":5,"triggered_by":"web","notes":"Uji semprot manual dari dokumentasi API"}}]},{"group_number":7,"group_key":"7_chatbot_esp32_telegram","title":"7. API Chatbot AI (Gemini), Telegram Bot & Hardware ESP32","icon":"\ud83e\udd16","note":"Sinkronisasi 2 arah antara Chatbot Website (GeminiChatService + fast-path command), Bot Telegram, monitoring heartbeat ESP32, dan antrean polling perintah pompa.","items":[{"method":"GET","endpoint":"\/api\/chatbot\/messages","aliases":[],"handler":"ChiliVisionApiController@getChatbotMessages","description":"Mengambil 40 pesan percakapan chatbot terakhir dari tabel chatbot_messages.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/chatbot\/message","aliases":[],"handler":"ChiliVisionApiController@sendChatbotMessage -> GeminiChatService","description":"Mengirim pesan atau perintah ke chatbot. Mendukung \/status, \/semprot_air, \/semprot_pestisida, ubah jadwal interval atau tanggal\/jam spesifik, ganti model AI, serta tanya jawab bebas via Gemini AI.","parameters":"JSON \/ Form:\n\u2022 message (wajib, string maks 1000 karakter)\n\u2022 source (opsional, 'web' atau 'telegram')","sample_payload":{"message":"\/status","source":"web"}},{"method":"GET","endpoint":"\/api\/esp32\/poll","aliases":["\/api\/spray\/pending"],"handler":"ChiliVisionApiController@esp32PollCommands","description":"Di-polling oleh mikrokontroler ESP32 untuk mencatat heartbeat online, mengecek antrean perintah nyala pompa (spray_water, spray_pesticide beserta durasinya), dan menandainya completed.","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"GET","endpoint":"\/api\/hardware\/esp32-status","aliases":[],"handler":"ChiliVisionApiController@getHardwareStatus","description":"Memeriksa status koneksi heartbeat ESP32 terbaru (never_connected, online, offline beserta selisih detik terakhir aktif).","parameters":"Tidak ada parameter.","sample_payload":null},{"method":"POST","endpoint":"\/api\/telegram\/webhook","aliases":[],"handler":"ChiliVisionApiController@telegramWebhook","description":"Endpoint webhook untuk menerima pesan masuk dari Bot Telegram dan membalasnya secara otomatis.","parameters":"Payload JSON standar Telegram Update:\n\u2022 message.chat.id\n\u2022 message.text","sample_payload":{"message":{"chat":{"id":123456789},"text":"\/status"}}}]},{"group_number":8,"group_key":"8_laporan_ekspor_csv","title":"8. API Laporan & Ekspor Data CSV","icon":"\ud83d\udcca","note":"Menyediakan unduhan laporan data historis siap buka di Excel\/Spreadsheet (UTF-8 BOM CSV).","items":[{"method":"GET","endpoint":"\/api\/reports\/export\/{type}","aliases":[],"handler":"ChiliVisionApiController@exportCsvReport","description":"Mengekspor data historis ke format CSV berdasarkan tipe laporan.","parameters":"Path parameter {type} wajib salah satu dari:\n\u2022 soil (kelembapan tanah)\n\u2022 dht11 (suhu & kelembapan udara)\n\u2022 leaf (riwayat deteksi daun)\n\u2022 spray (riwayat penyemprotan air & pestisida)","sample_payload":null}]}],"endpoints":{"0_info_health_dashboard":{"api_info":"GET \/api (HTML UI) | GET \/api?format=json (JSON)","health":"GET \/api\/health (alias: GET \/health)","models":"GET \/api\/models (alias: GET \/models)","telegram_model_get":"GET \/api\/telegram\/model","telegram_model_set":"POST \/api\/telegram\/model","cameras":"GET \/api\/cameras (alias: GET \/cameras)","dashboard_state":"GET \/api\/dashboard\/state"},"1_gambar_daun":{"description":"Deteksi terakhir daun (LeafInferenceService: FastAPI warm + CLI fallback), jika daun tidak berubah gambar tidak dikirim ke database","get_latest":"GET \/api\/leaf-image (alias: GET \/api\/gambar-daun)","post_detect":"POST \/api\/leaf-image (alias: POST \/api\/gambar-daun, POST \/api\/predict, POST \/predict)"},"2_sensor_soil_moisture":{"description":"Mengirim Data Terakhir ke web > chatbot > database","get_latest":"GET \/api\/sensor\/soil-moisture (alias: GET \/api\/soil-moisture)","post_data":"POST \/api\/sensor\/soil-moisture (alias: POST \/api\/soil-moisture)"},"3_sensor_dht11":{"description":"Mengirim Data Terakhir ke web > chatbot > database","get_latest":"GET \/api\/sensor\/dht11 (alias: GET \/api\/dht11)","post_data":"POST \/api\/sensor\/dht11 (alias: POST \/api\/dht11)"},"4_histori_penyemprotan_pestisida":{"description":"Menyimpan waktu terakhir pestisida disemprot & jadwal target tanggal\/interval (PesticideScheduleService)","get_history":"GET \/api\/spray\/pesticide\/history (alias: GET \/api\/histori-pestisida)","post_history":"POST \/api\/spray\/pesticide\/history (alias: POST \/api\/histori-pestisida)"},"5_histori_penyemprotan_air":{"description":"Menyimpan waktu terakhir air disemprot","get_history":"GET \/api\/spray\/water\/history (alias: GET \/api\/histori-air)","post_history":"POST \/api\/spray\/water\/history (alias: POST \/api\/histori-air)"},"6_penyemprotan_manual":{"description":"Implementasi Tombol di web dan command di chatbot untuk menyemprot air atau pestisida secara manual","post_manual_spray":"POST \/api\/spray\/manual (alias: POST \/api\/penyemprotan-manual)"},"7_chatbot_esp32_telegram":{"get_messages":"GET \/api\/chatbot\/messages","post_message":"POST \/api\/chatbot\/message (GeminiChatService)","esp32_poll":"GET \/api\/esp32\/poll (alias: GET \/api\/spray\/pending)","esp32_status":"GET \/api\/hardware\/esp32-status","telegram_webhook":"POST \/api\/telegram\/webhook"},"8_laporan_ekspor_csv":{"export_csv":"GET \/api\/reports\/export\/{type} (soil | dht11 | leaf | spray)"}}}