Breaking

Database MySQL Sistem Absensi Fingerprint ESP8266 dan CodeIgniter 4

Setelah ESP8266 berhasil terhubung ke WiFi, sekarang kita masuk ke bagian server dan database.

Database berfungsi menyimpan seluruh informasi yang dibutuhkan sistem absensi.

Data yang nantinya tersimpan antara lain:

  • data siswa/pegawai
  • fingerprint ID
  • perangkat absensi
  • data kehadiran
  • aktivitas perangkat
  • waktu absensi

Arsitektur sistem mulai berkembang menjadi:

AS608

   ↓

ESP8266

   ↓

WiFi

   ↓

API CodeIgniter 4

   ↓

MySQL

   ↓

Dashboard


1. Apa yang Akan Disimpan di Database?

Misalnya ada tiga perangkat absensi:

ABS-001 → Gerbang Utama

ABS-002 → Ruang Guru

ABS-003 → Laboratorium

Kemudian ada siswa:

Fingerprint 1 → Bayu

Fingerprint 2 → Andi

Fingerprint 3 → Siti

Ketika Bayu melakukan scan:

Device       : ABS-001

Fingerprint  : 1

Tanggal      : 2026-09-15

Jam          : 07:12:30

Server harus bisa mengetahui:

Fingerprint ID 1 milik siapa dan melakukan absensi melalui perangkat mana?

Karena itu kita membutuhkan beberapa tabel yang saling berhubungan.


2. Struktur Database

Untuk tahap awal kita gunakan tabel:

users

   │

   └── fingerprint_id

           │

           ▼

       attendance

           

devices

   │

   ├── attendance

   │

   └── device_logs

Secara sederhana:


3. Membuat Database

Buka:

phpMyAdmin

Kemudian buat database baru.

Contohnya:

absensi_iot

Atau jika project yang sudah kita bangun menggunakan nama database tertentu, gunakan database project tersebut agar tidak membuat database yang tidak diperlukan.

SQL:

CREATE DATABASE absensi_iot;

Kemudian:

USE absensi_iot;


4. Tabel Users

Tabel pertama digunakan untuk menyimpan identitas siswa atau pegawai.

Contoh:

CREATE TABLE users (

    id_user INT AUTO_INCREMENT PRIMARY KEY,

    nama VARCHAR(100) NOT NULL,

    nomor_identitas VARCHAR(50) NULL,

    kelas VARCHAR(50) NULL,

    jabatan VARCHAR(100) NULL,

    fingerprint_id INT NULL,

    status ENUM('aktif','nonaktif') DEFAULT 'aktif',

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP

);

Contoh data:

ID    Nama    Identitas    Kelas    Fingerprint
1    Bayu    1001    XII RPL    1
2    Andi    1002    XII RPL    2
3    Siti    1003    XI RPL    3

5. Mengapa Fingerprint ID Disimpan?

AS608 tidak mengetahui nama siswa.

Sensor hanya mengenal template fingerprint berdasarkan ID.

Contohnya:

ID 1

ID 2

ID 3

ID 4

Maka database yang menerjemahkannya.

AS608

ID = 2

  ↓

Database

  ↓

Fingerprint ID 2

  ↓

Andi

Jadi hubungan antara sensor dan database sangat penting.


6. Tabel Devices

Sekarang kita buat tabel perangkat.

CREATE TABLE devices (

    id_device INT AUTO_INCREMENT PRIMARY KEY,

    nama_device VARCHAR(100) NOT NULL,

    kode_device VARCHAR(50) NOT NULL UNIQUE,

    lokasi VARCHAR(150) NULL,

    status ENUM('aktif','nonaktif') DEFAULT 'aktif',

    api_key VARCHAR(255) NOT NULL,

    ip_address VARCHAR(50) NULL,

    firmware VARCHAR(50) NULL,

    online ENUM('Y','N') DEFAULT 'N',

    last_seen DATETIME NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP

);

Contoh data:

Device    Kode    Lokasi    Online
Mesin Absensi 1    ABS-001    Gerbang Utama    Y
Mesin Absensi 2    ABS-002    Ruang Guru    Y
Mesin Absensi 3    ABS-003    Laboratorium    N

7. Device Code Harus Unik

Bagian ini sangat penting:

kode_device VARCHAR(50) NOT NULL UNIQUE

Dengan UNIQUE, database tidak mengizinkan dua perangkat memiliki kode yang sama.

Contoh:

ABS-001

ABS-002

ABS-003

Tidak boleh:

ABS-001

ABS-001

Karena server harus bisa membedakan setiap mesin.


8. API Key

Setiap device juga mempunyai API Key.

Contohnya:

ABS-001

API KEY:

a8f73b92c1d54...

API Key digunakan untuk memastikan request memang berasal dari perangkat yang telah terdaftar.

Konsepnya:

ESP8266

   │

   │ Device Code

   │ API Key

   ▼

CodeIgniter 4

   │

   ▼

Cek database

   │

   ├── valid → lanjut

   │

   └── tidak valid → ditolak

Jangan memasukkan API Key asli ke artikel publik.


9. Tabel Attendance

Sekarang kita buat tabel utama untuk menyimpan data absensi.

CREATE TABLE attendance (

    id_attendance BIGINT AUTO_INCREMENT PRIMARY KEY,

    id_user INT NOT NULL,

    id_device INT NOT NULL,

    fingerprint_id INT NOT NULL,

    tanggal DATE NOT NULL,

    jam TIME NOT NULL,

    status VARCHAR(30) DEFAULT 'Hadir',

    keterangan VARCHAR(255) NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,


    INDEX idx_user (id_user),

    INDEX idx_device (id_device),

    INDEX idx_tanggal (tanggal),

    INDEX idx_fingerprint (fingerprint_id)

);


10. Contoh Data Absensi

Misalnya Bayu melakukan scan pada perangkat ABS-001.

Database dapat menyimpan:

Nama           : Bayu

Fingerprint ID : 1

Device         : ABS-001

Tanggal        : 2026-09-15

Jam            : 07:12:30

Status         : Hadir

Contoh tabel:

Nama    Fingerprint    Device    Tanggal    Jam    Status
Bayu    1    ABS-001    2026-09-15    07:12:30    Hadir
Andi    2    ABS-001    2026-09-15    07:15:22    Hadir
Siti    3    ABS-002    2026-09-15    07:18:10    Telat

11. Tabel Device Logs

Selain absensi, kita juga perlu mencatat aktivitas perangkat.

Misalnya:

ESP8266 terhubung

ESP8266 disconnect

Fingerprint scan

WiFi reconnect

Device online

Device offline

Buat tabel:

CREATE TABLE device_logs (

    id_log BIGINT AUTO_INCREMENT PRIMARY KEY,

    id_device INT NOT NULL,

    fingerprint_id INT NULL,

    aktivitas VARCHAR(100) NOT NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,


    INDEX idx_device (id_device),

    INDEX idx_created (created_at)

);

Contoh:

Device    Fingerprint    Aktivitas
ABS-001    NULL    DEVICE_ONLINE
ABS-001    1    FINGERPRINT_SCAN
ABS-001    1    ABSEN_MASUK
ABS-001    NULL    WIFI_RECONNECT

12. Relasi Data

Sekarang kita memiliki:

users

   │

   │ id_user

   ▼

attendance

   ▲

   │ id_device

   │

devices

Sedangkan log:

devices

   │

   │ id_device

   ▼

device_logs

Secara konsep:


13. Tambahkan Data Device Pertama

Untuk testing, kita bisa memasukkan satu device.

INSERT INTO devices

(

    nama_device,

    kode_device,

    lokasi,

    status,

    api_key,

    online

)

VALUES

(

    'Mesin Absensi 1',

    'ABS-001',

    'Gerbang Utama',

    'aktif',

    'API_KEY_DEVICE_001',

    'N'

);

Kemudian device kedua:

INSERT INTO devices

(

    nama_device,

    kode_device,

    lokasi,

    status,

    api_key,

    online

)

VALUES

(

    'Mesin Absensi 2',

    'ABS-002',

    'Ruang Guru',

    'aktif',

    'API_KEY_DEVICE_002',

    'N'

);


14. Tambahkan Data Siswa

Untuk pengujian:

INSERT INTO users

(

    nama,

    nomor_identitas,

    kelas,

    fingerprint_id,

    status

)

VALUES

(

    'Bayu',

    '1001',

    'XII RPL',

    1,

    'aktif'

),

(

    'Andi',

    '1002',

    'XII RPL',

    2,

    'aktif'

),

(

    'Siti',

    '1003',

    'XI RPL',

    3,

    'aktif'

);

Sekarang database sudah mempunyai tiga fingerprint:

Fingerprint 1 → Bayu

Fingerprint 2 → Andi

Fingerprint 3 → Siti


15. Simulasi Data Absensi

Misalnya Bayu melakukan absensi melalui ABS-001.

Kita bisa mencoba:

INSERT INTO attendance

(

    id_user,

    id_device,

    fingerprint_id,

    tanggal,

    jam,

    status

)

VALUES

(

    1,

    1,

    1,

    CURDATE(),

    CURTIME(),

    'Hadir'

);

Kemudian cek:

SELECT * FROM attendance;

Jika berhasil, data akan muncul.


16. Kenapa Tidak Langsung Menyimpan Nama?

Sebaiknya tabel absensi menyimpan:

id_user

id_device

fingerprint_id

bukan hanya:

nama

Karena data lebih mudah dikelola.

Contohnya:

id_user = 1

mengarah ke:

Bayu

Jika nama berubah menjadi:

Bayu Sahrizal

kita cukup mengubah data pada users.

Data absensi lama tetap terhubung dengan orang yang sama.


17. Index Database

Kita sudah menambahkan:

INDEX idx_tanggal (tanggal)

Ini berguna ketika dashboard sering melakukan pencarian:

Absensi hari ini

Absensi bulan ini

Absensi minggu ini

Contohnya:

SELECT *

FROM attendance

WHERE tanggal = CURDATE();

Untuk jumlah data yang semakin besar, index akan membantu pencarian database.


18. Konsep Data dari ESP8266

Nantinya ESP8266 tidak langsung berbicara dengan MySQL.

Jangan lakukan:

ESP8266

   ↓

MySQL

Yang benar:

ESP8266

   ↓

HTTP

   ↓

API CodeIgniter 4

   ↓

Model

   ↓

MySQL

Jadi ESP8266 mengirim request ke API.

Contohnya secara konsep:

{

  "device_code": "ABS-001",

  "fingerprint_id": 1,

  "tanggal": "2026-09-15",

  "jam": "07:12:30"

}

CodeIgniter 4 kemudian melakukan:

1. Cek Device Code

2. Cek API Key

3. Cari fingerprint

4. Cari user

5. Cek jam absensi

6. Tentukan status

7. Simpan absensi

8. Catat device log

9. Kirim response


19. Keamanan Database

Jangan memberikan akses MySQL langsung kepada ESP8266.

Misalnya jangan membuat ESP8266 mengetahui:

Database Host

Database Username

Database Password

ESP8266 cukup mengetahui:

Server API

Device Code

API Key

Contoh:

ESP8266

   │

   │ HTTPS/HTTP

   ▼

/api/absen

   │

   ▼

CodeIgniter 4

   │

   ▼

MySQL

Dengan cara ini database tetap berada di belakang aplikasi server.


20. Struktur Sistem Setelah Artikel #9

Sekarang kita sudah memiliki tiga lapisan:

Perangkat

AS608
ESP8266
RTC
LCD
Buzzer
LED

Jaringan
WiFi
Router
IP Address
Device Code
API Key

Server
CodeIgniter 4
API
MySQL

Sehingga:


21. Kesimpulan

Database merupakan fondasi utama sistem absensi IoT.

Pada artikel ini kita sudah membuat:

users

devices

attendance

device_logs

Dengan konsep:

Fingerprint ID

      ↓

    Users

      ↓

  Attendance

      ↑

    Device

      ↓

 Device Logs

Setelah database siap, tahap berikutnya adalah membuat API CodeIgniter 4 yang menjadi jembatan antara ESP8266 dan MySQL.


Tidak ada komentar:

Posting Komentar