Membuat Server Foto seperti Google Photos

Seminggu ini saya agak mengesampingkan project PLTS ataupun mikrokontroller saya. Perhatian saya tersita oleh riset dan eksperimen untuk mencari alternatif atau cara agar saya tidak ketergantungan dengan layanan google photos. Pasalnya, storage saya di google one, suatu layanan storage dari google berbayar, sudah mulai mendekati penuh.

Selama beberapa tahun ini, lupa dari sejak kapan, saya berlangganan google storage sebesar 100 GB. Penyimpanan ini termasuk untuk gmail, drive, dan google photos. Layanan ini sangat membantu saya yang memang seneng fotografi, mengabadikan momen, dan suka menata arsip digital terutama foto. Saya tidak perlu pusing kehilangan hasil jepretan karena secara otomatis foto-foto saya di-backup ke cloud oleh google photos, selain backup manual yang sering saya lakukan juga ketika HP penuh.

Saya lebih percaya hasil backup google photos daripada backup manual yang sudah saya lakukan. Backup manual sering kali menyebabkan redundancy dan juga kemungkinan foto yang ter-skip. Selain itu, kedisiplinan dalam membuat kerapihan pengarsipan foto digital kadang naik dan turun sehingga tidak konsisten.

Alternatif Solusi

Seminggu yang lalu, sejak tulisan ini dibuat, saya menemukan solusi open source sebagai alternatif dari Google Photos. Ada beberapa produk yang direkomendasikan oleh AI dan salah satunya bernama Immich. Sampai sekarang saya masih amazed dengan Immich, mirip sekali dengan Google Photos. Bagi orang yang sudah terbiasa pakai google photos, saya yakin akan mudah sekali menyukainya. Fitur-fitur seperti people face recognition, smart search, timeline, maps, dll, tersedia juga di immich. Hal ini tidak terlepas dari kemajuan teknologi machine learning yang juga disematkan di immich.

Setelah itu saya terbawa suasana hingga melakukan eksperimen penuh dengan immich. Awalnya saya coba di laptop untuk melakukan evaluasi dari fitur-fitur dan pengalaman pengguna. Cukup puas dengan eksperimen lokal di laptop, saya tingkatkan dengan eksperiman di lingkungan server, sehingga bisa terintegrasi juga dengan smartphone.

Menyiapkan Dukungan System

Sebelum menjalankan Immich, saya perlu menyiapkan lingkungan sistem dimana aplikasi ini berjalan. Saya sampai tiga kali install operating system untuk server untuk ujicoba mana yang paling optimal. Server yang saya gunakan adalah komputer tua berumur 10 tahun an dengan casing dari komputer yang memiliki usia 10 tahun lebih lama lagi. Instalasi pertama saya menggunakan antiX, sebuah distro linux berbasis debian. Awalnya saya pakai yang versi arsitektur 32-bit karena saya pakai pc tua dengan os bawaan windows 7 32-bit. Setelah saya install ternyata bermasalah dengan Docker yang tidak lagi mendukung os 32-bit.

Instalasi kedua saya menggunakan AntiX-core yang 64-bit. Distro linux ini sangat ringan sesuai dengan yang diiklankan. Tetapi kompensasinya docker daemon tidak otomatis jalan. Untuk bisa menjalankan docker, ada beberapa step yang harus dilakukan terlebih dahulu secara manual. Sehingga ketika komputer restart, docker tidak langsung berjalan. Otomasi sudah coba saya lakukan dan ternyata belum berhasil. Immich sempat berhasil berjalan, tetapi masih ada kekurangan sana-sini.

Yang terakhir, saya buat agak lebih mapan dan lebih teratur. Saya tambahkan HDD satu lagi yang saya khususkan hanya untuk menyimpan foto dan metadatanya. Sedangkan HDD yang satunya saya isi dengan sistem operasi. Pemisahan ini saya lakukan untuk membuat sistem ini lebih modular dan lebih mudah dalam perawatan. Selain itu, dari sisi software, saya mencoba menggunakan ubuntu server yang harapannya lebih stabil dan lebih mudah untuk menjalankan docker dan daemon-nya.

Perubahan menjadi dua HDD ini agak memakan waktu karena perlu melakukan beberapa hal di haardware dan juga software. Di hardware saya perlu memindah jeroan CPU dari casing awal yang hanya punya satu slot HDD ke casing CPU lain, sebuah casing lama saya yang kebetulan lama nganggur, yang punya slot HDD hingga 4 atau 5 slot. Sedangkan sisi software, saya perlu ekspansi partisi HDD yang tadinya saya pakai buat ujicoba sebelumnya dengan foto yang sudah terupload hingga 200 GB. Ekspansi partisi ini saya lakukan karena partisi OS sudah tidak diperlukan di HDD kedua. Masalahnya partisi OS ada di sebelah kiri, dan saya belum menemukan cara atau tool untuk expansi partisi HDD ke sebelah kiri. Akhirnya, HDD kedua ini saya hapus total partisinya dan memulai dari awal lagi.

Bersambung… (cerita migrasi foto)

Menulis Blog dengan Bantuan AI

Beberapa tulisan blog saya terakhir ini dibantu oleh AI, terutama yang berkaitan dengan proses saya experiment dengan mikrokontroller seperti ESP dan Arduino. Tulisan yang bersifat step by step atau tutorial sangat terbantu dengan bantuan AI ini.

Mungkin jadi kurang original tetapi masih terbaca natural. Tentu saja tidak copy paste secara keseluruhan. Pasti ada bagian-bagian yang perlu diparafrase ulang.

Dalam kasus saya experiment dengan mikrokontroller, biasanya saya mengerjakan dulu experiment nya, kemudian saya tulis blog nya sebegai dokumentasi.

Saya tinggal tuliskan beberapa poin yang saya kerjakan dan minta AI untuk menuliskan dalam bentu blog. Walaupun hanya poin, ternyata AI bisa menceritakan lebih detail dan memang sesuai dengan apa yang saya kerjakan.

Bisa jadi AI juga mempelajari dari prompt yang saya tulis sebelumnya, sehingga dia juga memahami apa saja yang saya kerjakan. Sehinga ketika diminta menceritakan lagi experimen yang saya kerjakan, dia bener-bener bisa menceritakan dengan gamblang.

Luar biasa perkembangan AI. Entah seperti apa perkembangan beberapa tahun kedepan. Manusia perlu beradaptasi dengan semua teknologi ini.

Menampilkan Halaman HTML dari File Terpisah di ESP8266/ESP32

Dalam proyek ESP8266 Web Server, sering kali kita perlu menampilkan halaman web dengan HTML, CSS, dan JavaScript agar tampilannya lebih menarik dan interaktif. Alih-alih menulis kode HTML langsung di dalam kode Arduino, kita bisa menyimpan file terpisah menggunakan SPIFFS (SPI Flash File System) atau LittleFS. Dengan cara ini, struktur proyek menjadi lebih rapi dan modular.

Pada blog ini, kita akan membahas:

Mengapa menyimpan HTML di file terpisah lebih baik?
Cara menyimpan dan menampilkan file HTML dari ESP
Kode contoh untuk membaca file HTML dari SPIFFS/LittleFS

Mengapa Menyimpan HTML di File Terpisah?

Memudahkan pengeditan – Kamu bisa mengubah tampilan tanpa perlu memodifikasi kode firmware.
Menghemat memori program – HTML disimpan di SPIFFS/LittleFS, bukan di flash yang digunakan oleh program utama.
Lebih rapi dan modular – Bisa memisahkan file CSS, JavaScript, dan HTML seperti dalam aplikasi web normal.

Struktur File Proyek

Sebelum mulai coding, kita buat struktur folder seperti ini:

/ESP8266_WebServer
│── data/                → Folder untuk menyimpan file web
│   ├── index.html       → Halaman utama
│   ├── style.css        → Styling halaman
│   ├── script.js        → JavaScript untuk interaksi
│── ESP8266_WebServer.ino → Kode utama untuk ESP8266

Folder data/ akan digunakan oleh SPIFFS atau LittleFS untuk menyimpan file HTML.

Kode ESP8266/ESP32 untuk Membaca HTML dari SPIFFS/LittleFS

#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>

const char* ssid = "SSID";
const char* password = "PASSWORD";
AsyncWebServer server(80);

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) delay(500);

    SPIFFS.begin();
    
    // Menyajikan file HTML, CSS, dan JS dari SPIFFS
    server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/index.html", "text/html");
    });
    server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/style.css", "text/css");
    });
    server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request) {
        request->send(SPIFFS, "/script.js", "application/javascript");
    });

    server.begin();
}

void loop() {}

Upload File ke SPIFFS

  1. Buka Arduino IDE
  2. Instal plugin “ESP8266/ESP32 SPIFFS uploader”
  3. Buka “Tools > ESP8266 Sketch Data Upload”
  4. File HTML, CSS, dan JS akan diunggah ke SPIFFS!

Kesimpulan

✔ Menggunakan SPIFFS atau LittleFS memungkinkan penyimpanan file HTML secara terpisah di ESP.
✔ Metode ini mempermudah pengeditan dan menghemat memori program utama.
✔ Dapat dikembangkan lebih lanjut dengan AJAX atau WebSocket untuk membuat tampilan lebih dinamis.

Cara Memecah Kode Arduino Menjadi Beberapa File

Jika kamu pernah mengembangkan proyek Arduino atau ESP, kamu mungkin sering menghadapi kode yang semakin panjang dan sulit dibaca. Salah satu cara terbaik untuk mengelola proyek dengan lebih baik adalah menggunakan modular programming, yaitu memisahkan kode ke beberapa file.

Dalam artikel ini, kita akan membahas bagaimana cara membuat kode terstruktur untuk menyalakan LED menggunakan Arduino, dengan pendekatan modular coding.

Mengapa Modular Programming?

Membuat kode lebih rapi – Dengan memisahkan kode menjadi beberapa file, setiap bagian dari program menjadi lebih jelas dan mudah dimengerti.
Memudahkan penggunaan ulang – Kamu dapat menggunakan kembali modul tanpa harus menulis ulang seluruh kode.
Mempermudah debugging – Jika terjadi kesalahan, kamu bisa lebih mudah menemukannya tanpa harus mencari di file yang panjang.

Struktur Proyek Arduino dengan Modular Coding

Sebelum mulai coding, kita buat struktur folder seperti ini:

/modular_led
│── modular_led.ino   → Kode utama
│── led.h             → Header LED
│── led.cpp           → Implementasi LED

Di sini, kita akan membuat tiga file utama:

  1. led.h → Deklarasi fungsi dan kelas untuk kontrol LED.
  2. led.cpp → Implementasi fungsi LED.
  3. main.ino → Kode utama yang mengontrol bagaimana LED bekerja.

Membuat Modul LED

1. File led.h (Header untuk LED)

File led.h berisi deklarasi kelas dan fungsi yang kita gunakan:

#ifndef LED_H
#define LED_H

#include <Arduino.h>

class LED {
public:
    LED(int pin);  // Konstruktor
    void begin();  // Inisialisasi LED
    void turnOn(); // Menyalakan LED
    void turnOff(); // Mematikan LED

private:
    int ledPin; // Menyimpan pin LED
};

#endif

Menggunakan kelas LED untuk mengelola fungsi LED dengan lebih efisien.
Menentukan metode begin() untuk inisialisasi, turnOn() untuk menyalakan, dan turnOff() untuk mematikan LED.

2. File led.cpp (Implementasi LED)

Berisi kode implementasi untuk setiap fungsi yang ada di led.h:

#include "led.h"

LED::LED(int pin) {
    ledPin = pin;
}

void LED::begin() {
    pinMode(ledPin, OUTPUT);
}

void LED::turnOn() {
    digitalWrite(ledPin, HIGH);
}

void LED::turnOff() {
    digitalWrite(ledPin, LOW);
}

Fungsi begin() mengatur pin sebagai output, sehingga LED bisa dikontrol.
Metode turnOn() dan turnOff() mengontrol status LED secara langsung.

3. File modular_led.ino (Kode Utama)

Terakhir, kita tuliskan kode utama yang akan menjalankan program:

#include "led.h"

LED led(13);  // Gunakan pin 13 untuk LED

void setup() {
    led.begin();
}

void loop() {
    led.turnOn();
    delay(1000);
    led.turnOff();
    delay(1000);
}

Memanggil kelas LED dengan LED led(13); untuk mengontrol LED di pin 13.
Menyalakan dan mematikan LED setiap 1 detik dengan delay(1000);.

Cara Menjalankan Kode

  1. Pastikan semua file (led.h, led.cpp, maodular_led.ino) berada dalam folder yang sama.
  2. Buka modular_led.ino di Arduino IDE atau PlatformIO.
  3. Upload ke board Arduino, dan lihat LED berkedip setiap 1 detik.

Kesimpulan

✔ Modular programming membantu membuat kode lebih terstruktur, mudah dibaca, dan mudah digunakan kembali.
✔ Dengan memisahkan fungsi LED ke dalam kelas dan file terpisah, program menjadi lebih rapi dan efisien.
✔ Teknik ini bisa digunakan untuk proyek yang lebih kompleks, seperti sensor, komunikasi serial, atau sistem berbasis IoT.

Pengalaman Membaca PZEM-017 dengan ESP WeMos D1 Mini

Sebagai seseorang yang sedang belajar mendalami teknologi IoT dan integrasi sensor, saya menghadapi berbagai tantangan saat mencoba membaca data dari PZEM-017 menggunakan ESP8266 WeMos D1 Mini. Meskipun awalnya tampak seperti proses sederhana, ternyata ada berbagai hambatan teknis yang perlu diatasi. Berikut adalah perjalanan saya dalam menyelesaikan masalah yang muncul hingga akhirnya sistem berjalan dengan stabil.

1. Kendala Awal: Label PCB dalam Bahasa Mandarin

Saat pertama kali menerima modul PZEM-017, saya dihadapkan pada tantangan yang tidak terduga—label pada PCB menggunakan Bahasa Mandarin.

Hal ini tentu menyulitkan dalam menentukan koneksi yang benar. Saya kemudian mencari referensi dari berbagai sumber, membandingkan dengan modul serupa, dan melakukan verifikasi menggunakan multimeter untuk memastikan koneksi TX, RX, VCC, dan GND sudah sesuai.

Bagi yang mengalami kendala serupa, saya menyarankan untuk mencari diagram koneksi atau datasheet resmi agar mendapatkan kejelasan mengenai pengkabelan.

2. LED TX & RX Tidak Menyala: Masalah pada Kabel Jumper

Setelah memahami koneksi, saya segera melakukan penyambungan dan menyalakan sistem. Namun, LED TX dan RX tidak menyala sama sekali.

Awalnya saya menduga adanya kesalahan konfigurasi atau kerusakan pada modul RS485 to TTL, tetapi setelah melakukan pengecekan menyeluruh, ternyata penyebabnya adalah kabel jumper dengan kualitas kurang baik. Padahal, kabel yang sama telah digunakan untuk eksperimen lain tanpa kendala.

Solusi yang saya temukan cukup sederhana—mengganti kabel jumper dengan kualitas lebih baik dan memastikan koneksi benar-benar kuat. Setelah perbaikan tersebut, LED TX dan RX akhirnya dapat berfungsi dengan normal.

3. Data Terbaca di Serial Monitor, tetapi Tidak Stabil

Setelah berhasil membaca data tegangan, arus, daya, dan energi melalui Serial Monitor, saya mendapati bahwa pembacaan kadang terbaca dengan baik, namun kadang terjadi error tanpa alasan jelas.

Awalnya saya mengira masalah ini berkaitan dengan kode atau pengaturan baud rate, namun setelah berbagai percobaan, saya mencoba mengganti power supply dari 3V ke 5V—dan hasilnya pembacaan menjadi stabil tanpa error.

Kesimpulan dari permasalahan ini adalah bahwa tegangan suplai harus cukup agar komunikasi antara perangkat dapat berjalan dengan baik.

4. LED TX Menyala Terus tetapi Redup: Masalah Grounding

Setelah sistem berjalan dalam beberapa waktu, muncul tantangan baru—LED TX tidak lagi berkedip sesuai sinyal, melainkan menyala terus dalam kondisi redup.

Ketika saya memeriksa Serial Monitor, ternyata terjadi error lagi. Setelah melakukan analisis, saya menemukan penyebab utama masalah ini: ground dari ESP8266 dan RS485 converter tidak terhubung dengan baik.

Setelah menghubungkan ground ESP ke ground RS485, sistem kembali berfungsi secara normal, dan pembacaan data tidak mengalami gangguan lagi.

5. Pengujian Stabilitas: Berjalan Tanpa Masalah Setelah Ditinggalkan Semalaman

Setelah menyelesaikan seluruh troubleshooting, saya memutuskan untuk membiarkan sistem menyala semalaman guna memastikan kestabilannya. Keesokan harinya, saya memeriksa kembali dan sistem berjalan dengan sempurna tanpa kendala.

Dari pengalaman ini, saya dapat menyimpulkan beberapa hal penting:
Pastikan koneksi perangkat sesuai dengan diagram yang benar, terutama jika terdapat label asing pada PCB.
Gunakan kabel jumper dengan kualitas baik, karena koneksi yang buruk bisa menghambat komunikasi data.
Power supply yang cukup sangat krusial, terutama untuk perangkat komunikasi seperti RS485.
Pastikan ground terhubung dengan baik untuk menghindari gangguan sinyal dan komunikasi.

Pengalaman ini menunjukkan bahwa trial & error adalah bagian penting dalam eksplorasi teknologi, dan setiap tantangan dapat diselesaikan dengan pendekatan yang sistematis. Semoga pengalaman ini dapat membantu bagi siapa pun yang menghadapi kendala serupa!