Oleh
MUHAMMAD ARBI MINANDA
NIM: 13216019
Oleh
Muhammad Arbi Minanda
NIM: 13216019
PROGRAM STUDI TEKNIK ELEKTRO
Kerja Praktek merupakan mata kuliah wajib dalam kurikulum di Program Studi Teknik
Elektro Institut Teknologi Bandung yang dilaksanakan setelah semester genap
berakhir dan sebelum semester ganjil berikutnya bermula. Kerja Praktek ini
diharapkan dilaksanakan oleh mahasiswa di lingkungan kerja, baik industry ataupun
lembaga riset, tujuannya untuk memberikan gambaran kepada mahasiswa tentang
lingkungan kerja yang akan dihadapinya, selain juga untuk memberikan pengalaman
kerja dan memperluas wawasannya.
Penulis memilih PT. PLN (Persero) UP2B Jabar sebagai tempat untuk melaksanakan
kerja praktek, dan ditempatkan pada bagian Unit SCADA, bidang Fasilitas dan
Operasi. Secara ringkas, unit ini bertugas sebagai Control Center yang melakukan
monitoring serta pengaturan beban tegangan tinggi secara keseluruhan, mulai dari
Pembangkitan, Transmisi, hingga menuju setiap Gardu Induk yang tersebar di wilayah
Jawa Barat.
Dalam pelaksanaan kerja praktek ini, penulis dibimbing untuk dapat memahami garis
besar dari Sistem SCADA, yang terdiri dari 3 bagian, yaitu Master Station, Link
Komunikasi Data, dan Remote Station. Mengingat pentingnya, peran dan posisi
Master Station dalam monitoring serta pengaturan beban tenaga listrik khususnya di
wilayah Jawa Barat, maka keberlangsungan dan ketersediaan fungsi Master Station
menjadi prioritas utama. Dalam upaya peningkatan ketersediaan fungsi Master Station
maka penulis diberikan tugas utama dalam pelaksanaan kerja praktek ini untuk
mengimplementasikan sistem monitoring secara mobile berbasis Bot Telegram dengan
memanfaatkan data status beserta data point komunikasi dari setiap gardu induk di
wilayah Jawa Barat yang didapatkan dari Remote Station. Bot Telegram ini akan
difungsikan untuk mengirimkan nama-nama gardu induk yang sedang dalam kondisi
out of poll (tidak terpantau oleh Master Station) dan mengirimkan data point
komunikasi dari seluruh gardu induk di Jawa Barat (file berformat .csv). Kedua fungsi
iii
bot tersebut dilakukan saat bot menerima pesan dengan kode unik tertentu dari user.
Dalam melaksanakan tugas tersebut, penulis menggunakan sistem operasi CentOS7
dari linux yang menyesuaikan dengan sistem operasi yang digunakan oleh server PT.
PLN (Persero) UP2B Jabar serta menggunakan Bahasa pemrograman Lua dalam
mengolah data-data dan juga untuk membuat Bot Telegram dengan mode MTProto
bot.
Dengan pengerjaan tugas yang dimulai dari minggu keempat pelaksanaan kerja
praktek, penulis berhasil menyelesaikan tugas yang diberikan sesuai spesifikasi yang
diberikan oleh pembimbing. Sistem monitoring dengan Bot Telegram ini berhasil
dibuat dan dapat melakukan fungsi sesuai yang direncanakan.
Kata kunci: Master Station, Gardu Induk, Bot Telegram, Telegram Client, Operational
State, Data Point.
iv
ABSTRACT
By
Muhammad Arbi Minanda
NIM: 13216019
ELECTRICAL ENGINEERING STUDY PROGRAM
The author chose PT. PLN (Persero) UP2B Jabar as a place to carry out Industrial
Experiences, and placed in the SCADA Unit, field of Facilities and Operations. In
summary, this unit serves as the Control Center which monitors and regulates the
overall high voltage load, starting from the Generation, Transmission, until to every
electric substation that is spread throughout the West Java region.
In carrying out this Industrial Experiences, the author is guided to be able to understand
the outline of the SCADA System, which consists of 3 parts, there are Master Station,
Data Communication Link, and Remote Station. Considering the important from role
and position of the Master Station in monitoring and regulating the electricity load,
especially in the West Java region, the sustainability and availability of the Master
Station functions is a top priority. In an effort to increase the availability of the Master
Station function, the author is given the main task in carrying out this Industrial
Experiences to implement a mobile monitoring system based on the Telegram Bot by
utilizing status data and data communication points from each electric substation in
the West Java region obtained from the Remote Station. This telegram bot will
function to send the names of electric substations that are currently in out of poll
condition (not monitored by Master Station) and send data points of communication
from all electric substations in West Java (file in .csv format). Both of these bot
v
functions are performed when the bot receives messages with certain unique codes
from the user. In carrying out this task, the author uses the CentOS7 operating system
from Linux which adjusts to the operating system used by the server of PT. PLN
(Persero) UP2B Jabar and using the Lua programming language in processing data
and also to make the Telegram Bot with MTProto bot mode.
With work on the task that starts from the fourth week of the implementation of
industrial experiences, the author successfully completes the tasks that given
according to the specifications given by the supervisor. The monitoring system based
on Telegram Bot was successfully made and can perform functions as planned.
Key words: Master Station, Electric Substation, Telegram Bot, Telegram Client,
Operational State, Data Point.
vi
KATA PENGANTAR
Puji syukur penulis panjatkan ke hadirat Allah Subhanahu wa Ta’ala, yang atas rahmat
dan karunia Nya penulis dapat menyelesaikan penulisan laporan kerja praktek ini.
Shalawat dan salam semoga tercurah kepada Rasulullah Shallallahu ‘alaihi wasallam.
Selama melaksanakan kerja praktek ini, penulis mendapat bantuan dan dukungan dari
berbagai pihak. Untuk itu, penulis ingin mengucapkan terima kasih kepada:
1. PT. PLN (PERSERO) UP2B JABAR, yang telah memberikan kesempatan
kepada penulis untuk melaksanakan kerja praktek di perusahaan ini;
2. bapak M. Tresna Wikarsa, manajer PT. PLN (Persero) UP2B Jabar;
3. bapak Erwan Kurniawan, manajer bidang FASOP PT. PLN (Persero) UP2B
Jabar;
4. bapak Muhammad Muhlis, asisten manajer bidang FASOP PT. PLN (Persero)
UP2B Jabar yang juga selaku pembimbing utama dalam pelaksanaan kerja
praktek;
5. mas Dimas Panca Nur Adi dan mas Prayogo Kukuh Rindiarto, yang telah
memberikan bimbingan dalam menyelesaikan kerja praktek ini;
6. ibu Aciek Ida Wuryandari, selaku dosen mata kuliah EL4092;
7. Raditya Priyongga, selaku rekan kerja praktek yang telah saling membantu
dalam melaksanakan kerja praktek;
8. seluruh staf dan karyawan PT. PLN (Persero) UP2B Jabar yang telah
memberikan banyak sekali bantuannya;
9. dan semua pihak lain yang telah membantu dalam pelaksanaan kerja praktek;
Penulis menyadari bahwa kerja praktek ini bukanlah tanpa kelemahan, untuk itu kritik
dan saran sangat diharapkan.
Akhir kata, semoga laporan kerja praktek ini dapat bermanfaat bagi para pembacanya.
vii
DAFTAR ISI
Halaman
viii
Halaman
ix
DAFTAR GAMBAR
Halaman
Gambar 2.1 Logo PT. PLN (Persero) ...................................................................4
Gambar 3.1 Blok Diagram Sistem SCADA ...........................................................7
Gambar 3.2 Konfigurasi Master Station ................................................................8
Gambar 3.3 Konfigurasi Remote Terminal Unit................................................... 13
Gambar 4.1 Diagram Alir Langkah Pengaturan Akun Telegram sebagai Bot ....... 19
Gambar 4.2 Diagram Alir Algoritma Bot secara Umum ...................................... 21
Gambar 4.3 Diagram Alir Algoritma Fungsionalitas 1 dari Bot ........................... 22
Gambar 4.4 Diagram Alir Algoritma Fungsionalitas 2 dari Bot ........................... 23
Gambar 4.5 Potongan Isi File Teks yang Berisi Data Telemetering dan Status
Gardu-Gardu Induk .........................................................................26
Gambar 4.6 Potongan Isi File Teks yang Berisi Data Point Komunikasi Master
Station dengan Gardu-Gardu Induk ..................................................31
Gambar 4.7 Hasil Isi File Data Point Komunikasi yang Diharapkan.................... 32
Gambar 4.8 Representasi dari Proses Merapikan String untuk Setiap Line dari Isi
File .................................................................................................. 37
Gambar 4.9 Tampilan pada User saat Pengujian Bot .......................................... 38
Gambar 4.10 Tampilan pada Server saat Pengujian Bot ...................................... 39
Gambar 4.11 Tampilan pada Server saat Pengujian Bot ...................................... 39
x
DAFTAR TABEL
Halaman
Tabel 3.1 Kelebihan dan Kekurangan Bot Telegram dengan Mode API ..............16
xi
DAFTAR SINGKATAN
Pemakaian
SINGKATAN Nama pertama kali pada
halaman
Persero Perusahaan Perseroan i
PLN Perusahaan Listrik Negara i
BUMN Badan Usaha Milik Negara ii
UP2B Unit Pelaksana Pengatur Beban ii
Jabar Jawa Barat ii
Supervisory Control and Data
SCADA ii
Acquisition
CSV Comma Separated Values iii
RTU Remote Terminal Unit 7
RCC Region Control Center 7
GPS Global Position System 8
DTS Dispatcher Training Simulator 8
LAN Local Area Network 8
EMS Energy Management System 8
LCD Liquid Crystal Display 10
HMI Human Machine Interface 11
AO Analog Output 12
AI Analog Input 12
DO Digital Output 12
DI Digital Input 12
CD Catu Daya 12
Community Enterprise Operating
CentOS 13
System
RHEL Red Hat Enterprise 13
API Application Programming Interface 15
xii
DAFTAR LAMPIRAN
Halaman
LAMPIRAN A: Yang Berkaitan dengan Pelaksanaan Kerja Praktek ............................ 45
A.1 Surat Tanda Diterima Kerja Praktek .................................................................. 45
A.2 Detil Pelaksanaan Kerja Praktek ........................................................................ 46
A.3 Dokumentasi Tambahan di Tempat Kerja Praktek ............................................... 48
A.4 Surat Tanda Telah Selesai Kerja Praktek ............................................................ 49
A.5 Formulir Evaluasi Kerja Praktek ....................................................................... 50
LAMPIRAN B: Yang Berkaitan dengan Tugas Kerja Praktek ..................................... 51
B.1 Scipt Lengkap Bot Telegram ............................................................................. 51
xiii
1
BAB I
PENDAHULUAN
PT. PLN (Persero) merupakan perusahaan BUMN yang memiliki tanggung jawab
sebagai penyedia sistem ketenagalistrikan nasional untuk dapat menyediakan
tenaga listrik ke seluruh wilayah Indonesia. Sistem ketenagalistrikan harus terus
dikelola mulai dari unit pembangkitan listrik hingga listrik dapat digunakan oleh
seluruh rakyat Indonesia.
PT. PLN (Persero) UP2B Jabar merupakan salah satu dari lima unit pelaksana
pengatur beban yang bertugas dalam hal pengelolaan operasi sistem tenaga listrik
dan pengaturan penyaluran tenaga listrik dari unit pembangkitan hingga menuju
beban-beban yang terdiri dari 112 gardu induk yang tersebar di seluruh wilayah
Jawa Barat sebagai titik operasi pengelolaan dan penyaluran tenaga listrik.
Oleh karena itu, penulis mengangkat judul laporan kerja praktek “Implementasi
Sistem Monitoring Gardu Induk Se-Jawa Barat Secara Mobile Berbasis Bot
Telegram”.
2
1.2 Tujuan
Agar pelaksanaan kerja praktek menjadi efektif serta sasaran utama dapat tercapai,
maka sistem SCADA yang dipelajari hanya melingkupi Master Station dan Remote
Station secara umum. Kemudian, fitur bot telegram yang dibuat hanya terdiri dari
dua, yaitu untuk mengirimkan nama-nama gardu induk yang sedang dalam kondisi
out of poll serta mengirimkan data point dari seluruh gardu induk (berformat .csv)
yang telah dirapihkan dengan menggunakan script code bahasa Lua.
• Debugging
Setiap kali ditemukan permasalahan dalam pengujian program, dilakukan
debugging terhadap script yang telah dibuat agar permasalahan yang muncul
dapat teratasi.
Secara garis besar, sistematika penulisan dalam pembuatan Laporan ini adalah
sebagai berikut:
BAB 1 PENDAHULUAN, bab ini menguraikan penjelasan mengenai latar
belakang masalah, tujuan, lingkup permasalahan, metodologi pelaksanaan serta
sistematika penulisan laporan yang menggambarkan secara umum bab-bab yang
ada di dalam laporan kerja praktek ini.
BAB II PROFIL PERUSAHAAN, bab ini membahas profil dari perusahaan
tempat penulis melaksanakan kerja praktek yang terdiri dari profil singkat, visi,
misi, struktur pembagian unit, serta anak-anak perusahaan PT. PLN (Persero).
BAB III TINJAUAN PUSTAKA, bab ini membahas mengenai pemahaman teori
yang dapat menunjang isi dari laporan kerja praktek ini. Diantaranya menjelaskan
sistem dari SCADA beserta elemen-elemen pendukungnya, aplikasi messenger
telegram serta elemen-elemen yang dibutuhkan dalam pembuatan bot telegram.
BAB IV PELAKSANAAN, HASIL DAN ANALISIS, bab ini menguraikan hal-
hal yang dilakukan penulis untuk melaksanakan tugas, hasil-hasil yang didapat
beserta pembahasan analisis dari hasil yang didapat.
BAB V PENUTUP, bab ini mengemukakan kesimpulan dari pelaksanaan kerja
praktek dan saran-saran terhadap keberjalanan kerja praktek, tugas yang dikerjakan,
ataupun kinerja perusahaan terkait agar dapat dijadikan pembelajaran serta
perkembangan bagi penulis, pembaca, serta pihak perusahaan.
4
BAB II
PROFIL PERUSAHAAN
BAB III
TINJAUAN PUSTAKA
3.1 SCADA
SCADA merupakan singkatan dari Supervisory Control and Data Acquisition.
SCADA merupakan sistem yang melakukan pengawasan (monitoring),
pengontrolan serta pengumpulan data dari suatu proses atau sistem tertentu.
SCADA dapat diimplementasikan dalam sistem transmisi listrik tegangan tinggi
dengan melakukan monitoring terhadap kondisi dan hasil telemetering untuk
beberapa gardu induk. Sistem SCADA terdiri dari 3 bagian utama yaitu: Master
Station atau Region Control Center (RCC), Remote Station atau Remote Terminal
Unit (RTU), dan Link Komunikasi Data antara Master Station dengan RTU.
2.2.1 Server
2.2.2 Workstation
2.2.3 LAN
LAN (Local Area Network) berfungsi sebagai jaringan komunikasi yang digunakan
untuk interkoneksi peralatan dalam suatu area lokal. Terdiri dari:
• Switch, berfungsi menghubungkan antar komputer dan komputer ke peripheral
dalam satu LAN.
• Router, berfungsi meneruskan paket data dari suatu LAN ke LAN lainnya yang
berada di luar control center.
terdiri dari:
• Power Supply, berfungsi mensuplai daya listrik ke peralatan.
• GPS, berfungsi menerima sinyal pewaktuan dari satelit yang kemudian
dijadikan sebagai acuan waktu.
• Master Clock, digunakan untuk sinkronisasi waktu secara manual.
• Storage, berfungsi sebagai media penyimpan data, backup operating system,
backup program, dan backup database.
• Projector, digunakan untuk menampilkan informasi jaringan atau kondisi
komponen jaringan yang ada di ruang rapat atau ruang operasi kondisi darurat.
• Static Display, terdiri dari satu buah komputer beserta satu sampai tiga LCD
yang bertujuan untuk menampilkan waktu dan atau besaran listrik.
• Recorder, berfungsi untuk merekam semua pembicaraan dispatcher melalui
semua media komunikasi yang digunakan.
2.2.5 Aplikasi
terdiri dari:
• Aplikasi SCADA, untuk menampilkan fungsi SCADA (telemetering,
telesignaling, remote control).
• Aplikasi Historikal Data, untuk menyimpan data dalam waktu tertentu.
11
RTU adalah suatu perangkat komputer yang dipasang di remote station atau
dilokasi jaringan yang dipantau oleh control center. Sedangkan remote station
adalah stasiun yang dipantau, atau diperintah dan dipantau oleh master station.
Secara umum, fungsi dari RTU adalah sebagai pengumpul data yang datang dari
gardu induk/pembangkit dan memproses data/instruksi yang diterima dari control
center. Adapun fungsi dari RTU dapat dibagi menjadi 3 bagian, diantaranya:
• Telesignaling, digunakan untuk mengetahui posisi atau status peralatan-
peralatan di remote station, seperti: PMT (Circuit Breaker), PMS
(Disconnecting Switch), Signal Alarm, dan sebagainya.
• Telemetering, digunakan untuk mengukur suatu besaran listrik (MW, MVAR,
KV, A, Hz, dan sebagainya)
• Telecontrol, digunakan untuk memberikan perintah keluar/masuk secara remote
dari master station terhadap peralatan-peralatan di remote station, seperti:
On/Off untuk PMT, Star/Stop untuk Unit Generator, dan lain-lain.
Bagian-bagian utama dari sebuah RTU terdiri dari: Modul CPU, Modul I/O, Modul
Komunikasi, dan Modul Power Supply.
Modul ini berfungsi sebagai pusat pengolah data dan sekaligus sebagai penyimpan
program dan data, modul ini dilengkapi dengan mikroprosesor untuk memproses
semua program aplikasi, menyimpan data aplikasi maupun database dan dilengkapi
dengan komunikasi interface yang dapat berkomunikasi dengan laptop untuk
melakukan download maupun upload data.
12
Modul catu daya atau power supply ini diperlukan untuk mendistribusikan
kebutuhan catu tegangan ke masing-masing modul. Agar tegangan dan daya yang
diperlukan oleh masing-masing modul dapat terpenuhi.
2.4 CentOS
2.5 Telegram
2.6 Telegram-cli
Bot merupakan script/software yang dapat menjalankan suatu tugas tertentu secara
otomatis melalui Internet. Pada umumnya, bot dibuat untuk menangani kegiatan
yang biasanya dilakukan manusia. Salah satu platform yang dapat
diimplementasikan bot didalamnya adalah sosial media khususnya yang berupa
aplikasi layanan pengiriman pesan (messenger). Bot semakin marak digunakan
15
Salah satu messenger yang sedang marak dalam penggunaan bot adalah Telegram.
Dengan beberapa kelebihan yang dimiliki Telegram dibanding messenger lain yang
sejenis, maka banyak orang yang lebih memilih untuk membuat bot pada messenger
ini. Selain itu, bot telegram juga cenderung lebih mudah dibuat dibandingkan bot
pada messenger modern sejenisnya, seperti Whatsapp, Line, Facebook, dan
sebagainya. Oleh karenanya, bot telegram menjadi bot masa kini yang marak
digunakan.
Bot ini merupakan bot yang dibuat dengan memanfaatkan aplikasi telegram-cli,
menggunakan akun resmi pada umumnya seperti user biasa sehingga memiliki fitur
yang sama layaknya akun untuk user biasa. Bot ini merupakan akun untuk user
biasa yang dimodifikasi sedemikian rupa, sehingga dapat dipergunakan menjadi
aplikasi yang diperuntukkan untuk menjalakan perintah tertentu, memproses pesan,
dan sebagainya secara otomatis. Namun, bot jenis ini tidak secara resmi didukung
oleh telegram, hanya dibuat secara kontribusi dan bahkan pengembangannya pun
dapat dikatakan telah terhenti.
Pada awal perkembangan dunia bot di Telegram, hampir seluruh bot dibuat dengan
menggunakan aplikasi Telegram-cli dan Bahasa Lua. Namun seiring dengan
berjalannya waktu, manfaat dari bot telegram didukung oleh pihak Telegram yang
kemudian meluncurkan Bot API, tujuannya agar lebih banyak orang yang dapat
membangun bot dengan menggunakan Bahasa pemrograman yang mereka kuasai
tanpa harus berhubungan dengan telegram-cli.
16
Sehingga, bot ini merupakan bot resmi yang disediakan oleh developer telegram.
Bot jenis ini dibuat dengan menggunakan akun khusus yang difasilitasi oleh
telegram untuk digunakan sebagai bot, berbeda dengan akun yang digunakan untuk
user biasa. Beberapa kelebihan dan kekurangan dari bot jenis ini diantaranya:
Lua merupakan bahasa pemrograman dinamis yang cukup populer dan sangat
banyak digunakan dalam dunia pengembangan aplikasi/game berbasis mobile. Lua
sendiri adalah bahasa pemrograman yang ringan, efisien, namun powerful. Bahasa
ini pertama kali dikembangkan di Brazil pada tahun 1993 oleh beberapa orang di
Tecgraf, University of Rio de Janerio berdasarkan permintaan dari perusahaan
Petrobas untuk simulasi data pada salah satu aplikasi yang dimilikinya. Hingga kini,
penggunaan Lua sudah berkembang sangat pesat.
Pada Microsoft Excel, file ini dapat dikonversi kedalam bentuk spreadsheet.
Konversi ini akan mengubah bentuk file menjadi tabel-tabel, dengan setiap
semicolon dari file CSV akan berubah menjadi kolom.
18
BAB IV
Dan berikut command/script yang penulis gunakan untuk memasang Lua pada
CentOS.
wget https://centos7.iuscommunity.org/ius-release.rpm
rpm -Uvh ius-release.rpm
yum install lua53u
19
Secara umum, mekanisme untuk membuat Bot Telegram yang dilakukan penulis
ditunjukkan oleh flowchart berikut.
Menjalankan telegram client melalui terminal dalam mode root dengan script
"bin/telegram-cli"
Membuat file baru berformat .lua sebagai script untuk mengatur aktivitas dari
bot yang akan dibuat. Simpan pada directory sistem dari telegram-cli
"cd/root/tg"
Buat script yang sesuai dengan fungsionalitas dari bot yang akan dibuat
Gambar 4.1 Diagram Alir Langkah Pengaturan Akun Telegram sebagai Bot
20
Dalam melaksanakan tugas ini, penulis diminta untuk memfungsikan sebuah akun
telegram sebagai bot yang akan mengirimkan nama-nama gardu induk yang dalam
kondisi out of poll pada 30 menit terakhir. Penulis diminta untuk memanfaatkan
data yang dikirimkan dari remote station menuju master station yang terdiri dari
data Analog dan Digital mengenai kondisi seluruh remote station di Jawa Barat.
Data tersebut selalu diterima master station setiap periode waktu 30 menit, dan data
akan selalu disimpan pada direktori server dari master station dengan format nama
yang sesuai dengan periode waktu dikirimnya data dari remote station. File ini
merupakan file teks (berformat .lst) yang berisi kurang lebih 12.000 lines. Untuk
melaksanakan tugas ini, penulis hanya memanfaatkan isi data yang
menginformasikan data digital dari remote station, khususnya status dari
keterpantauan remote station tersebut oleh master station. Dalam melaksanakan
tugas ini, penulis dituntut untuk dapat membuat algoritma parsing data yang baik
dari file teks tersebut hingga dapat memberikan output berupa beberapa nama gardu
induk yang dalam kondisi out of poll untuk rentang waktu 30 menit terakhir, sebagai
contoh jika pengecekan oleh user dilakukan pada pukul 17.45, maka bot akan
memberikan nama-nama gardu induk yang dalam kondisi out of poll pada rentang
waktu 17.00 hingga 17.30.
Fungsi lain dari bot ini adalah untuk mengirimkan data point komunikasi antara
master station terhadap masing-masing remote station. File ini merupakan file teks
berformat .csv berisi sekitar 100.000 lines yang isinya akan selalu tetap selama
tidak ada perubahan data point komunikasi terhadap suatu remote station. Sebelum
file ini dikirimkan, pembimbing menginginkan jika file tersebut dirapihkan terlebih
dahulu agar sesuai dengan format yang diinginkan. Sebelumnya file ini dirapihkan
secara manual pada Microsoft Excel, namun hal ini tentu sangat memakan waktu.
Sehingga pembimbing memberikan tugas kepada penulis untuk membuat script
program yang dapat merapikan file ini secara otomatis dengan cepat. Untuk dapat
melaksanakan tugas ini, penulis dituntut untuk dapat melakukan pengolahan string
dengan baik. Untuk menyelaraskan dalam penggunaan bahasa pemrograman, maka
penulis memutuskan tetap menggunakan Bahasa Lua untuk melakukan pengolahan
string dari file tersebut.
21
Script diatas merupakan script untuk membalas pesan dari user berupa kode
“!help”. Dengan script ini, bot akan membalas pesan kode tersebut dengan deskripsi
mengenai fungsionalitas dari bot.
Potongan script diatas menunjukkan jika fungsionalitas ini akan dijalankan jika bot
menerima pesan dengan kode “!check” dari user. Kode tersebut dikirimkan oleh
user untuk meminta daftar gardu-gardu induk yang dalam kondisi out of poll dalam
30 menit terakhir kepada bot. Saat menerima pesan dengan kode tersebut, pertama
bot akan menentukan nama file teks (yang berisi data telemetering dan status gardu-
gardu induk) mana yang akan dibuka berdasarkan waktu diterimanya pesan,
25
penentuan nama file ini dilakukan dengan pembacaan waktu server dengan fungsi
os.date(), kemudian waktu yg didapat dari fungsi tersebut (berupa string) diolah
agar didapatkan nama hari, tanggal, dan jam secara terpisah yang disesuaikan
dengan format nama file tersebut pada sistem SCADA, yaitu
“MESSAGE_SQL_HARI_TANGGAL_JAM.lst”. Pengolahan waktu untuk
mendapatkan tanggal dan jam yang sesuai format dilakukan dengan menggunakan
fungsi giveDate(), dan giveTime() dengan potongan script-nya sebagai berikut.
function giveDate()
local day, month, year
day = string.sub(os.date(), 9, 10)
if (string.sub(os.date(), 5, 7) == "Jan") then
month = "01"
elseif (string.sub(os.date(), 5, 7) == "Feb") then
month = "02"
elseif (string.sub(os.date(), 5, 7) == "Mar") then
month = "03"
elseif (string.sub(os.date(), 5, 7) == "Apr") then
month = "04"
elseif (string.sub(os.date(), 5, 7) == "May") then
month = "05"
elseif (string.sub(os.date(), 5, 7) == "Jun") then
month = "06"
elseif (string.sub(os.date(), 5, 7) == "Jul") then
month = "07"
elseif (string.sub(os.date(), 5, 7) == "Aug") then
month = "08"
elseif (string.sub(os.date(), 5, 7) == "Sep") then
month = "09"
elseif (string.sub(os.date(), 5, 7) == "Oct") then
month = "10"
elseif (string.sub(os.date(), 5, 7) == "Nov") then
month = "11"
else
month = "12"
end
year = string.sub(os.date(), 21, 24)
return(year .. month .. day)
end
function giveTime()
local hour, minute
hour = string.sub(os.date(), 12, 13)
if (tonumber(string.sub(os.date(), 15, 16)) > 30) then
minute = "30"
else
minute = "00"
end
return(hour .. minute)
end
Pada kedua fungsi diatas, dilakukan pengolahan string dengan hanya mengambil
data yg diperlukan dari keluaran fungsi “os.date()”, pada fungsi giveDate() akan
26
diambil data perihal tanggal dan pada fungsi giveTime() diambil data perihal waktu.
pengambilan sebagian data dari keluaran fungsi os.date() dilakukan dengan
menggunakan fungsi string.sub(string, urutan dari huruf awal dalam
string, urutan dari huruf akhir dalam string). Untuk data bulan, karena
diubah menjadi angka 30 atau 00, karena nama file pada server hanya diantara
kedua waktu menit tersebut, berhubung file teks ini diterima server dalam 30 menit
sekali. Setelah nama file dibuat, file lalu dibuka dengan menggunakan fungsi
assert(io.open("(nama file beserta directorynya"), "r")).
Gambar 4.5 Potongan Isi File Teks yang Berisi Data Telemetering dan Status
Gardu-Gardu Induk
Beberapa bagian penting dari isi file ini untuk setiap line diantaranya terdiri dari
waktu update kondisi gardu induk, nama gardu induk beserta level tegangannya,
dan keterangan mengenai data yg diperiksa beserta nilai atau kondisinya.
Setelah file dibuka, dilakukan pembacaan isi file untuk menyimpan nama-nama
gardu induk yang terdapat pada file tersebut ke dalam sebuah array, dilakukan
dengan potongan script berikut.
27
Script diatas akan melakukan parsing data string untuk setiap line yang bertujuan
untuk mengambil nama gardu induk dalam setiap line. Penulis membuat variabel
bernama line_for_search untuk menyimpan string dari setiap line yang akan
dilakukan parsing data dengan menggunakan fungsi file:read("*line").
Setelah parsing untuk nama gardu berhasil dilakukan, nama gardu tersebut
disimpan ke dalam array search = {}. Selanjutnya, nama gardu yang baru
disimpan tersebut akan diperiksa apakah sudah tersimpan didalam array atau
belum. Jika nama gardu sudah ada di dalam array, maka orde elemen dari array
tidak akan ditambah, sehingga pada parsing data line selanjutnya isi dari array pada
orde sebelumnya akan digantikan dengan nama gardu hasil parsing data dari line
setelahnya. Sedangkan jika nama gardu belum ada pada array, maka orde dari array
akan ditambah dengan tujuan untuk menambah ukuran array yang akan digunakan
sebagai penampung nama gardu dari hasil parsing line setelahnya. Parsing ini
dilakukan berulang secara berurutan dari line pertama hingga line terakhir pada file,
yakni setelah program tidak lagi mendeteksi terdapat line pada file.
Setelah seluruh nama-nama gardu induk berhasil disimpan ke dalam array search
= {}, akan dilakukan pencarian mengenai gardu-gardu mana saja yang kondisi
terakhirnya adalah out of poll. Potongan script untuk menjalankan fungsi ini adalah
sebagai berikut.
..
..
out_of_poll = "Gardu Induk yang dalam kondisi out of poll
pada " .. string.sub(os.date(),9,10) .. " "..
string.sub(os.date(),5,7) .. " " ..
string.sub(os.date(),21,24) .. " sampai pukul " ..
string.sub(giveTime(),1,2) .. ":" ..
string.sub(giveTime(),3,4) .. " diantaranya:"
while (j<i) do
found_down = false
file =
assert(io.open("/home/arbi/Documents/KP/MESSAGES_SQL_"..
day .."_".. date .."_".. time ..".lst", "r"))
while(true) do
local line = file:read("*line")
if not line then
break
end
if (string.find(line, search[j])) then
if (string.find(line, "Operational State")) then
if (string.find(line, "down")) then
found_down = true
end
29
Nama-nama gardu induk yang dalam kondisi out of poll akan disimpan dalam
variabel string dengan nama out_of_poll. Variabel tersebut diinisialisasi isinya
dengan format pengiriman pesan kepada user yakni “Gardu Induk yang dalam
kondisi out of poll pada (Tanggal) sampai pukul (Jam waktu 30 menit terakhir)
diantaranya:”, dengan tanggal dan jam diambil dari parsing data terhadap keluaran
dari fungsi os.date() dan memanfaatkan kembali fungsi giveTime(). Variabel ini
isinya akan ditambah dengan nama-nama gardu yang dalam kondisi out of poll,
sehingga isi dari variabel inilah yang akan dikirimkan sebagai pesan kepada user.
Pencarian gardu-gardu yang dalam kondisi out of poll dilakukan dengan
memanfaatkan nama-nama gardu yang sebelumnya telah disimpan dalam array
search = {}. Seluruh nama gardu pada array tersebut akan dicari mengenai
kondisi keterpantauannya oleh master station secara bergantian satu per satu.
Gardu induk yang dalam kondisi out of poll dapat diketahui jika status terakhir yang
tertulis pada bagian Operational State dalam file tersebut adalah “down”, ini
menunjukkan jika gardu induk sedang tidak dalam pengawasan master station.
Status tersebut akan berubah menjadi up jika gardu telah kembali dalam
pengawasan master station, sehingga gardu yang kondisinya out of poll dalam 30
menit terakhir ditunjukkan dengan kondisi operational state terakhirnya down. Jika
nama gardu dari array search = {} memenuhi kondisi tersebut, maka nama gardu
tersebut akan dimasukkan ke dalam variabel out_of_poll sebagai nama gardu
yang kondisinya out of poll dalam 30 menit terakhir. Penulis membuat variabel
30
Setelah nama-nama gardu yang dalam kondisi out of poll dalam 30 menit terakhir
didapatkan dan telah disimpan dalam variabel out_of_poll, maka akan dikirimkan
isi dari variabel tersebut sebagai pesan untuk menjawab permintaan user.
Pengiriman pesan kepada user dilakukan dengan menggunakan potongan script
berikut.
..
..
-- Print all of Gardu Induk that in out of poll condition
and send it to user
send_msg(peer, out_of_poll, ok_cb, false)
end)
..
..
Potongan script diatas menunjukkan jika fungsionalitas ini akan dijalankan jika bot
menerima pesan dengan kode “!point” dari user. Saat bot menerima pesan dengan
kode tersebut, pertama bot akan membuka file teks berformat .csv, berisi data point
komunikasi yang telah tersimpan pada server, file tersebut bernama
ALL_IFSPOINT.csv. Fungsi untuk melakukan pembukaan file sama dengan fungsi
yang digunakan pada fungsionalitas bot yang pertama.
Gambar 4.6 Potongan Isi File Teks yang Berisi Data Point Komunikasi
Master Station dengan Gardu-Gardu Induk
Isi file tersebut merupakan default isi file yang disimpan dari sistem SCADA PT.
PLN (Persero) UP2B Jabar. Agar isi file menjadi lebih rapi dan menambah tingkat
keterbacaannya, maka ingin dilakukan perapihan isi file dengan memberi judul pada
kolom pertama, menghilangkan beberapa line serta kolom yang tidak diperlukan,
serta memberi tambahan kolom kosong baru. Berikut representasi dari hasil isi file
yang diharapkan (dalam tampilan tabel spreadsheet).
32
Gambar 4.7 Hasil Isi File Data Point Komunikasi yang Diharapkan
Pembimbing menginginkan keluaran hasil dari file yang dirapikan seperti yang
ditampilkan pada gambar 4.7, terlihat jika terdapat beberapa kolom yang ingin
dihilangkan, dan ditambahkan kolom kosong baru dengan judul “HNZ”.
Diharapkan hasil dari file yang dirapikan ini dapat langsung menjadi file
spreadsheet berformat .xlsx, namun penulis belum menemukan metode yang tepat
untuk mengerjakannya, sehingga diputuskan jika hasil file yang dirapikan tetap
berformat .csv.
Setelah file dibuka, dilakukan pembacaan isi file untuk menghitung jumlah line
yang perlu dirapikan (line yang mengandung tanda semicolon), hal ini dilakukan
karena terdapat line yang isinya tidak diperlukan. Jumlah dari line tersebut
disimpan dalam sebuah variabel increment yang dinamakan i. Setelah perhitungan
line berhasil dilakukan, file ditutup terlebih dahulu agar dapat dilakukan pembacaan
file dari awal kembali pada langkah selanjutnya. Script yang melakukan algoritma
ini adalah sebagai berikut.
..
i = 0
-- Count how many lines in file that contain the text that
must be edited
while (true) do
local line = file:read("*line")
if not line then
break
end
if (string.find(line, ";")) then
i = i+1
end
end
--Close File
io.close(file)
..
33
Setelah jumlah line yang perlu dirapikan didapatkan, proses merapikan file pun
dimulai. Script yang digunakan untuk proses ini adalah sebagai berikut.
--Open CSV file again
local file =
assert(io.open("/home/arbi/Documents/KP/ALL_IFSPOINT.csv", "r"))
--Make new CSV file to save the text that has been edited
from the file above
os.remove("/home/arbi/Documents/KP/ALL_IFSPOINT_NEW.csv")
local file2 =
assert(io.open("/home/arbi/Documents/KP/ALL_IFSPOINT_NEW.csv",
"w"))
--Make the first column of the new CSV file
file2:write("PAIR;CHANNEL;NO
RTU;B1;B2;B3;ELEMENT;INFO;HNZ;MONITORING ADDRESS;MON TYPE;CUR
IN;HNZ;CONTROL ADDRESS;CON TYPE;CUR OUT;SEL BEF;CMD
DUR;GI;ISS;DB;THRES;INV;ZERO RANGE;")
k = 0
sublines = "" --to save the edited text from each line
sisa = "" --to save the text of the line that hasn't been
edited
temp = "" --to save string from variabel "sisa" temporary
while (k < i) do
local line = file:read("*line")
-- Detect line with text that must be edited
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
sub_lines = sub_lines ..
" ;" ..(string.sub(sisa, 1, ((string.find(sisa, ";", 1))-1))) ..
"."
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
sub_lines = sub_lines ..
" ;" ..(string.sub(sisa, 1, ((string.find(sisa, ";", 1))-1))) ..
"."
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
35
Proses dimulai dengan membuka kembali file data point komunikasi yang telah
ditutup sebelumnya. Penulis memilih untuk membuat file baru sebagi tempat untuk
menyimpan isi file yang telah dirapikan, sehingga dibuat file baru dengan nama
“ALL_IFSPOINT_NEW.csv”. Sebelum file baru tersebut dibuat, diperiksa dahulu
apakah pada server sudah terdapat file dengan nama yang sama, jika file dengan
nama tersebut telah ada maka script akan menghapus file tersebut dengan fungsi
os.remove("directory dan nama file"). Pembuatan file baru dilakukan
file, fungsi ini juga sekaligus membuka file yang baru dibuat. File yang baru dibuat
ini diberi nama variabel file yang berbeda dengan file awal, yaitu dengan nama
file2, sedangkan file awal dinamakan file.
Setelah kedua file dibuka, pada file2 diberi judul pada kolom terbaru dahulu
dengan menggunakan fungsi file2:write("PAIR;CHANNEL;NO
RTU;B1;B2;B3;ELEMENT;INFO;HNZ;MONITORING ADDRESS;MON TYPE;CUR
IN;HNZ;CONTROL ADDRESS;CON TYPE;CUR OUT;SEL BEF;CMD
DUR;GI;ISS;DB;THRES;INV;ZERO RANGE;"). Selanjutnya, dibuat beberapa
variabel yang dibutuhkan, diantaranya variabel increment bernama k yang
37
berfungsi untuk menghitung jumlah line yang telah dirapikan, variabel bernama
sub_lines yang berfungsi untuk menyimpan hasil string yang telah dirapikan
untuk setiap line, variabel bernama sisa yang berfungsi untuk menyimpan string
yang belum dirapikan, dan variabel bernama temp yang berfungsi untuk
menyimpan isi dari variabel sisa secara sementara selama isi dari variabel sisa
mengalami perubahan. Isi dari file dirapikan satu per satu secara bergantian hingga
increment k melebihi nilai increment i yang telah dihitung sebelumnya, yakni
jumlah line yang perlu dirapikan. Variabel increment k akan bertambah setiap
berhasilnya merapikan string dari setiap line yang perlu dirapikan.
Representasi proses merapikan file yang dilakukan potongan script diatas adalah
seperti ditampilkan pada gambar berikut.
Gambar 4.8 Representasi dari Proses Merapikan String untuk Setiap Line
dari Isi File
Proses merapikan file yang ditampilkan pada gambar diatas dilakukan dengan
mengkombinasikan fungsi string.sub(), string.find(), dan fungsi untuk
menggabungkan string dalam bahasa lua ("string1" .. "string2"). Diawal
setiap variabel sub_lines untuk setiap line ditambahkan string “\n” di bagian awal,
hal ini ditujukan untuk memberi enter untuk setiap pergantian line. Setelah proses
merapikan ini berhasil dilakukan untuk sebuah line dari isi file, maka isi dari
variabel sub_lines dituliskan ke file baru yang telah dibuat (file2), isi dari
variabel sub_lines dikosongkan kembali untuk menyimpan hasil dari proses
merapikan line selanjutnya. Proses ini dilakukan terus menerus untuk setiap line
yang harus dirapikan sampai proses ini dilakukan untuk seluruh line yang harus
dirapikan. Setelah proses merapikan berhasil dan hasilnya dituliskan di file yang
baru yaitu ALL_IFSPOINT_NEW.csv, maka script akan menutup kedua file yang
sedang dibuka.
38
Setelah file baru yang berisi data point komunikasi yang telah dirapikan berhasil
dibuat, selanjutnya file tersebut akan dikirimkan kepada user untuk melengkapi
fungsionalitas bot yang kedua ini. Potongan script yang digunakan untuk
mengirimkan file ini adalah sebagai berikut.
..
..
send_msg(peer, "Sending File...", ok_cb, false)
send_document(peer,
"/home/arbi/Documents/KP/ALL_IFSPOINT_NEW.csv", ok_cb, false)
end)
..
..
Script diatas akan memberi informasi kepada user jika file data point komunikasi
telah berhasil dirapikan dan file tersebut sedang dikirimkan yang ditandai dengan
dikirimkannya pesan “Sending File…” kepada user. Pengiriman file kepada user
dilakukan dengan menggunakan fungsi send_document().
Selanjutnya bot diuji dengan mengirim pesan dengan kode “!help” yang bertujuan
untuk meminta keterangan akan fungsionalitas dari bot. Dari gambar tampilan
server dan user diatas, dapat dilihat jika server dapat menerima pesan kode “!help”
yang dikirimkan dari user dan berhasil menjawab pesan tersebut dengan informasi
mengenai fungsionalitas bot, dan user pun dapat menerima pesan balasan tersebut.
Lalu, pengujian dilanjutkan dengan menguji salah satu fungsionalitas dari bot, yaitu
mengirimkan nama-nama gardu induk yang dalam kondisi out of poll dalam 30
menit terakhir. Pengujian diawali dengan user yang mengirimkan pesan dengan
kode “!check”. Pada pengiriman pesan pertama, terlihat jika server tidak membalas
pesan yang dikirimkan oleh user, hal ini dikarenakan penulis sengaja menghapus
terlebih dahulu file data hasil pembacaan telemetering dan status gardu-gardu induk
yang sesuai dengan tanggal pengiriman pesan oleh user. Tujuan penulis melakukan
hal tersebut adalah agar dapat memperlihatkan jika program bot ini benar akan
membuka file dari remote station tersebut dengan nama file yang sesuai waktu
penerimaan pesan dari user. Pada pengujian ini, user mengirimkan pesan pada hari
Sabtu, 7 September 2019 pukul 17.51. Dari hasil pengujian pada tampilan server,
terlihat jika saat program ingin membuka file dengan nama yang sesuai dengan
waktu penerimaan pesan dari user (30 menit terakhir sebelumnya) yaitu
“MESSAGE_SQL_SAT_20190907_1730.lst”, program tidak dapat menemukan
file tersebut, sehingga program tidak dapat meneruskan untuk menentukan status
terkini dari tiap-tiap gardu induk.
Beberapa detik kemudian, penulis mengembalikan kembali file yang telah dihapus
dan diuji kembali fungsionalitas bot dengan mengirimkan kode yang sama dengan
sebelumnya (pesan kode “!check”). Pada pengujian yang kedua ini, terlihat jika bot
berhasil membuka file yang diinginkan, dan berhasil melakukan parsing data untuk
isi file tersebut sehingga didapat nama-nama gardu induk yang dalam kondisi out
of poll dalam 30 menit terakhir. Dan bot pun berhasil mengirimkan nama-nama
gardu induk yang memenuhi kondisi tersebut kepada user.
Pengujian juga dilakukan untuk kasus dimana bot menerima kode pesan yang tidak
sesuai dengan program yang telah dibuat, dari hasil yang didapat terlihat jika bot
tidak akan memberi jawaban untuk kode pesan yang tidak sesuai dengan
fungsionalitas bot.
Dari seluruh hasil pengujian bot, didapatkan jika fungsionalitas dari bot sudah
sesuai dengan fungsi yang diinginkan.
42
BAB V
5.1 Kesimpulan
Berdasarkan hasil yang didapat dalam pelaksanaan kerja praktek, dapat ditarik
beberapa kesimpulan sebagai berikut.
• Sistem SCADA pada PT. PLN (Persero) UP2B Jabar berfungsi untuk
melakukan monitoring terhadap penyaluran tenaga listrik dari unit
pembangkitan hingga menuju beban-beban yang terdiri dari 112 gardu induk
yang tersebar di seluruh wilayah Jawa Barat sebagai titik operasi pengelolaan
dan penyaluran tenaga listrik.
• Sistem SCADA terdiri dari Master Station, Remote Station dan Link
Komunikasi Data antara Master Station dengan Remote Station. Master Station
berfungsi untuk melaksanakan telekontrol (telemetering, telesignal, dan remote
control) terhadap remote station.
• Dalam upaya peningkatan fungsi atau kinerja Master Station, penulis
mengimplementasikan sistem monitoring secara mobile berbasis Bot Telegram,
yang difungsikan untuk mengirimkan nama-nama gardu induk yang sedang
dalam kondisi out of poll (tidak terpantau oleh Master Station) serta merapikan
dan mengirimkan file data point komunikasi antara Master Station dengan
seluruh gardu induk di Jawa Barat (file berformat .csv) memanfaatkan Bahasa
Pemrograman Lua.
• Sistem monitoring dengan Bot Telegram ini berhasil dibuat dan dapat
melakukan fungsi sesuai yang direncanakan.
5.2 Saran
Berikut beberapa saran dari penulis untuk pelaksanaan kerja praktek.
• Fungsionalitas dari bot telegram dapat ditambahkan dengan fitur lainnya yang
dibutuhkan oleh user telegram dari PT. PLN (Persero) UP2B Jabar.
• Proses merapikan file teks data point komunikasi berformat .csv dapat
ditingkatkan agar dapat langsung menghasilkan file yang sudah berformat .xlsx.
43
DAFTAR PUSTAKA
[4] https://www.wachid.web.id/2018/11/how-to-install-lua-53-on-centos-6.html,
26 Juli 2019, 10.30 WIB.
[6] https://www.theverge.com/2014/2/25/5445864/telegram-messenger-hottest-
app-in-the-world, 23 Juli 2019, 10.15 WIB.
[7] Vilanova, X., Application with Data Acquisition of a FESTO Planar Surface
Gantry EXCM. Barcelona, 2016.
[8] Shafranovich, Y., Common Format and MIME Type for CSV Files.
SolidMatrix Technologies, Inc., 2005.
44
LAMPIRAN
45
LAMPIRAN A
Kegiatan kerja praktek yang penulis lakukan untuk setiap minggunya ditunjukkan
pada tabel berikut.
LAMPIRAN B
-- actions.lua
-- reference: https://github.com/mftrhu/telegram-cli-
bot/blob/master/bot.lua
-- developed and simplified by: Muhammad Arbi Minanda (13216019)
LOG_MESSAGES = true
LOG_FILE = "log"
started = false
logfile = nil
our_id = 0
function log_message(msg)
-- Appends telegram message to `logfile` the textual
representation of `msg` returned by `describe_message`, plus a
newline.
logfile:write(describe_message(msg) .. "\n")
end
function describe_message(msg)
-- Returns a string containing a textual representation of
the message
local now = os.date("[%Y-%m-%d %H:%M:%S]", msg.date)
local result = now .. " [" .. user_string(msg.from) .. "]
[" .. user_string(msg.to) .. "]"
if msg.text then
result = result .. ": " .. msg.text
end
if msg.media then
result = result .. " [media: " .. msg.media.type .. "]"
end
if msg.action then
result = result .. " [" .. msg.action.type
if msg.action.user then
result = result .. ": " ..
user_string(msg.action.user)
end
result = result .. "]"
end
return result
end
52
function user_string(peer)
-- Given a telegram peer `peer` it returns a string
containing a textual representation of the telegram peer
specification. ]]--
local result = ""
result = result .. peer.peer_type .. "#id" ..
peer.peer_id .. " - "
if peer.peer_type == "user" then
if peer.username then
result = result .. "@" .. peer.username .. " - "
end
result = result .. peer.first_name
if peer.last_name then
result = result .. " " .. peer.last_name
end
else
result = result .. peer.title
end
return result
end
function handle_our_own_message(msg)
-- Handles the commands exclusive to ourselves.
local peer = msg.to.peer_type .. "#id" .. msg.to.peer_id
local command, params = msg.text:match("^(!%a*)%s?(.*)$")
if command then
if own_commands[command] then
own_commands[command](peer, params, msg)
end
end
end
function to_whom_should_we_reply(msg)
-- Returns whether this is a private chat and the id of the
peer we should reply to.
if (msg.to.peer_id == our_id) then
-- This is a private chat - `from` holds the sender,
`to` our id
return true, msg.from.peer_type .. "#id" ..
msg.from.peer_id
else
-- The message was sent to a group - reply in the group
return false, msg.to.peer_type .. "#id" ..
msg.to.peer_id
end
end
function on_msg_receive(msg)
-- Called every time that telegram-cli receives a new
message
if not started then
return
end
-- Log the message to file
if LOG_MESSAGES then
log_message(msg)
end
-- Handle outbound messages
if msg.out then
53
handle_our_own_message(msg)
return
end
-- See `handle_our_own_message`
local command, params = msg.text:match("^(!%a*)%s?(.*)$")
if command then
if commands[command] then
commands[command](peer, params, msg)
end
end
end
-- COMMANDS
function register_command(command, func)
commands[command] = func
end
j = j + 1
end
-- Print all of Gardu Induk that in out of poll condition
and send it to user
send_msg(peer, out_of_poll, ok_cb, false)
end)
sub_lines = sub_lines ..
" ;" ..(string.sub(sisa, 1, ((string.find(sisa, ";", 1))-1))) ..
"."
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
sub_lines = sub_lines ..
" ;" ..(string.sub(sisa, 1, ((string.find(sisa, ";", 1))-1))) ..
"."
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
-- All updates after the last client execute have been received
function on_get_difference_end ()
end
function giveDate()
local day, month, year
day = string.sub(os.date(), 9, 10)
if (string.sub(os.date(), 5, 7) == "Jan") then
month = "01"
elseif (string.sub(os.date(), 5, 7) == "Feb") then
month = "02"
elseif (string.sub(os.date(), 5, 7) == "Mar") then
month = "03"
elseif (string.sub(os.date(), 5, 7) == "Apr") then
month = "04"
elseif (string.sub(os.date(), 5, 7) == "May") then
month = "05"
elseif (string.sub(os.date(), 5, 7) == "Jun") then
month = "06"
elseif (string.sub(os.date(), 5, 7) == "Jul") then
month = "07"
elseif (string.sub(os.date(), 5, 7) == "Aug") then
month = "08"
elseif (string.sub(os.date(), 5, 7) == "Sep") then
month = "09"
elseif (string.sub(os.date(), 5, 7) == "Oct") then
month = "10"
elseif (string.sub(os.date(), 5, 7) == "Nov") then
month = "11"
else
month = "12"
end
year = string.sub(os.date(), 21, 24)
return(year .. month .. day)
end
60
function giveTime()
local hour, minute
hour = string.sub(os.date(), 12, 13)
if (tonumber(string.sub(os.date(), 15, 16)) > 30) then
minute = "30"
else
minute = "00"
end
return(hour .. minute)
end