> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mertani.co.id/llms.txt
> Use this file to discover all available pages before exploring further.

# How Does Mertani Work?

**Mertani** adalah platform IoT berbasis cloud yang menghubungkan perangkat di lapangan `sensor dan data logger` dengan sistem backend dan aplikasi eksternal melalui REST API.

Data dari perangkat dikumpulkan, diproses, disimpan, dan dapat diakses secara terpusat. Semua interaksi dengan data dilakukan melalui API; tidak ada akses langsung ke perangkat.

***

## Arsitektur Sistem

Mertani bekerja sebagai penghubung antara tiga lapisan utama:

| Lapisan     | Komponen                      | Fungsi                                               |
| ----------- | ----------------------------- | ---------------------------------------------------- |
| **Edge**    | Sensor & data logger          | Mengumpulkan data di lapangan                        |
| **Backend** | Server & database Mertani     | Menerima, memvalidasi, memproses, dan menyimpan data |
| **Client**  | Aplikasi web/mobile/eksternal | Mengakses data melalui API                           |

Ketiga lapisan ini bersifat **decoupled**, perangkat, backend, dan client tidak saling terikat langsung, sehingga gangguan pada satu lapisan tidak mempengaruhi lapisan lain.

***

## Alur Data End-to-End

<Frame>
  <img alt="Diagram alur data Mertani dari perangkat ke aplikasi eksternal" src="https://mintcdn.com/mertani/QKCSIJ_vjKyFoAyf/assets/asset-api/workflowanimate-light.svg?fit=max&auto=format&n=QKCSIJ_vjKyFoAyf&q=85&s=ecc51609c86c448ee18769da7701982b" className="dark:hidden" width="1851" height="742" data-path="assets/asset-api/workflowanimate-light.svg" />

  <img alt="Diagram alur data Mertani dari perangkat ke aplikasi eksternal" src="https://mintcdn.com/mertani/QKCSIJ_vjKyFoAyf/assets/asset-api/workflowanimate-dark.svg?fit=max&auto=format&n=QKCSIJ_vjKyFoAyf&q=85&s=d696deecb1ad3fc3f5e8b07380a84737" className="hidden dark:block" width="1851" height="742" data-path="assets/asset-api/workflowanimate-dark.svg" />
</Frame>

<Steps>
  <Step title="Data Collection - Perangkat IoT">
    Sensor dan data logger mengumpulkan parameter lingkungan (suhu, kelembaban, curah hujan, dll.) secara periodik sesuai interval yang dikonfigurasi, umumnya **setiap 1 jam**.
  </Step>

  <Step title="Data Transmission">
    Perangkat mengirim data ke server Mertani melalui jaringan (GSM, LoRa, atau internet) dalam format terstruktur (JSON) beserta metadata seperti `device_id` dan `timestamp`.
  </Step>

  <Step title="Data Ingestion & Validation">
    Backend menerima data dan menjalankan serangkaian validasi: verifikasi identitas device, validasi struktur data, dan normalisasi format. Data yang tidak valid akan ditolak pada tahap ini.
  </Step>

  <Step title="Data Processing & Storage">
    Data yang valid diproses dan disimpan ke **database time-series**, diindeks berdasarkan `device_id`, `timestamp`, dan parameter sensor untuk efisiensi query.
  </Step>

  <Step title="Data Exposure via API">
    Data tersedia melalui **REST API Mertani**, satu-satunya jalur resmi untuk konsumsi data oleh sistem eksternal. Tersedia endpoint untuk data terbaru maupun data historis.
  </Step>

  <Step title="Data Consumption - External System">
    Aplikasi client mengambil data melalui API dan menampilkannya dalam bentuk dashboard, grafik, atau analitik. Client **tidak pernah berkomunikasi langsung** dengan perangkat.
  </Step>
</Steps>

***

## Karakteristik Sistem

| Karakteristik              | Penjelasan                                                                                 |
| -------------------------- | ------------------------------------------------------------------------------------------ |
| **API-Centric**            | Semua akses data dilakukan melalui API - tidak ada jalur langsung ke perangkat             |
| **Decoupled Architecture** | Perangkat, backend, dan client beroperasi secara independen                                |
| **Time-Series Storage**    | Data diindeks berdasarkan waktu, mendukung query historis secara efisien                   |
| **Interval-Based Data**    | Data tersedia sesuai interval pengiriman device (umumnya 1 jam); bukan streaming per detik |
| **Scalable**               | Infrastruktur dapat menangani banyak device secara bersamaan                               |

<Info>
  Karena API selalu membaca dari database, bukan langsung dari device. Data historis tetap dapat diakses meskipun perangkat sedang offline atau terlambat mengirim data.
</Info>

***

## Best Practice Integrasi

| Praktik                                           | Alasan                                                                 |
| ------------------------------------------------- | ---------------------------------------------------------------------- |
| Sesuaikan interval polling dengan interval device | Polling lebih sering dari interval device tidak menghasilkan data baru |
| Gunakan filter `timestamp` pada setiap request    | Menghindari pengambilan data yang sudah pernah diterima                |
| Terapkan caching di sisi client                   | Mengurangi beban request dan meningkatkan performa aplikasi            |
| Hindari request berulang dalam waktu singkat      | Dapat memicu throttling dari sistem                                    |
