Menyiapkan Advantech UNO-220 sebagai Edge Device Industri
UNO‑220 siap beroperasi sebagai edge device industri: Node‑RED untuk automasi & dashboard lokal, Rapid SCADA 6.4.3 untuk trending historis, ZeroTier untuk konektivitas aman, serta hardening + backup rutin agar sistem modular, audit‑ready, dan andal.
1. Pendahuluan
Dokumentasi ini menyajikan panduan lengkap untuk menyiapkan Advantech UNO-220-P4N2AE — sebuah industrial gateway kit (chassis + HAT I/O) yang dirancang untuk dipasangi Raspberry Pi 4 Model B — agar siap berfungsi sebagai edge device industri.
Panduan ini dirancang untuk memastikan UNO‑220 mampu:
- Beroperasi secara mandiri di lapangan, tanpa ketergantungan pada infrastruktur tambahan,
- Terhubung aman ke server pusat melalui jaringan terenkripsi,
- Menjalankan fungsi pengolahan data real‑time sekaligus visualisasi menggunakan Node‑RED (v4.x dengan Node.js v22 LTS) dan Rapid SCADA 6.4.3.
(Modbus RTU)"]:::legacy subgraph Integrasi direction LR B["Modbus Gateway"]:::gateway C["Node-RED"]:::nodered D["Rapid SCADA"]:::scada E["SCADA Grafana Proxy"]:::proxy end F["OS & Hardening"]:::os G["Backup & Recovery"]:::backup H["Deployment"]:::deploy I["ZeroTier"]:::network J["Server Integrasi"]:::server A --> B B --> C --> I B --> D --> E Integrasi --> F --> G --> H --> Integrasi E --> I --> J classDef legacy fill:#efefef,stroke:#999,stroke-width:2px,color:#000 classDef hardware fill:#f4cccc,stroke:#cc0000,stroke-width:2px,color:#000 classDef os fill:#cfe2f3,stroke:#1155cc,stroke-width:2px,color:#000 classDef nodered fill:#d9ead3,stroke:#38761d,stroke-width:2px,color:#000 classDef scada fill:#fff2cc,stroke:#bf9000,stroke-width:2px,color:#000 classDef proxy fill:#ead1dc,stroke:#741b47,stroke-width:2px,color:#000,stroke-dasharray:4 3 classDef gateway fill:#e2efd9,stroke:#274e13,stroke-width:2px,color:#000,stroke-dasharray:4 3 classDef network fill:#d0e0e3,stroke:#134f5c,stroke-width:2px,color:#000 classDef backup fill:#e6e6e6,stroke:#666666,stroke-width:2px,color:#000 classDef deploy fill:#fce5cd,stroke:#e69138,stroke-width:2px,color:#000 classDef server fill:#d9d2e9,stroke:#351c75,stroke-width:2px,color:#000
Seluruh tahapan — mulai dari aktivasi fitur perangkat keras, penguatan keamanan sistem operasi, hingga instalasi perangkat lunak produksi — telah digabungkan dalam satu dokumen terpadu. Dengan demikian, panduan ini dapat dijadikan standar operasional untuk deployment UNO‑220 di lingkungan industri, tanpa perlu merujuk ke dokumen eksternal tambahan.
2. Persiapan Perangkat
2.1 Perangkat Keras
| Komponen | Spesifikasi / Catatan | Alasan / Risiko |
|---|---|---|
| Main Unit | Advantech UNO‑220 (kit untuk Raspberry Pi 4 Model B, IP40, varian P4N2AE mendukung PoE) | Form factor industri, rugged, siap dipasang di panel; casing melindungi dari debu & getaran. |
| Media Penyimpanan | MicroSD industrial‑grade ≥ 32 GB. Pilih model dengan endurance pSLC/SLC, PLP/ECC bila tersedia. | Endurance tinggi, tahan suhu ekstrem, mencegah korupsi data akibat siklus tulis intensif. |
| Catu Daya | 12–24 VDC atau PoE (802.3at/PoE+ bila beban tinggi). Rencanakan margin 20–30% di atas beban terukur. | Konsumsi bergantung konfigurasi (model RPi4, addon USB/serial, beban CPU). |
| RTC | Epson RX‑8010SJ‑B (dengan battery backup) | Menjamin timestamp akurat meski tanpa NTP; penting untuk audit log & histori data. |
| I/O Expander | TI TCA9554 (alamat I²C 0x27) | Menambah GPIO untuk kontrol/monitoring eksternal. |
| TPM | Infineon OPTIGA TPM SLB9670 | Mendukung secure boot, enkripsi, integritas sistem. |
| Jaringan | Ethernet LAN (1 GbE) untuk konfigurasi awal; ZeroTier untuk manajemen jarak jauh. | Ethernet stabil untuk setup awal; ZeroTier memberi VPN overlay aman tanpa port publik. |
2.2 Perangkat Lunak
- Ubuntu Server arm64 terbaru (contoh: 25.10 dengan kernel 6.17+ saat penulisan).
Untuk commissioning/testing gunakan rilis interim; untuk produksi gunakan rilis LTS (24.04 LTS yang tersedia, atau 26.04 LTS setelah rilis stabil pada 23 April 2026). - Tool flashing: Raspberry Pi Imager atau Balena Etcher → tulis image OS ke microSD.
- Akses jaringan & SSH dari komputer host → konfigurasi awal headless (tanpa monitor/keyboard).
Referensi tambahan: periksa juga panduan resmi Ubuntu untuk Raspberry Pi untuk memastikan image, kernel, dan metode flashing sesuai dengan rilis terbaru.
Upgrade ke Ubuntu 26.04 LTS
Setelah rilis stabil tersedia (sudo do-release-upgrade -c):
- Backup penuh sistem (lihat Bab 11) dan uji di staging.
- Update paket:
sudo apt update && sudo apt full-upgrade. - Pastikan tool upgrade:
sudo apt install update-manager-core. - Jalankan upgrade:
sudo do-release-upgrade→ konfirmasi. - Reboot, lalu verifikasi:
lsb_release -a(versi Ubuntu)uname -r(kernel ARM64)- test service (Node‑RED, ZeroTier, Rapid SCADA).
Catatan: Hindari opsi -d (development). Tunggu path resmi Canonical agar kernel & driver ARM64 tetap kompatibel dengan UNO‑220.
2.3 Struktur Deployment (Timeline 5 Hari)
Untuk memastikan proses commissioning berjalan konsisten dan dapat diaudit, berikut struktur deployment UNO‑220 selama 5 hari. Setiap langkah telah disusun agar modular, dapat direplikasi, dan mendukung validasi bertahap.
3. Instalasi Ubuntu Server 25.10
Rekomendasi Spesifikasi microSD Industrial‑Grade
| Parameter | Nilai Minimum |
|---|---|
| Kelas Speed | Class 10 / UHS‑I |
| Kapasitas | ≥ 32 GB |
| NAND Type | pSLC / Industrial SLC |
| Operating Temp. | ‑40°C hingga +85°C |
| Endurance | ≥ 30K write cycles, Power-Loss Protection (PLP) atau ECC |
| Brand | Transcend Industrial, Swissbit, Apacer Industrial, Innodisk |
Langkah Instalasi
-
Unduh image OS
Ambil image Ubuntu Server 25.10 (arm64) dari situs resmi Ubuntu. -
Tulis image ke microSD
Gunakan Raspberry Pi Imager atau Balena Etcher. -
Aktifkan SSH
Setelah flashing selesai, mount partisibootlalu buat file kosong bernamassh:touch /media/<user>/boot/ssh -
Pasang microSD & hubungkan perangkat
Masukkan microSD ke UNO‑220, hubungkan kabel Ethernet dan catu daya. -
Temukan alamat IP
- Via router/DHCP lease
- Atau gunakan:
sudo nmap -sn 192.168.1.0/24
-
Login pertama via SSH
ssh ubuntu@<ip_address>Password default:
ubuntu(akan diminta ganti saat login pertama). -
Set zona waktu
Pilih sesuai lokasi operasional:Wilayah Zona Waktu Pilihan Sumatra, Jawa, Kalimantan Barat/Tengah WIB (UTC+7) Asia/Jakarta Bali, Nusa Tenggara, Kalimantan Selatan/Timur WITA (UTC+8) Asia/Makassar Maluku, Papua WIT (UTC+9) Asia/Jayapura Contoh:
sudo timedatectl set-timezone Asia/Jakarta timedatectl status -
Update sistem
sudo apt update && sudo apt upgrade -y sudo apt autoremove -y && sudo apt clean
Troubleshooting
- IP tidak terdeteksi → gunakan
arp -aataunmapuntuk scanning subnet. - SSH gagal → pastikan file
sshada di partisi boot, atau gunakan monitor + keyboard sementara. - MicroSD lambat → uji dengan:
sudo hdparm -tT /dev/mmcblk0
4. Aktivasi Fitur Hardware UNO-220
Sebelum mengaktifkan fitur hardware UNO-220, pastikan sistem memiliki paket dasar untuk kompilasi dan pengambilan kode sumber. Jalankan perintah berikut untuk menginstal semua dependensi penting:
sudo apt update
sudo apt install -y build-essential git curl device-tree-compiler
Kloning terlebih dahulu repository yang berisi berkas device tree overlay untuk hardware UNO-220:
git clone --depth=1 https://github.com/kumajaya/uno-220-poe.git
cd uno-220-poe
4.1 Kompilasi Semua Overlay
Compile kedua overlay secara berurutan:
sudo dtc -@ -I dts -O dtb dts/i2c-rtc-overlay.dts -o /boot/firmware/current/overlays/i2c-rtc-mod.dtbo
sudo dtc -@ -I dts -O dtb dts/tpm-slb9670-overlay.dts -o /boot/firmware/current/overlays/tpm-slb9670-mod.dtbo
I/O Expander TCA9554 gunakan overlay standar
pca953x.
Verifikasi:
ls /boot/firmware/current/overlays/ | grep -E 'i2c-rtc-mod|tpm-slb9670-mod'
4.2 Update config.txt
Catatan: Editor teks
nanodigunakan untuk mengedit file konfigurasi di terminal.
- Gunakan panah arah untuk berpindah baris.
- Tekan Ctrl + O untuk menyimpan, lalu Enter, dan Ctrl + X untuk keluar.
Edit /boot/firmware/config.txt:
sudo nano /boot/firmware/config.txt
Tambahkan baris-baris ini di akhir file:
# RTC Epson RX-8010
dtoverlay=i2c-rtc-mod,rx8010
# TI TCA9554
dtoverlay=pca953x,addr=0x27
# Infineon TPM SLB9670
dtoverlay=tpm-slb9670-mod,cs=0x00
Simpan, lalu reboot:
sudo reboot
4.3 Uji RTC (Epson RX-8010SJ-B)
sudo apt install util-linux-extra -y
sudo hwclock -r --verbose
sudo hwclock -w --verbose
timedatectl status
4.4 Uji I/O Expander (TI TCA9554)
Uji (hubungkan kabel dari GPIO 0 ke 1 untuk loopback):
sudo apt install gpiod -y
gpiodetect
gpioinfo
gpioset 2 0=0 && gpioget 2 1 # Off
gpioset 2 0=1 && gpioget 2 1 # On
Note: Jika ingin mengakses TCA9554 langsung dari Node-RED menggunakan node-red-contrib-tca9554, pastikan driver kernel gpio_pca953x tidak aktif.
- Untuk akses sementara:
sudo modprobe -r gpio_pca953x - Untuk menonaktifkan permanen, tambahkan tanda
#di depan barisdtoverlay=pca953x,addr=0x27pada/boot/firmware/config.txt.
4.5 Uji Trusted Platform Module (SLB9670)
sudo apt install tpm2-tools -y
tpm2_getrandom 8 | xxd -p
tpm2_getrandom 16 | xxd -p
tpm2_getrandom 32 | xxd -p
4.6 GPIO & LED PL1
Untuk dapat mengendalikan PL1 GPIO LED di UNO‑220 dibutuhkan kombinasi konfigurasi udev rules + dependensi Python agar Node‑RED dapat melakukan akses GPIO tanpa hak root.
-
Tambahkan aturan udev di
/etc/udev/rules.d/45-gpio.rules:KERNEL=="gpiochip*", GROUP="gpio", MODE="0660" KERNEL=="gpiomem", GROUP="gpio", MODE="0660"Reload rules:
sudo udevadm control --reload-rules && sudo udevadm trigger -
Tambahkan user ke grup
gpio:sudo usermod -aG gpio ubuntu -
Install dependensi Python untuk Node‑RED GPIO node:
sudo apt install python3-rpi.gpio -y # Untuk Node-RED GPIO
LED PL1 (GPIO12, pin 32 pada header Raspberry Pi, terhubung ke gpiochip0) dapat dikendalikan via Node‑RED node rpi-gpio out.
Pengujian manual dapat dilakukan dengan perintah:
gpioset 0 12=1 # LED ON
gpioset 0 12=0 # LED OFF
4.7 Serial Console (RS‑232/RS‑485)
UNO‑220 mendukung koneksi fisik RS‑232 dan RS‑485 yang dipetakan ke /dev/ttyS0. Secara default, /dev/ttyS0 digunakan sebagai console debug oleh kernel. Agar port ini dapat digunakan aplikasi lain (misalnya komunikasi dengan perangkat eksternal atau Modbus RTU, termasuk classic DCS), hapus parameter berikut dari /boot/firmware/cmdline.txt:
console=serial0,115200
Simpan perubahan lalu reboot.
Pengujian koneksi serial:
sudo apt install minicom -y
minicom -D /dev/ttyS0 -b 115200
Troubleshooting Hardware:
- Jika overlay gagal terpasang:
dmesg | grep i2c i2cdetect -y 1 - Setelah melakukan perubahan pada
config.txt, lakukan reboot agar overlay aktif. - Gunakan
ls /boot/firmware/current/overlays/untuk memastikan file.dtbohasil compile tersedia.
5. Instalasi ZeroTier
ZeroTier digunakan untuk menyediakan konektivitas aman antar perangkat tanpa perlu membuka port publik. UNO‑220 akan bergabung ke jaringan virtual ZeroTier dan dapat diakses menggunakan alamat IP internal ZeroTier.
-
Instalasi Paket
curl -s https://install.zerotier.com | sudo bash sudo systemctl enable zerotier-one sudo systemctl start zerotier-oneVerifikasi instalasi:
zerotier-cli infoOutput normal:
200 info <node_id> <version> ONLINE -
Join ke Network
sudo zerotier-cli join <network_id><network_id>adalah ID jaringan yang sudah dibuat di controller (publik atau self‑hosted).- Cek status:
zerotier-cli listnetworks
-
Otorisasi Node
- Jika menggunakan controller publik (
my.zerotier.com): login ke dashboard, pilih network, lalu authorize<node_id>. - Jika menggunakan controller self‑hosted: lakukan otorisasi node melalui web UI atau API controller internal. Pastikan node muncul di daftar anggota network, lalu tandai sebagai authorized.
- Jika menggunakan controller publik (
-
Verifikasi Koneksi
- Cek interface ZeroTier:
ip addr show zt* - Gunakan IP ZeroTier untuk SSH:
ssh ubuntu@<ip_zerotier> - Uji konektivitas antar node:
ping <ip_zerotier_peer>
- Cek interface ZeroTier:
-
Catatan Keamanan
- Gunakan IP ZeroTier untuk remote SSH, bukan IP publik.
- Pastikan firewall
ufw(lihat Bab 10) hanya membuka port yang diperlukan (22, 80, 443, 9993, 1880, 10002, 3000). - ZeroTier menggunakan UDP port 9993; pastikan tidak diblokir di perangkat maupun firewall jaringan.
- Untuk self‑hosted controller, pastikan server controller terlindungi dengan TLS/HTTPS dan hanya dapat diakses oleh admin.
-
Troubleshooting
- Jika join gagal:
journalctl -u zerotier-one -f - Jika node tidak muncul di controller:
- Pastikan network ID benar.
- Pastikan perangkat dapat menjangkau server controller (cek UDP 9993).
- Jika IP ZeroTier tidak muncul:
sudo systemctl restart zerotier-one zerotier-cli listnetworks
- Jika join gagal:
6. Instalasi Node‑RED
-
Update sistem
sudo apt update && sudo apt upgrade -y -
Jalankan installer resmi Node‑RED
Script ini akan menghapus instalasi lama, memasang Node.js sesuai versi yang dipilih, menginstal Node‑RED terbaru, serta menyiapkan service systemd.Pilih Node.js 22 LTS dengan opsi
--node22dan tambahkan opsi--piuntuk sekaligus memasang node khusus Raspberry Pi (GPIO, I²C, dsb.):bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) --confirm-root --node22 --pi -
Aktifkan service
sudo systemctl enable nodered.service sudo systemctl start nodered.service -
Akses editor
Buka browser ke alamat:
http://<ip>:1880
6.1 Amankan Akses Node‑RED
Edit file ~/.node-red/settings.js:
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "<hash>",
permissions: "*"
}]
},
Untuk mengisi nilai <hash> pada konfigurasi settings.js, jalankan perintah berikut:
node-red admin hash-pw
Salin hasil hash ke field password pada konfigurasi adminAuth.
Setelah itu, restart service agar perubahan aktif:
sudo systemctl restart nodered.service
6.2 Aktivasi Logging untuk Monitoring I/O dan Deteksi Error Hardware
Edit ~/.node-red/settings.js untuk mengaktifkan logging detail. Logging ini berguna untuk:
- Monitoring I/O: menangkap event GPIO, I²C expander (TCA9554), dan komunikasi serial.
- Deteksi error hardware: misalnya kegagalan RTC (RX‑8010) atau TPM (SLB9670).
- Audit: mencatat perubahan konfigurasi dan akses API.
logging: {
console: {
// Gunakan "info" untuk operasi normal
// Naikkan ke "debug" saat commissioning
// Gunakan "trace" hanya untuk troubleshooting detail
level: "info", // "debug" untuk detail commissioning, "trace" untuk troubleshooting mendalam
metrics: true, // Log node events (receive/send) dan memory usage (monitoring resource hardware)
audit: true // Log API access untuk melacak perubahan konfigurasi
}
}
Catatan Operasional:
- Metrics: mencatat event inject/receive/send, misalnya perubahan status GPIO expander.
- Memory logs: setiap 15 detik, Node‑RED mencatat heap usage. Berguna untuk mendeteksi potensi overload pada RPi4B ARM64.
- Level rekomendasi:
info→ operasi normal (default).debug→ commissioning, validasi hardware.trace→ troubleshooting detail, gunakan hanya sementara karena log akan sangat besar.
Restart service agar konfigurasi aktif:
sudo systemctl restart nodered.service
Melihat log:
sudo journalctl -u nodered.service -f
# atau
node-red-log
Filter hardware issues:
sudo journalctl -u nodered.service | grep "error\|I/O"
Troubleshooting:
- Jika terjadi error npm terkait memori, jalankan Node‑RED dengan opsi:
node-red-pi --max-old-space-size=512 - Semua log tersimpan di journal systemd, sehingga tetap terintegrasi dengan mekanisme logrotate.
6.3 System Resource Monitoring (CPU Temperature, Memory Usage, CPU Load, Disk Usage, Uptime) dengan Node‑RED
Untuk memantau metrik sistem secara real‑time (CPU Temperature, Memory Usage, CPU Load, Disk Usage, Uptime), kita gunakan exec node di Node‑RED untuk menjalankan perintah Linux, lalu visualisasikan hasilnya di dashboard dan simpan ke file CSV untuk integrasi dengan Rapid SCADA (lihat 7.2).
Threshold alert yang disarankan:
- Temperature > 80 °C
- CPU Load > 2.0 (1‑min average)
- Memory Usage > 80%
- Disk Usage > 80%
-
Setup
visudountukvcgencmd
Agar Node‑RED bisa membaca suhu CPU viasudo vcgencmdtanpa prompt password:sudo visudoTambahkan di akhir:
ubuntu ALL=(ALL) NOPASSWD: /usr/bin/vcgencmdSimpan → keluar. Uji:
sudo vcgencmd measure_temp # contoh output: temp=45.2°C -
Instal Node Tambahan
Di editor Node‑RED (http://<ip>:1880), buka Menu → Manage palette → Install:node-red-dashboard(untuk UI gauge/chart)
Restart Node‑RED setelah instalasi.
-
Flow Lengkap
Flow berikut melakukan polling setiap 10 detik, mengeksekusi perintah sistem, menggabungkan hasil, menuliskannya ke CSV, dan menampilkan di dashboard.Langkah Import:
- Salin JSON di bawah.
- Di Node‑RED editor, pilih Menu → Import → Clipboard.
- Paste JSON, lalu klik Import.
[{"id":"fe919f4f898a361a","type":"inject","z":"2aa78c88.04da44","name":"Poll 10s","props":[{"p":"payload","v":"","vt":"str"},{"p":"topic","v":"","vt":"str"}],"repeat":"10","once":true,"onceDelay":"5","x":180,"y":240,"wires":[["fca6b8400889d4f3","27f74b0ccf05dca3","231f57b96b131413","450425f381c32b46","01694ddd54ec6a73"]]},{"id":"f1188809e56ab2de","type":"exec","z":"2aa78c88.04da44","command":"nproc --all","addpay":"","append":"","timer":"","winHide":false,"name":"Get CPU Cores","x":400,"y":220,"wires":[["d204093578cae4b4"],[],[]]},{"id":"fca6b8400889d4f3","type":"exec","z":"2aa78c88.04da44","command":"bash -c 'if sudo command -v vcgencmd >/dev/null 2>&1; then sudo vcgencmd measure_temp | grep -o \"[0-9]*\\.[0-9]*\"; else awk \"{printf(\\\"%.1f\\\", \\$1/1000)}\" /sys/class/thermal/thermal_zone0/temp; fi'","addpay":"","append":"","timer":"","winHide":false,"name":"CPU Temp","x":390,"y":100,"wires":[["23fd137e13f7dd24"],[],[]]},{"id":"23fd137e13f7dd24","type":"change","z":"2aa78c88.04da44","name":"Set Topic Temp","rules":[{"t":"set","p":"topic","pt":"msg","to":"Temperature","tot":"str"}],"x":620,"y":100,"wires":[["71d65c821a231f67"]]},{"id":"27f74b0ccf05dca3","type":"exec","z":"2aa78c88.04da44","command":"awk '{print $1}' /proc/loadavg","addpay":"","append":"","timer":"","winHide":false,"name":"CPU Load","x":390,"y":160,"wires":[["a75ecd76131c54e9"],[],[]]},{"id":"a75ecd76131c54e9","type":"change","z":"2aa78c88.04da44","name":"Set Topic Load","rules":[{"t":"set","p":"topic","pt":"msg","to":"Load","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"($number($trim(payload)) ? $number($trim(payload)) : 0) / ($flowContext(\"cpu_cores\") ? $flowContext(\"cpu_cores\") : 4) * 100.0 ~> $round(2)\t","tot":"jsonata"}],"x":620,"y":160,"wires":[["71d65c821a231f67"]]},{"id":"231f57b96b131413","type":"exec","z":"2aa78c88.04da44","command":"free | awk '/Mem/ {printf(\"%.2f\", $3/$2 * 100.0)}'","addpay":"","append":"","timer":"","winHide":false,"name":"Memory Usage","x":400,"y":280,"wires":[["fe468f39b7e6bb81"],[],[]]},{"id":"fe468f39b7e6bb81","type":"change","z":"2aa78c88.04da44","name":"Set Topic Mem","rules":[{"t":"set","p":"topic","pt":"msg","to":"Memory","tot":"str"}],"x":620,"y":280,"wires":[["71d65c821a231f67"]]},{"id":"450425f381c32b46","type":"exec","z":"2aa78c88.04da44","command":"df -h / | awk 'NR==2 {print $5}' | tr -d '%' | awk '{print $1 + 0}'","addpay":"","append":"","timer":"","winHide":false,"name":"Disk Usage","x":390,"y":400,"wires":[["49baac92701386dd"],[],[]]},{"id":"49baac92701386dd","type":"change","z":"2aa78c88.04da44","name":"Set Topic Disk","rules":[{"t":"set","p":"topic","pt":"msg","to":"Disk","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"$trim(payload)","tot":"jsonata"}],"x":620,"y":400,"wires":[["71d65c821a231f67"]]},{"id":"01694ddd54ec6a73","type":"exec","z":"2aa78c88.04da44","command":"awk '{print $1}' /proc/uptime","addpay":"","append":"","timer":"","winHide":false,"name":"Uptime","x":380,"y":340,"wires":[["198a0c0ac2416c0c"],[],[]]},{"id":"198a0c0ac2416c0c","type":"change","z":"2aa78c88.04da44","name":"Set Topic Uptime","rules":[{"t":"set","p":"topic","pt":"msg","to":"Uptime","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"($number($trim(payload)) ? $number($trim(payload)) : 0) / 3600 ~> $round(2)","tot":"jsonata"}],"x":630,"y":340,"wires":[["71d65c821a231f67"]]},{"id":"71d65c821a231f67","type":"join","z":"2aa78c88.04da44","name":"Join Metrics","mode":"manual","build":"object","property":"payload","timeout":"10","count":"5","x":890,"y":260,"wires":[["a7f8cf77487b9a83","891b1b27.c66998","30378886.4cc918","500cb64f.5bd7c8","70e60250.56125c","2280e8e0.31af58","f70a49af60753879","26b5ccd1c2d785e9"]]},{"id":"a7f8cf77487b9a83","type":"function","z":"2aa78c88.04da44","name":"Format CSV","func":"let ts = moment().utc().format('YYYY.MM.DD HH:mm:ss');\nlet p = msg.payload;\nlet row = `${ts},${p.Temperature},${p.Load},${p.Memory},${p.Uptime},${p.Disk}`;\nmsg.payload = row;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"moment","module":"moment"}],"x":1130,"y":360,"wires":[["375bd16453cc4dd0"]]},{"id":"375bd16453cc4dd0","type":"file","z":"2aa78c88.04da44","name":"Append CSV","filename":"/home/ubuntu/uno220_stat.csv","filenameType":"str","appendNewline":true,"createDir":true,"overwriteFile":"false","x":1330,"y":360,"wires":[[]]},{"id":"8f5767ef7b5ad18c","type":"change","z":"2aa78c88.04da44","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Timestamp,Temperature,Load,Memory,Uptime,Disk","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1140,"y":400,"wires":[["6aef7d561dd3b777"]]},{"id":"3668be62b36e7593","type":"inject","z":"2aa78c88.04da44","name":"Clear","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":950,"y":400,"wires":[["8f5767ef7b5ad18c"]]},{"id":"6aef7d561dd3b777","type":"file","z":"2aa78c88.04da44","name":"Clear CSV","filename":"/home/ubuntu/uno220_stat.csv","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1330,"y":400,"wires":[[]]},{"id":"891b1b27.c66998","type":"ui_gauge","z":"2aa78c88.04da44","name":"","group":"dafb9311.e6497","order":1,"width":6,"height":4,"gtype":"gage","title":"Temperature","label":"","format":"{{msg.payload.Temperature}}°C","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":1130,"y":120,"wires":[]},{"id":"30378886.4cc918","type":"ui_template","z":"2aa78c88.04da44","group":"dafb9311.e6497","name":"CPU Load","order":3,"width":6,"height":2,"format":"<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\">\n<div>\n <b>CPU Load:</b>\n <div class=\"w3-light-grey w3-xlarge w3-border w3-round-medium\">\n <div class=\"w3-container w3-green w3-round-medium\" style=\"width:{{msg.payload.Load}}%;color: #000!important;\">{{msg.payload.Load}}%</div>\n </div>\n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1130,"y":160,"wires":[[]]},{"id":"500cb64f.5bd7c8","type":"ui_gauge","z":"2aa78c88.04da44","name":"","group":"d597c1ca.fe019","order":1,"width":6,"height":4,"gtype":"gage","title":"Memory Usage","label":"","format":"{{msg.payload.Memory}}%","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":1140,"y":200,"wires":[]},{"id":"70e60250.56125c","type":"ui_text","z":"2aa78c88.04da44","group":"d597c1ca.fe019","order":2,"width":6,"height":1,"name":"","label":"Uptime","format":"{{msg.payload.Uptime}}hour(s)","layout":"row-center","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1120,"y":240,"wires":[]},{"id":"2280e8e0.31af58","type":"ui_template","z":"2aa78c88.04da44","group":"d597c1ca.fe019","name":"Disk Usage","order":3,"width":6,"height":2,"format":"<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\">\n<div>\n <b>Disk Usage:</b>\n <div class=\"w3-light-grey w3-xlarge w3-border w3-round-medium\">\n <div class=\"w3-container w3-green w3-round-medium\" style=\"width:{{msg.payload.Disk}}%;color: #000!important;\">{{msg.payload.Disk}}%</div>\n </div>\n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1130,"y":320,"wires":[[]]},{"id":"d204093578cae4b4","type":"change","z":"2aa78c88.04da44","name":"Store Cores","rules":[{"t":"set","p":"cpu_cores","pt":"flow","to":"$number($trim(payload)) ? $number($trim(payload)) : 4","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":220,"wires":[[]]},{"id":"ebf66d26260831f1","type":"inject","z":"2aa78c88.04da44","name":"Init 3s","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"3","topic":"","payload":"","payloadType":"str","x":190,"y":180,"wires":[["f1188809e56ab2de"]]},{"id":"f70a49af60753879","type":"debug","z":"2aa78c88.04da44","name":"Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1110,"y":80,"wires":[]},{"id":"26b5ccd1c2d785e9","type":"ui_template","z":"2aa78c88.04da44","group":"dafb9311.e6497","name":"Spacer","order":2,"width":0,"height":0,"format":"<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\">\n<div>\n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1120,"y":280,"wires":[[]]},{"id":"dafb9311.e6497","type":"ui_group","name":"Temperature Group","tab":"d7c34f92.385aa","order":1,"disp":false,"width":6,"collapse":false,"className":""},{"id":"d597c1ca.fe019","type":"ui_group","name":"Memory Group","tab":"d7c34f92.385aa","order":2,"disp":false,"width":6,"collapse":false,"className":""},{"id":"d7c34f92.385aa","type":"ui_tab","name":"UNO-220","icon":"dashboard","disabled":false,"hidden":false},{"id":"11c630d0f7478e8b","type":"global-config","env":[],"modules":{"node-red-dashboard":"3.6.6"}}] -
Penjelasan Flow
- Inject node: trigger setiap 10 detik.
- Exec nodes: jalankan perintah Linux untuk ambil metrik.
- Join node: gabungkan hasil menjadi satu objek (
msg.payload.Temperature,Load,Memory,Disk,Uptime). - Function node: format ke CSV dengan timestamp UTC ISO 8601 seperti yang diharapkan Rapid SCADA.
- File node: append ke
/home/ubuntu/uno220_stat.csv. - Dashboard nodes: gauge untuk Temp, Load, Memory, Disk; text untuk Uptime.
Catatan: File CSV berfungsi sebagai buffer sementara, sedangkan trending historis sepenuhnya ditangani oleh Rapid SCADA.
-
Akses Dashboard
Buka:
http://<ip>:1880/ui -
Troubleshooting
- Jika
vcgencmdtidak tersedia di Ubuntu, flow otomatis fallback ke/sys/class/thermal/thermal_zone0/temp. - Jika
jointimeout, naikkantimeoutke 15 detik. - Cek hasil CSV:
tail -f /home/ubuntu/uno220_stat.csv
- Jika
6.4 Indikator Heartbeat LED PL1 dengan Node‑RED
Untuk memastikan Node‑RED service aktif sekaligus memverifikasi sistem operasi berjalan normal, LED PL1 pada UNO‑220 dapat digunakan sebagai indikator heartbeat dengan pola berkedip periodik.
-
Flow Lengkap
Flow berikut mengendalikan LED PL1 (GPIO12, pin 32) agar berkedip dengan siklus penuh: 2 detik ON dan 2 detik OFF. Langkah import sama seperti JSON monitoring pada seksi 6.3.[{"id":"659d98c5338c2aa4","type":"inject","z":"2aa78c88.04da44","name":"Blink Trigger","props":[{"p":"payload"}],"repeat":"2","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":200,"y":480,"wires":[["5a0f6bca78144bc7"]]},{"id":"5a0f6bca78144bc7","type":"delay","z":"2aa78c88.04da44","name":"1s Delay","pauseType":"rate","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":400,"y":480,"wires":[["ca0e3b91a72ed37c"]]},{"id":"ca0e3b91a72ed37c","type":"change","z":"2aa78c88.04da44","name":"Toggle LED State (0/1)","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number($not($flowContext(\"led_state\") ? $flowContext(\"led_state\") : 0))","tot":"jsonata"},{"t":"set","p":"led_state","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":620,"y":480,"wires":[["c23f25c34982533f"]]},{"id":"c23f25c34982533f","type":"rpi-gpio out","z":"2aa78c88.04da44","name":"LED PL1 Output","pin":"12","set":"","level":"msg.payload","freq":"","out":"out","bcm":true,"x":860,"y":480,"wires":[]},{"id":"b1892e385a988550","type":"global-config","env":[],"modules":{"node-red-node-pi-gpio":"2.0.6"}}] -
Penjelasan Flow
- Inject node: memicu alur setiap 2 detik.
- Delay node: menahan pesan 1 detik untuk menjaga pola stabil.
- Change node: membalik nilai 0/1 dengan menyimpan status terakhir di flow context
led_state. - rpi-gpio out: mengirim nilai 0/1 ke GPIO12 (pin 32), yang terhubung ke LED PL1.
-
Hasil
LED PL1 berkedip dengan siklus penuh: 2 detik ON dan 2 detik OFF, menandakan Node‑RED dan sistem operasi berjalan normal. Pola blink dapat diubah (misalnya ON 200 ms, OFF 800 ms) dengan menyesuaikan konfigurasi inject/delay. -
Troubleshooting
- LED tidak berkedip: Pastikan udev rules dan grup gpio aktif (lihat 4.5), lalu uji manual:
- gpioset 0 12=1 → LED ON
- gpioset 0 12=0 → LED OFF
- Izin Node‑RED GPIO: Pastikan paket python3‑rpi.gpio terpasang dan user service Node‑RED termasuk grup gpio.
- Mapping pin: Verifikasi GPIO12 berada di gpiochip0 dan terhubung ke PL1:
- gpioinfo | grep -E "gpiochip0|BCM12"
- LED tidak berkedip: Pastikan udev rules dan grup gpio aktif (lihat 4.5), lalu uji manual:
7. Instalasi Rapid SCADA 6.4.3 & Nginx
Di era integrasi OT–IT, OPC UA telah menjadi de facto standar komunikasi industri modern, terutama saat sistem perlu terhubung dengan MES, ERP, maupun platform IIoT.
Dalam konteks ini, Rapid SCADA tidak hanya berfungsi sebagai SCADA tradisional, tetapi juga sebagai data concentrator yang mengekspor seluruh tag dari berbagai driver (Modbus, SNMP, CSV, MQTT, dll.) melalui OPC UA Gateway. Dengan begitu, sistem eksternal seperti PLC, DCS, Historian, atau Grafana dapat langsung mengakses data tanpa perlu memahami protokol aslinya.
Kombinasi berikut membentuk arsitektur edge yang ideal dan future‑proof:
- Rapid SCADA → data concentrator & middleware OT–IT
- OPC UA → standar komunikasi universal
- Node‑RED → logika automasi & integrasi fleksibel
- Grafana → visualisasi modern dan analitik real‑time
7.1 .NET 8.0 Runtime
Rapid SCADA 6.4.3 membutuhkan ASP.NET Core Runtime 8.0.x.
Instalasi di Ubuntu 25.10 ARM64:
sudo apt update && sudo apt install -y aspnetcore-runtime-8.0
dotnet --info # pastikan versi 8.0.x tampil
7.2 Rapid SCADA
Opsi A – Instalasi via Paket .deb (disarankan)
- Unduh dan ekstrak paket ZIP resmi:
mkdir -p /home/ubuntu/scada cd /home/ubuntu/scada wget https://rapidscada.org/download/https://rapidscada.org/download/rapidscada_6.4.3_linux_en.zip unzip rapidscada_6.4.3_linux_en.zip -d scada cd scada - Instal paket
.deb:sudo dpkg -i rapidscada_6.4.3-1_all.deb - Aktifkan dan jalankan service:
sudo systemctl enable scadaagent6 scadaserver6 scadacomm6 scadaweb6 sudo systemctl start scadaagent6 scadaserver6 scadacomm6 scadaweb6
Opsi B – Instalasi Manual (opsional)
Digunakan jika .deb gagal atau butuh kustomisasi.
sudo cp -r scada/* /opt/scada/
sudo chmod +x /opt/scada/make_executable.sh
sudo /opt/scada/make_executable.sh
sudo cp daemons/* /etc/systemd/system/
sudo systemctl enable scadaagent6 scadaserver6 scadacomm6 scadaweb6
sudo systemctl start scadaagent6 scadaserver6 scadacomm6 scadaweb6
Catatan Integrasi System Resource Monitoring
- Driver: CSV Reader
- DecimalSeparator:
. - DemoPeriod:
OneHour - FieldDelimiter:
FieldDelimiter - FileName:
/home/ubuntu/uno220_stat.csv - ReadMode:
RealTime - TagCount:
5 - Map kolom → tag:
Timestamp,Temperature,Load,Memory,Uptime,Disk
7.3 RAM Drive untuk Log
sudo mkdir /var/log/scada
sudo cp /etc/fstab /etc/fstab.bak
echo "tmpfs /var/log/scada tmpfs defaults,noatime,size=100m,mode=1777 0 0" | sudo tee -a /etc/fstab
sudo mount -a
7.4 Nginx Reverse Proxy
Instalasi:
sudo apt install nginx -y
sudo systemctl enable nginx
Salin konfigurasi bawaan:
sudo cp /home/ubuntu/scada/scada/nginx/default /etc/nginx/sites-available/scada
sudo ln -s /etc/nginx/sites-available/scada /etc/nginx/sites-enabled/
Validasi & restart:
sudo nginx -t
sudo systemctl restart nginx
SSL:
- Self‑signed:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/nginx-selfsigned.key \ -out /etc/ssl/certs/nginx-selfsigned.crt - Produksi: gunakan Let’s Encrypt (
sudo certbot --nginx).
7.5 Keamanan
- Gunakan UFW untuk membatasi akses port ScadaAgent (10002) hanya dari jaringan ZeroTier agar remote programming tetap aman:
sudo ufw allow from <zerotier_subnet> to any port 10002 proto tcp comment 'Rapid SCADA Agent' - Jangan buka port 10002 ke publik (WAN).
7.6 Verifikasi
Cek status service:
systemctl status scadaserver6 scadacomm6 scadaweb6
Akses web:
http://<ip_zerotier>atauhttps://<ip_zerotier>- Login default: admin / scada
8. Instalasi Modbus TCP to RTU Gateway
mbusd memungkinkan UNO‑220 menjembatani perangkat Modbus RTU (RS‑232/RS‑485) ke Modbus TCP server. Dengan ini, Node‑RED maupun Rapid SCADA bisa membaca data RTU melalui TCP port 502.
-
Instalasi
sudo apt update sudo apt install -y build-essential git cmake git clone https://github.com/3cky/mbusd.git cd mbusd mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr .. make sudo make install -
Konfigurasi
Buat file/etc/mbusd/mbusd-ttyS0.conf:device = /dev/ttyS0 speed = 9600 mode = 8N1 rs485 = yes address = 0.0.0.0 port = 502 maxconn = 32 retries = 3 pause = 100 wait = 500 timeout = 60 logfile = /var/log/mbusd.log verbosity = 2 -
Jalankan sebagai service
sudo systemctl start mbusd@ttyS0.service sudo systemctl enable mbusd@ttyS0.service sudo systemctl status mbusd@ttyS0.service -
Uji koneksi
Dari host lain:modpoll -m tcp -t 3 -r 1 -c 10 <ip_uno220>→ Harus mendapat respons register dari slave RTU.
-
Integrasi
- Node‑RED: gunakan node
node-red-contrib-modbus→ Modbus TCP client ketcp://<ip_uno220>:502. - Rapid SCADA: tambahkan channel Modbus TCP pointing ke UNO‑220.
- Node‑RED: gunakan node
-
Keamanan
- Gunakan UFW untuk membatasi akses port Modbus TCP (502) hanya dari jaringan ZeroTier:
sudo ufw allow from <zerotier_subnet> to any port 502 proto tcp comment 'Modbus TCP' - Jangan buka port 502 ke publik (WAN).
- Gunakan UFW untuk membatasi akses port Modbus TCP (502) hanya dari jaringan ZeroTier:
9. Instalasi Scada Grafana Proxy
scada-grafana-proxy adalah server proxy ringan berbasis Node.js yang:
- Mengambil data dari Rapid SCADA 6 maupun Rapid SCADA 5 via REST API.
- Mengubah format respons menjadi seragam dan kompatibel dengan Grafana Infinity Datasource.
- Menyediakan Basic Authentication untuk keamanan.
- Mendukung konfigurasi berbasis environment (
.env). - Menyediakan health check endpoint untuk monitoring.
-
Instalasi
# Clone repo git clone https://github.com/kumajaya/scada-grafana-proxy.git cd scada-grafana-proxy # Install dependensi npm install -
Konfigurasi
Salin contoh environment:cp env-example .env nano .envIsi variabel sesuai kebutuhan, misalnya:
PROXY_PORT=3000 PROXY_USER=admin PROXY_PASS=admin SCADA_BASE_URL=http://localhost:10008 SCADA_USERNAME=admin SCADA_PASSWORD=admin SCADA_ARCHIVEBIT_THRESHOLD=24 SCADA5_BASE_URL=http://localhost/grafanadataprovider -
Jalankan
npm startAkses proxy di:
http://<ip_uno220>:3000 -
Systemd Service
Filescada-grafana-proxy.servicesudah disediakan. Install:sudo cp scada-grafana-proxy.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable scada-grafana-proxy sudo systemctl start scada-grafana-proxyCek status:
systemctl status scada-grafana-proxyUji health check:
curl -u admin:admin http://<ip_uno220>:3000/health -
Integrasi dengan Grafana
- Tambahkan Infinity Datasource di Grafana.
- Atur URL ke
http://<ip_uno220>:3000. - Gunakan Basic Auth sesuai
.env. - Query data Rapid SCADA langsung dari Grafana dashboard.
-
Keamanan
- Gunakan UFW untuk membatasi akses port 3000 hanya dari host Grafana:
sudo ufw allow from <ip_grafana> to any port 3000 proto tcp comment 'SCADA Grafana Proxy' - Jika Grafana berjalan di server terpisah, gunakan ZeroTier agar komunikasi tetap terenkripsi.
- Gunakan UFW untuk membatasi akses port 3000 hanya dari host Grafana:
Dengan penambahan ini, UNO‑220 berevolusi dari sekadar gateway dan server SCADA menjadi penyedia data terintegrasi untuk Grafana maupun ERP. Membawa visibilitas real‑time melalui dashboard modern dan tinjauan histori kinerja secara komprehensif, sementara sistem ERP menerima aliran data SCADA yang sudah dinormalisasi. Alur ini tidak hanya memperkaya analitik dan pengambilan keputusan, tetapi juga memastikan integrasi berlangsung dengan cara yang aman, konsisten, dan mudah.
10. Hardening & Optimisasi
10.1 SSH (Secure Shell)
PERINGATAN: Risiko Penguncian Akses Permanen
Mengaktifkan autentikasi berbasis kunci SSH meningkatkan keamanan, tetapi juga meniadakan akses melalui password. Jika kunci privat hilang, perangkat tidak dapat diakses kembali tanpa koneksi fisik ke serial console.
Pastikan autentikasi menggunakanPubkeyAuthenticationtelah diuji dan berfungsi dengan baik sebelum menonaktifkanPasswordAuthentication.
-
Generate Key di Host Admin
- Linux:
ssh-keygen -t ed25519 -C "admin@uno220" - Windows (PowerShell, OpenSSH bawaan):
ssh-keygen -t ed25519 -C "admin@uno220"
- Linux:
-
Copy Public Key ke UNO‑220
- Linux:
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@<ip_zerotier> - Windows PowerShell:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu@<ip_zerotier> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
- Linux:
-
Uji Login Key‑Based
ssh ubuntu@<ip_zerotier>→ Harus langsung masuk tanpa password.
-
Aktifkan Hardening SSH (setelah uji berhasil)
Edit/etc/ssh/sshd_config:PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication noRestart:
sudo systemctl restart ssh
10.2 Firewall (UFW)
PERINGATAN: Risiko Kehilangan Akses Remote
Aturan firewall yang terlalu ketat dapat memblokir port penting seperti ZeroTier (9993/UDP) atau SSH (22/TCP). Jika port ini tertutup, perangkat tidak dapat diakses dari jarak jauh, dan pemulihan hanya dapat dilakukan melalui serial console fisik.
Pastikan konfigurasiufwtelah diuji dengan hati-hati sebelum menerapkan aturan baru secara permanen.
Konfigurasi dasar:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh/tcp # Port 22
sudo ufw allow 80/tcp # Nginx HTTP
sudo ufw allow 443/tcp # Nginx HTTPS
sudo ufw allow 9993/udp comment 'ZeroTier'
sudo ufw allow 1880/tcp comment 'Node-RED'
sudo ufw allow from <zerotier_subnet> to any port 10002 proto tcp comment 'Rapid SCADA Agent'
sudo ufw allow from <zerotier_subnet> to any port 3000 proto tcp comment 'SCADA Grafana Proxy'
sudo ufw enable
Verifikasi port terbuka:
sudo ss -tuln
→ Hanya 22, 80, 443, 9993, 1880, 10002, 3000 yang aktif.
10.3 Fail2Ban (Proteksi SSH)
PERINGATAN: Hindari Penguncian Akses Sendiri
Mekanisme ini melindungi perangkat dari serangan brute-force pada SSH, namun berisiko memblokir IP admin atau tim jika terjadi beberapa kali kegagalan login beruntun. Akibatnya, akses remote dapat terputus sementara (default 10 menit).
Pastikan alamat IP tepercaya dimasukkan ke daftar pengecualian sebelum fitur ini diaktifkan di lingkungan produksi.
- Instalasi:
sudo apt install fail2ban -y - Konfigurasi
/etc/fail2ban/jail.local:
Tambahkan[DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 [sshd] enabled = true port = ssh logpath = /var/log/auth.logignoreip = 127.0.0.1/8 <your_ip>untuk whitelist. - Restart:
sudo systemctl restart fail2ban - Verifikasi:
sudo fail2ban-client status sshd
10.4 Auto Security Updates
PERINGATAN: Keseimbangan antara Keamanan dan Stabilitas
Menahan (hold) kernel mencegah pembaruan otomatis yang dapat memicu reboot tak terjadwal, menjaga uptime sistem industri tetap stabil. Namun, risiko muncul jika kernel tertahan terlalu lama: perangkat dapat kehilangan patch keamanan penting.
Lakukan pemantauan manual terhadap rilis kernel baru dan lakukan pembaruan terencana bila tersedia pembaruan kritis.
- Instalasi:
sudo apt install unattended-upgrades -y - Enable:
Pilih Yes.sudo dpkg-reconfigure unattended-upgrades - Edit
/etc/apt/apt.conf.d/50unattended-upgrades→ pastikan baris berikut aktif:Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; }; - Uji:
sudo unattended-upgrades --dry-run - Untuk mencegah upgrade kernel otomatis yang memerlukan reboot, jalankan:
sudo apt-mark hold linux-image-* raspberrypi-kernel
10.5 Sinkronisasi RTC (Real-Time Clock)
- Pastikan NTP aktif:
timedatectl status - Tambahkan cron job:
Isi:sudo crontab -e@daily /usr/sbin/hwclock -w && logger "RTC updated from system clock" @reboot /usr/sbin/hwclock -s && logger "System clock initialized from RTC" - Uji manual:
sudo hwclock -s && hwclock -r
10.6 Disable Unused Services
Matikan service yang tidak diperlukan:
sudo systemctl disable bluetooth avahi-daemon
10.7 Disable USB Boot (Optional, Keamanan Fisik untuk Lapangan Rentan)
PERINGATAN: Risiko Gagal Boot Permanen
Langkah ini meningkatkan keamanan fisik dengan membatasi jalur boot hanya dari kartu SD. Namun, konfigurasi EEPROM yang salah dapat menyebabkan kegagalan boot total.
Pemulihan memerlukan akses fisik langsung dan flashing ulang bootloader menggunakan Raspberry Pi Imager.
Disarankan untuk selalu menyertakan SD card dalam urutan BOOT_ORDER. Hal ini untuk memastikan dapat melakukan recovery dengan mudah menggunakan image rescue di microSD, jika konfigurasi boot lain gagal.
Untuk mencegah perangkat boot dari USB eksternal (risiko tampering di lapangan), lakukan konfigurasi EEPROM bootloader agar hanya mengizinkan boot dari microSD.
-
Install tool EEPROM
sudo apt install rpi-eeprom -y -
Edit konfigurasi EEPROM
sudo rpi-eeprom-config --editUbah atau tambahkan baris:
BOOT_ORDER=0xf410xF41→ SD → USB → ulangi (default modern Pi, aman karena SD tetap ada).0xF0→ hanya SD card (paling ketat, tanpa fallback).
Simpan dan keluar dari editor.
-
Update EEPROM & reboot
sudo rpi-eeprom-update -a sudo reboot -
Verifikasi konfigurasi
sudo vcgencmd bootloader_config | grep BOOT_ORDEROutput harus menampilkan
0xF41atau0xF0.
Contoh nilai BOOT_ORDER umum:
| Nilai | Urutan Boot | Catatan |
|---|---|---|
0xF41 |
SD → USB → ulangi | Default modern Pi, aman |
0xF14 |
USB → SD → ulangi | Masih aman, SD tetap ada |
0xF461 |
SD → NVMe → USB → ulangi | Cocok untuk CM4/Pi 5 dengan SSD |
0xF21 |
SD → Network (TFTP) → ulangi | Aman untuk network boot, SD tetap ada |
0xF0 |
SD only | Paling ketat, tanpa fallback |
Catatan:
- Gunakan microSD industrial‑grade, karena setelah USB boot dinonaktifkan, recovery hanya bisa dilakukan via Raspberry Pi Imager dengan flashing ulang bootloader image.
- Jika update EEPROM gagal, fallback ke metode resmi Raspberry Pi Imager untuk restore bootloader.
10.8 Verifikasi Hardening
- SSH hanya menerima key‑based login:
ssh ubuntu@<ip_zerotier> - Firewall hanya membuka port yang diizinkan:
sudo ss -tuln - Fail2Ban aktif:
sudo fail2ban-client status sshd - Update otomatis aktif:
systemctl status unattended-upgrades - RTC sinkron:
hwclock -r
10.9 Troubleshooting
- Fail2Ban gagal start → cek log:
sudo journalctl -u fail2ban - SSH terkunci → login via ZeroTier console atau akses fisik, lalu aktifkan kembali
PasswordAuthentication yessementara. - UFW blokir ZeroTier → pastikan
sudo ufw allow 9993/udp.
11. Backup & Recovery
11.1 Backup Manual
Node‑RED
cd ~/.node-red && tar czvf nodered_config_backup_$(date +%F).tar.gz flows.json settings.js package.json
Rapid SCADA
sudo tar czvf scada_backup_$(date +%F).tar.gz /opt/scada /etc/systemd/system/scada*.service
ZeroTier
sudo tar czvf zerotier_backup_$(date +%F).tar.gz /var/lib/zerotier-one
11.2 Backup Rutin Otomatis (Cron + rsync ke USB/NAS)
-
Setup Mount USB/NAS
- USB:
sudo mkdir -p /mnt/usb sudo mount /dev/sda1 /mnt/usb # ganti sda1 sesuai device - NAS (NFS):
sudo mkdir -p /mnt/nas sudo mount -t nfs <nas_ip>:/share /mnt/nas - NAS (SMB/CIFS):
sudo mkdir -p /mnt/nas sudo mount -t cifs //<nas_ip>/share /mnt/nas -o username=user,password=pass
- USB:
-
Buat Script Backup
Simpan sebagai/usr/local/bin/backup_routine.sh:#!/bin/bash set -euo pipefail DATE="$(date +%Y%m%d_%H%M%S)" SRC_DIRS="/home/ubuntu/.node-red /var/lib/zerotier-one /etc /home/ubuntu/uno220_stat.csv" DEST="/mnt/usb/backups" # atau /mnt/nas/backups LOG="/var/log/backup.log" if ! mountpoint -q /mnt/usb; then echo "$(date) - USB tidak ter-mount, backup dibatalkan" | tee -a "$LOG" exit 1 fi mkdir -p "$DEST/$DATE" rsync -avz --delete --log-file="$LOG" $SRC_DIRS "$DEST/$DATE" # Hapus backup >7 hari find "$DEST" -maxdepth 1 -mindepth 1 -type d -mtime +7 -exec rm -rf {} + # Mirror khusus Rapid SCADA mkdir -p /mnt/usb/scada_backup rsync -av --delete /opt/scada /mnt/usb/scada_backup/Buat executable:
sudo chmod +x /usr/local/bin/backup_routine.sh -
Jadwalkan Cron Job
sudo crontab -eTambahkan:
0 2 * * * /usr/local/bin/backup_routine.sh # Harian jam 2 pagiVerifikasi:
sudo crontab -lLog tersimpan di
/var/log/backup.log.
11.3 Log Retention dengan Logrotate
Cegah log backup membengkak di microSD.
- Pastikan logrotate terpasang:
sudo apt install logrotate -y - Buat config
/etc/logrotate.d/backup_logs:/var/log/backup.log { daily rotate 7 compress delaycompress missingok notifempty create 644 root root postrotate /usr/bin/killall -q -HUP rsyslogd 2> /dev/null || true endscript } - Uji:
sudo logrotate -d /etc/logrotate.d/backup_logs - Jalankan manual:
sudo logrotate -f /etc/logrotate.conf
11.4 Recovery
-
Restore Node‑RED:
tar xzvf nodered_config_backup_*.tar.gz -C ~/.node-red -
Restore Rapid SCADA:
sudo tar xzvf scada_backup_*.tar.gz -C / sudo systemctl daemon-reload sudo systemctl restart scadaagent6 scadaserver6 scadacomm6 scadaweb6 -
Restore ZeroTier:
sudo systemctl stop zerotier-one sudo tar xzvf zerotier_backup_*.tar.gz -C / sudo systemctl start zerotier-one -
Restore dari USB/NAS:
sudo rsync -avz /mnt/usb/backups/<tanggal>/ /
11.5 Troubleshooting
- rsync gagal ke NAS → pastikan mount sukses (
df -h), gunakan SSH keyless (ssh-keygen && ssh-copy-id user@nas_ip). - USB tidak terdeteksi → cek
lsblkataudmesg | grep sd. - Logrotate error permission → sesuaikan baris
create 644 root rootdi config.
12. Testing & Validasi
12.1 Verifikasi Node‑RED
systemctl status nodered.service
- Status harus
active (running). - Akses editor:
http://<ip>:1880 - Akses dashboard:
http://<ip>:1880/ui
Contoh Output:
● nodered.service - Node-RED
Loaded: loaded (/lib/systemd/system/nodered.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-10-22 10:00:00 UTC; 2h ago
Main PID: 1234 (node)
Tasks: 15 (limit: 4915)
Memory: 45.2M
CPU: 1min 23.456s
CGroup: /system.slice/nodered.service
└─1234 /usr/bin/node /usr/lib/node_modules/node-red/red.js
12.2 Verifikasi Rapid SCADA
systemctl status scadaserver6.service scadacomm6.service scadaweb6.service
- Semua service harus
active (running). - Akses web:
http://<ip>atauhttps://<ip> - Login default: admin / scada
12.3 Uji Koneksi ZeroTier
ping <IP_ZeroTier_peer>
- Harus ada balasan ICMP.
- Jika gagal: cek
zerotier-cli listnetworksdan pastikan node authorized.
12.4 Uji Hardware
-
RTC
hwclock -rContoh Output:
2025-10-22 12:34:56.789012 UTC→ Bandingkan dengan
dateuntuk memastikan sinkron. -
GPIO Expander
gpiodetectContoh Output:
gpiochip0 [pinctrl-bcm2835] (58 lines) gpiochip1 [raspberrypi-exp-gpio] (8 lines) gpiochip2 [pca953x] (8 lines, tca9554@27) -
LED PL1
gpioset 0 12=1 # LED ON gpioset 0 12=0 # LED OFF -
TPM
tpm2_getrandom 16 | xxd -pContoh Output:
a1b2c3d4e5f6789012345678abcdef90 -
Serial Port
minicom -D /dev/ttyS0 -b 115200→ Pastikan komunikasi serial berjalan.
12.5 Checklist
- [ ] Node‑RED dashboard dapat diakses via browser
- [ ] Rapid SCADA menampilkan halaman login
- [ ] ZeroTier peer dapat saling ping
- [ ] RTC terbaca dengan benar (
hwclock -r) - [ ] LED PL1 dapat dikendalikan (ON/OFF)
- [ ] Port serial berfungsi (
minicom) - [ ] Hanya port 22/80/443/9993/1880/10002/3000 terbuka (
ss -tuln) - [ ] Fail2Ban aktif (
fail2ban-client status sshd) - [ ] Node‑RED logs capture I/O errors (
journalctl -u nodered) - [ ] Backup cron berjalan (cek
/var/log/backup.log) - [ ] Logrotate config valid (
logrotate -d /etc/logrotate.d/backup_logs) - [ ] System metrics dashboard tampil (CPU <80%, RAM <70%, Temp <80°C)
- [ ] CSV file update (
tail -f uno220_stat.csv) & Rapid SCADA trend visible
12.6 Troubleshooting Cepat
- Node‑RED tidak jalan → cek
journalctl -u nodered -f - SCADA 502 Bad Gateway → cek
journalctl -u scadaweb6 -f - ZeroTier tidak connect → cek
zerotier-cli info - RTC error → pastikan overlay aktif (
dmesg | grep rtc) - GPIO/LED gagal → cek
gpioinfountuk mapping pin - TPM error → pastikan modul kernel TPM aktif (
lsmod | grep tpm)
13. Deployment
-
Penempatan Perangkat
- Tempatkan UNO‑220 di lokasi lapangan sesuai rencana instalasi.
- Pastikan lingkungan sesuai spesifikasi industri (suhu, kelembaban, getaran).
-
Koneksi Daya & Jaringan
- Hubungkan ke catu daya 12–24 VDC atau PoE+ (802.3at).
- Catatan: hindari PoE 802.3af karena tidak stabil saat beban tinggi (Node‑RED + SCADA dapat menarik 15–20W).
-
Verifikasi ZeroTier
- Pastikan device muncul di jaringan ZeroTier:
zerotier-cli listnetworks - Cek status ONLINE di controller.
- Pastikan device muncul di jaringan ZeroTier:
-
Akses Aplikasi
- Node‑RED:
http://<ip_zerotier>:1880 - Rapid SCADA:
http://<ip_zerotier>atauhttps://<ip_zerotier>
- Node‑RED:
-
Validasi Fungsi I/O & Flow
- Uji dashboard Node‑RED (sensor, GPIO, expander, serial).
- Uji trending Rapid SCADA (CSV file update → grafik tampil).
- Simulasikan skenario logika industri (misalnya alarm, interlock).
-
Label Fisik Unit
- Tempel label berisi:
- ID ZeroTier
- IP lokal
- Tanggal deployment
- Gunakan label tahan panas & kelembaban.
- Tempel label berisi:
-
Proteksi Daya
- Gunakan UPS mini DC atau supply redundant untuk menjaga kestabilan.
- Catat kapasitas UPS (misalnya 12V/24V, 30–60 menit backup).
14. Penutup
UNO‑220 kini siap beroperasi sebagai edge device industri yang tangguh, dengan konfigurasi yang aman, modular, dan audit‑ready. Seluruh tahapan — mulai dari instalasi sistem operasi, aktivasi fitur perangkat keras, pengamanan layanan, hingga integrasi aplikasi — telah dirancang agar konsisten, mudah direplikasi, dan dapat diaudit.
Komponen utama yang terintegrasi:
- Node‑RED → automasi dan dashboard lokal, lengkap dengan logging I/O dan monitoring sistem ke CSV.
- Rapid SCADA 6.4.3 → server SCADA dengan integrasi trending CSV untuk histori data yang akurat.
- ZeroTier → konektivitas aman dan fleksibel untuk remote management tanpa membuka port publik.
- RAM drive & hardening (UFW + Fail2Ban) → perlindungan sistem sekaligus memperpanjang umur media penyimpanan.
- Backup rutin + logrotate → memastikan recovery cepat dan manajemen log yang efisien.
Dengan rancangan ini, UNO‑220 dapat dijadikan standar operasional deployment di seluruh fasilitas industri, menjamin konsistensi, keamanan, dan keandalan.
Lebih jauh lagi, kombinasi Rapid SCADA (data concentrator) + OPC UA (standar komunikasi) + Node‑RED (logic) + Grafana (visualisasi) membentuk arsitektur edge yang future‑proof. Dengan pendekatan ini, UNO‑220 tidak hanya berfungsi sebagai gateway lokal, tetapi juga sebagai middleware OT–IT yang siap menghubungkan lapisan produksi dengan MES, ERP, maupun platform IIoT modern.
Catatan: Untuk menjaga keberlanjutan, lakukan validasi berkala (service status, backup, update keamanan) dan selalu cek versi terbaru software dari sumber resmi sebelum upgrade.
Sebagai penutup, Advantech UNO‑220 dapat menjadi fondasi fleksibel bagi evolusi sistem automasi industri. Selain fungsi gateway, perangkat ini bisa diperluas dengan runtime Eclipse 4diac FORTE (IEC 61499) untuk soft logic non‑critical, CODESYS Runtime (IEC 61131‑3) sebagai SoftPLC komersial ringan, maupun OpenPLC Runtime (IEC 61131‑3) sebagai alternatif open source untuk edukasi dan prototyping. Integrasi ini dapat dipadukan dengan TensorFlow Lite untuk predictive maintenance, di mana output dari FORTE, CODESYS, atau OpenPLC diolah oleh model AI untuk deteksi fault real‑time, sehingga UNO‑220 berperan sebagai hybrid edge device yang efisien, modular, dan compliant.