# Elemes - Panduan Guru **Elemes** adalah Learning Management System (LMS) untuk mengajar pemrograman atau elektronika. Guru cukup menyiapkan file konfigurasi dan konten materi dalam format Markdown, lalu menjalankan container untuk deploy. ## Struktur Folder Setelah setup, struktur folder utama (parent folder) akan terlihat seperti ini: ``` project/ ├── .env # Konfigurasi environment ├── content/ # Folder materi pelajaran (file .md) │ ├── home.md # Halaman utama & daftar pelajaran │ ├── hello_world.md # Contoh materi │ └── ... ├── assets/ # Gambar untuk materi (opsional) │ └── gambar.png ├── tokens_siswa.csv # Data token siswa (auto-generated) ├── state/ # State Tailscale (auto-generated) └── elemes/ # Folder engine LMS (JANGAN DIUBAH) ├── elemes.sh # Script untuk menjalankan LMS └── ... ``` ## Quick Start ```bash cd elemes ./elemes.sh init # Generate .env, content/, dan tokens dari contoh ``` Output: ``` === Elemes Quick Start === [buat] .env (edit sesuai kebutuhan) [buat] content/ (4 materi) [buat] tokens_siswa.csv (edit untuk tambah siswa) Selesai! Langkah selanjutnya: 1. Edit ../.env sesuai kebutuhan 2. Edit ../content/home.md untuk daftar materi 3. Edit ../tokens_siswa.csv untuk data siswa 4. Jalankan: ./elemes.sh runbuild ``` Perintah `init` aman dijalankan ulang — file yang sudah ada tidak akan ditimpa. ### 1. Edit `.env` Sesuaikan `.env` di parent folder: ```env # Identitas LMS (tampil di frontend) APP_BAR_TITLE=Pemrograman C - SMK Nusantara COPYRIGHT_TEXT=SMK Nusantara @ 2025 PAGE_TITLE_SUFFIX=SMK Nusantara # Lokasi file CONTENT_DIR=content TOKENS_FILE=tokens.csv # Tailscale (opsional, untuk akses remote) ELEMES_HOST=lms-smk-nusantara TS_AUTHKEY=tskey-auth-xxxx ``` ### 2. Edit Konten ### 3. Buat `home.md` (Halaman Utama) File `content/home.md` adalah halaman utama LMS. Di sinilah guru mendefinisikan judul sambutan dan **daftar pelajaran yang tersedia**. Contoh `content/home.md`: ```markdown ## Selamat Datang di Kelas Pemrograman C Situs LMS ini untuk belajar dasar-dasar pemrograman C. ## Topik yang Akan Dipelajari 1. [Hello, World!](lesson/hello_world.md) 2. [Variables](lesson/variables.md) 3. [Conditions](lesson/conditions.md) ----Available_Lessons---- 1. [Hello, World!](lesson/hello_world.md) 2. [Variables](lesson/variables.md) 3. [Conditions](lesson/conditions.md) ``` > **Penting:** Bagian setelah `----Available_Lessons----` adalah daftar pelajaran > yang dikenali sistem. Pastikan setiap materi yang ada di folder `content/` > terdaftar di sini. ### 4. Buat Materi Pelajaran Setiap file `.md` di folder `content/` adalah satu materi pelajaran. Format dasar materi: ```markdown ---LESSON_INFO--- **Learning Objectives:** - Tujuan pembelajaran 1 - Tujuan pembelajaran 2 **Prerequisites:** - Materi prasyarat (atau "Tidak ada") ---END_LESSON_INFO--- # Judul Materi Penjelasan materi di sini. Gunakan format Markdown biasa. Contoh kode bisa ditulis dalam code block: ` ` `c #include int main() { printf("Hello, World!\n"); return 0; } ` ` ` ---EXERCISE--- ### Latihan Buat program yang mencetak "Hello, World!" --- ---INITIAL_CODE--- #include int main() { // Tulis kode kamu di sini return 0; } ---END_INITIAL_CODE--- ---EXPECTED_OUTPUT--- Hello, World! ---END_EXPECTED_OUTPUT--- ---KEY_TEXT--- printf ---END_KEY_TEXT--- ``` #### Penjelasan Blok-Blok Khusus | Blok | Fungsi | |------|--------| | `---LESSON_INFO---` | Info pelajaran: tujuan & prasyarat | | `---EXERCISE---` | Deskripsi latihan soal | | `---INITIAL_CODE---` | Kode awal yang muncul di editor siswa | | `---EXPECTED_OUTPUT---` | Output yang diharapkan untuk validasi jawaban | | `---KEY_TEXT---` | Kata kunci yang harus ada di kode siswa | #### Blok Khusus Circuit (Opsional) Untuk materi yang melibatkan simulator rangkaian elektronika: | Blok | Fungsi | |------|--------| | `` ```circuit `` | Rangkaian yang ditampilkan di materi | | `---INITIAL_CIRCUIT---` | Rangkaian awal untuk latihan | | `---EXPECTED_CIRCUIT_OUTPUT---` | Validasi rangkaian (format JSON) | | `---KEY_TEXT_CIRCUIT---` | Kata kunci rangkaian | #### Blok Khusus Arduino/Velxio Untuk materi yang menggunakan simulator Arduino (Velxio): | Blok | Fungsi | |------|--------| | `---INITIAL_CODE_ARDUINO---` | Kode Arduino awal di editor Velxio | | `---VELXIO_CIRCUIT---` | Rangkaian komponen (JSON: board, components, wires) | | `---EXPECTED_SERIAL_OUTPUT---` | Output serial yang diharapkan (subsequence match) | | `---EXPECTED_WIRING---` | Wiring yang harus dibuat siswa (JSON, lenient) | | `---KEY_TEXT---` | Kata kunci yang harus ada di kode siswa | Contoh materi Arduino: ```markdown ---INITIAL_CODE_ARDUINO--- void setup() { pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(13, HIGH); Serial.println("LED ON"); delay(1000); digitalWrite(13, LOW); Serial.println("LED OFF"); delay(1000); } ---END_INITIAL_CODE_ARDUINO--- ---VELXIO_CIRCUIT--- { "board": "arduino:avr:uno", "components": [ { "type": "wokwi-led", "id": "led-1", "x": 400, "y": -200, "props": { "color": "red", "pin": 13 } } ], "wires": [] } ---END_VELXIO_CIRCUIT--- ---EXPECTED_SERIAL_OUTPUT--- LED ON LED OFF ---END_EXPECTED_SERIAL_OUTPUT--- ---EXPECTED_WIRING--- { "wires": [ { "start": { "componentId": "arduino-uno", "pinName": "13" }, "end": { "componentId": "led-1", "pinName": "A" } }, { "start": { "componentId": "led-1", "pinName": "C" }, "end": { "componentId": "arduino-uno", "pinName": "GND" } } ] } ---END_EXPECTED_WIRING--- ---KEY_TEXT--- pinMode digitalWrite ---END_KEY_TEXT--- ``` ##### Referensi Nama Pin Komponen Velxio | Komponen | Tipe Wokwi | Pin Names | |----------|------------|----------| | Arduino Uno | `wokwi-arduino-uno` | `0`-`13`, `A0`-`A5`, `GND`, `5V`, `3.3V` | | LED | `wokwi-led` | `A` (Anode), `C` (Cathode) | | Push Button | `wokwi-pushbutton` | `1.l`, `2.l`, `1.r`, `2.r` | | Resistor | `wokwi-resistor` | `1`, `2` | | RGB LED | `wokwi-rgb-led` | `R`, `G`, `B`, `COM` | > **Penting:** Nama pin harus **persis** seperti tabel di atas. > `componentId` untuk Arduino Uno selalu `arduino-uno` (huruf kecil, dengan strip). ##### Evaluasi Arduino Sistem mengevaluasi 3 aspek (semua harus lulus): 1. **Key Text** — kata kunci wajib ada di source code siswa 2. **Serial Output** — baris yang diharapkan harus muncul dalam urutan (subsequence match) 3. **Wiring** — koneksi yang diharapkan harus ada (lenient: extra wires OK, GND.1/GND.2 dinormalisasi) ### 5. Generate Token Siswa Setelah materi siap, generate file `tokens_siswa.csv`: ```bash cd elemes ./elemes.sh generatetoken ``` File `tokens_siswa.csv` akan dibuat di parent folder. Edit file ini untuk menambahkan siswa: ```csv token;nama_siswa;hello_world;variables;conditions TOKEN_GURU_001;Pak Guru;not_started;not_started;not_started TOKEN_SISWA_001;Budi Santoso;not_started;not_started;not_started TOKEN_SISWA_002;Siti Aminah;not_started;not_started;not_started ``` > **Catatan:** > - Kolom dipisahkan dengan **titik koma** (`;`), bukan koma. > - Baris **pertama data** (setelah header) dianggap sebagai **token guru**. > - Token bisa berupa string apa saja yang unik per siswa. > - File ini bisa diedit menggunakan spreadsheet (LibreOffice Calc, Excel). > Saat membuka di Excel/Calc, pilih delimiter **titik koma**. ### 6. (Opsional) Tambahkan Gambar Letakkan gambar di folder `assets/` di parent folder. Referensi di materi menggunakan: ```markdown ![deskripsi](assets/nama_gambar.png) ``` ### 7. Jalankan LMS ```bash cd elemes # Build dan jalankan (pertama kali atau setelah update) ./elemes.sh runbuild # Jalankan tanpa build ulang ./elemes.sh run # Stop ./elemes.sh stop ``` LMS akan berjalan dan bisa diakses melalui Tailscale (jika dikonfigurasi) atau langsung di `http://localhost:3000`. ## Perintah `elemes.sh` | Perintah | Fungsi | |----------|--------| | `./elemes.sh init` | Setup awal: generate `.env`, `content/`, `tokens_siswa.csv` dari contoh | | `./elemes.sh run` | Jalankan container | | `./elemes.sh runbuild` | Build ulang & jalankan container | | `./elemes.sh stop` | Hentikan container | | `./elemes.sh generatetoken` | Generate/update `tokens_siswa.csv` | ## Contoh Siap Pakai Folder `examples/` berisi contoh lengkap yang digunakan oleh `./elemes.sh init`: ``` examples/ ├── content/ │ ├── home.md # Halaman utama (7 materi) │ ├── hello_world.md # Materi dasar: Hello World │ ├── variabel.md # Materi dasar: Variabel │ ├── rangkaian_dasar.md # Materi hybrid: C + Circuit │ ├── led_blink_arduino.md # Arduino: LED Blink + wiring │ ├── hello_serial_arduino.md # Arduino: Serial Monitor (tanpa wiring) │ ├── button_input_arduino.md # Arduino: Button + LED input/output │ └── traffic_light_arduino.md # Arduino: Lampu lalu lintas 3 LED └── tokens_siswa.csv # Data siswa contoh (1 guru + 3 siswa) ``` ### Jenis Materi | Tipe | Contoh | Evaluasi | |------|--------|----------| | **C/Python** | `hello_world.md`, `variabel.md` | Output stdout | | **Hybrid** | `rangkaian_dasar.md` | C output + node voltage | | **Arduino (Velxio)** | `led_blink_arduino.md` | Key text + serial + wiring | | **Arduino (tanpa wiring)** | `hello_serial_arduino.md` | Key text + serial | ## FAQ **Q: Bagaimana menambah materi baru?** Buat file `.md` baru di `content/`, lalu tambahkan link-nya di `content/home.md` (di bagian daftar topik DAN bagian `----Available_Lessons----`). Jalankan `./elemes.sh generatetoken` untuk update kolom di CSV. **Q: Bagaimana menambah siswa baru?** Edit `tokens_siswa.csv`, tambahkan baris baru dengan token unik dan nama siswa. Kolom pelajaran diisi `not_started`. **Q: Siswa lupa token-nya?** Buka file `tokens_siswa.csv` dan cari nama siswa untuk melihat token-nya. **Q: Bagaimana melihat progress siswa?** Login menggunakan token guru (baris pertama di CSV). Dashboard progress akan otomatis muncul. **Q: Apakah harus pakai Tailscale?** Tidak. Tailscale opsional untuk akses remote. Tanpa Tailscale, LMS bisa diakses di jaringan lokal via `http://localhost:3000`. **Q: Bagaimana membuat materi Arduino baru?** Buat file `.md` baru di `content/` dengan blok `---INITIAL_CODE_ARDUINO---` dan `---VELXIO_CIRCUIT---`. Lihat contoh di `led_blink_arduino.md` atau `button_input_arduino.md`. Pastikan `componentId` dan `pinName` di `EXPECTED_WIRING` sesuai dengan tabel referensi pin di atas. **Q: Materi Arduino bisa tanpa wiring?** Ya. Jika hanya ingin evaluasi kode + serial output, cukup sertakan `VELXIO_CIRCUIT` dengan `components: []` kosong dan hilangkan blok `EXPECTED_WIRING`. Contoh: `hello_serial_arduino.md`. **Q: Apakah wiring harus persis sama?** Tidak harus. Evaluasi bersifat *lenient*: koneksi yang diharapkan harus ada, tapi siswa boleh menambahkan kabel ekstra. Pin GND juga dinormalisasi (GND.1 = GND.2 = GND). ## Persyaratan Sistem - [Podman](https://podman.io/) dan `podman-compose` - Python 3 (untuk `generatetoken`) - Koneksi internet (saat build pertama kali untuk download image)