Anda di halaman 1dari 73

IMPLEMENTASI SISTEM MONITORING GARDU INDUK SE-

JAWA BARAT SECARA MOBILE BERBASIS BOT TELEGRAM

LAPORAN KERJA PRAKTEK


di
PT. PLN (PERSERO)
UNIT PELAKSANA PENGATUR BEBAN JAWA BARAT
JL. MOH TOHA KM 04, KOMPLEK PLN CIGERELENG,
KOTA BANDUNG

Oleh
MUHAMMAD ARBI MINANDA
NIM: 13216019

PROGRAM STUDI TEKNIK ELEKTRO


SEKOLAH TEKNIK ELEKTRO DAN INFORMATIKA
INSTITUT TEKNOLOGI BANDUNG
2019
ii
ABSTRAK

IMPLEMENTASI SISTEM MONITORING GARDU INDUK SE-


JAWA BARAT SECARA MOBILE BERBASIS BOT TELEGRAM

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

MOBILE MONITORING SYSTEMS IMPLEMENTATION OF


ELECTRIC SUBSTATION AROUND WEST JAVA BASED ON
TELEGRAM BOT

By
Muhammad Arbi Minanda
NIM: 13216019
ELECTRICAL ENGINEERING STUDY PROGRAM

Industrial Experiences is a compulsory subject in the curriculum of Electrical


Engineering Study Program in Bandung Institute of Technology, which is carried out
after the even semester ends and before the next odd semester begins. Industrial
Experiences is expected to be carried out by students in the work environment, both
industry or research institute, in order to give an overview to students about the work
environment that they will be dealing with, as well as to provide work experience and
expand their horizons.

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.

Bandung, 23 September 2019


Penulis

vii
DAFTAR ISI

Halaman

PENGESAHAN LAPORAN KERJA PRAKTEK ................................................ ii


ABSTRAK ......................................................................................................... iii
ABSTRACT ...........................................................................................................v
KATA PENGANTAR .......................................................................................... vii
DAFTAR ISI ...................................................................................................... viii
DAFTAR GAMBAR ...............................................................................................x
DAFTAR TABEL ................................................................................................. xi
DAFTAR SINGKATAN ....................................................................................... xii
DAFTAR LAMPIRAN ........................................................................................ xiii
BAB I. PENDAHULUAN ......................................................................................1
1.1 Latar Belakang .........................................................................................1
1.2 Tujuan ....................................................................................................1
1.3 Lingkup Permasalahan ..............................................................................2
1.4 Metodologi Pelaksanaan............................................................................2
1.5 Sistematika Pembahasan Laporan ...............................................................3
BAB II. PROFIL PERUSAHAAN...........................................................................4
2.1 Profil Singkat PT. PLN (Persero)................................................................4
2.2 Visi dan Misi PT. PLN (Persero) ................................................................4
2.3 Struktur Pembagian Unit PT. PLN (Persero) ................................................4
2.4 Anak Perusahaan PT. PLN (Persero)...........................................................6
BAB III. TINJAUAN PUSTAKA.............................................................................7
3.1 SCADA ...................................................................................................7
3.2 Master Station ..........................................................................................8
3.3 RemoteTerminal Unit .............................................................................. 11
3.4 CentOS .................................................................................................. 13
3.5 Telegram ................................................................................................ 14
3.6 Telegram-cli ........................................................................................... 14

viii
Halaman

3.7 Bot Telegram .......................................................................................... 14


3.8 Bahasa Lua ............................................................................................. 16
3.9 Comma Separated Values File .................................................................. 17
BAB IV. PELAKSANAAN, HASIL DAN ANALISIS .............................................. 18
4.1 Memasang Software-software yang Dibutuhkan ........................................... 18
4.2 Membuat Bot Telegram ............................................................................ 19
4.3 Fungsionalitas Bot.................................................................................... 20
4.4 Diagram Alir Algoritma Bot ...................................................................... 21
4.5 Penjelasan Algoritma Bot ......................................................................... 24
4.6 Demo Bot................................................................................................ 38
BAB V. KESIMPULAN DAN SARAN ................................................................... 42
5.1 Kesimpulan ............................................................................................. 42
5.2 Saran ...................................................................................................... 42
DAFTAR PUSTAKA ............................................................................................ 43
LAMPIRAN A. Yang Berkaitan dengan Pelaksanaan Kerja Praktek ............................ 45
LAMPIRAN B. Yang Berkaitan dengan Tugas Kerja Praktek ..................................... 51

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

1.1 Latar Belakang

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.

Sebagai wujud dalam menjalankan operasi pengelolaan gardu-gardu induk di


seluruh wilayah Jawa Barat, PT. PLN (Persero) UP2B Jabar dituntut untuk
meningkatkan kinerja dan ketersediaannya sebagai Control Center. Sebagai upaya
untuk mendukung hal tersebut, maka penulis diberikan tugas khusus untuk dapat
memanfaatkan aplikasi messenger telegram sebagai media tambahan untuk
memberi informasi mengenai hasil monitoring terhadap kondisi serta data point
komunikasi dari gardu-gardu induk di seluruh wilayah Jawa Barat.

Penulis dituntut untuk memanfaatkan aplikasi messenger telegram dalam


mengimplementasikan sistem monitoring secara mobile berbasis bot dengan
memanfaatkan data status beserta data point komunikasi dari setiap gardu induk di
wilayah Jawa Barat yang didapatkan dari Remote Station.

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

Tujuan dari kerja praktek ini antara lain:


• Memahami sistem SCADA pada PT. PLN (Persero) UP2B Jabar.
• Membuat bot dalam aplikasi messenger telegram sebagai media tambahan
untuk mendukung upaya peningkatan kinerja PT. PLN (Persero) UP2B Jabar
sebagai Master Station.

1.3 Lingkup Permasalahan

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.

1.4 Metodologi Pelaksanaan

Beberapa metodologi yang dilakukan penulis dalam pelaksanaan kerja praktek


diantaranya:
• Studi Literatur
Literatur yang digunakan dalam pelaksanaan tugas bersumber dari jurnal ilmiah
yang berkaitan dengan topik tugas yang dikerjakan.
• Diskusi
Untuk menyelesaikan masalah yang dihadapi dalam pengerjaan tugas kerja
praktek ini, dilakukan diskusi dengan pembimbing kerja praktek, rekan kerja
praktek, dan juga media diskusi online.
• Uji Coba Program
Pelaksanaan tugas dilakukan dengan menguji script program yang dibuat secara
bertahap dari tingkat fungsionalitas yang paling rendah hingga menuju yang
kompleks, hal ini dilakukan agar dapat meminimalisir kemungkinan
permasalahan yang muncul dari program yang dibuat.
3

• Debugging
Setiap kali ditemukan permasalahan dalam pengujian program, dilakukan
debugging terhadap script yang telah dibuat agar permasalahan yang muncul
dapat teratasi.

1.5 Sistematika Pembahasan Laporan

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

2.1 Profil Singkat PT. PLN (Persero)


Perusahaan Listrik Negara (PLN) atau nama resminya adalah PT PLN
(Persero) adalah sebuah BUMN yang mengurusi semua aspek kelistrikan yang ada
di Indonesia. Motto dari perusahaan ini adalah “Listrik untuk Kehidupan yang
Lebih Baik”.

Gambar 2.1 Logo PT. PLN (Persero)


Perseroan ini memiliki maksud dan tujuan untuk menyelenggarakan usaha
penyediaan tenaga listrik bagi kepentingan umum dalam jumlah dan mutu yang
memadai serta memupuk keuntungan dan melaksanakan penugasan Pemerintah di
bidang ketenagalistrikan dalam rangka menunjang pembangunan dengan
menerapkan prinsip-prinsip Perseroan Terbatas.

2.2 Visi dan Misi PT. PLN (Persero)


Visi dari PT. PLN (Persero) adalah diakui sebagai Perusahaan Kelas Dunia yang
Bertumbuh kembang, Unggul dan terpercaya dengan bertumpu pada Potensi
Insani.
Misi dari PT. PLN (Persero) diantaranya:
• Menjalankan bisnis kelistrikan dan bidang lain yang terkait, berorientasi pada
kepuasan pelanggan, anggota perusahaan dan pemegang saham.
• Menjadikan tenaga listrik sebagai media untuk meningkatkan kualitas
kehidupan masyarakat.
• Mengupayakan agar tenaga listrik menjadi pendorong kegiatan ekonomi.
• Menjalankan kegiatan usaha yang berwawasan lingkungan.

2.3 Struktur Pembagian Unit PT. PLN (Persero)


Dalam melakukan pelayanan pendistribusian kelistrikan di Indonesia, PT. PLN
(Persero) membagi fungsinya ke dalam beberapa fungsi berdasarkan pada sistem
tenaga listrik yaitu Pembangkitan, Transmisi, Pengatur Beban, dan Distribusi, juga
5

unit induk atau pusat-pusat lain sebagai penunjang berlangsungnya perusahaan.


Dan karena luasnya cakupan wilayah kerja PLN, maka PLN juga memiliki unit-
unit di seluruh wilayah Indonesia yang mempunyai fungsi masing-masing sesuai
dengan unit induknya. Struktur pembagian fungsi unit dari PT. PLN (Persero)
secara umum adalah sebagai berikut:
• Kantor Pusat PLN
Kantor Pusat merupakan pusat dari penyelenggara bisnis PLN diseluruh Indonesia.
Kantor pusat PLN berlokasi di Jalan Trunojoyo Blok M-I Melawai, Kebayoran
Baru, Kota Jakarta Selatan. Pimpinan kantor pusat PLN adalah pimpinan tertinggi
dalam perusahaan ini yaitu Direktur Utama.
• Unit Induk dan/atau Pusat-Pusat
Unit Induk merupakan unit dari PLN sebagai kepanjangan tangan dari kantor pusat
untuk pelayanan kelistrikan di PLN, serta merupakan lembaga di PLN sebagai
penunjang bisnis kelistrikan PLN di wilayah. Unit induk dibagi sesuai fungsinya
contoh PLN Unit Induk Distribusi Jawa Barat yang terletak di Bandung sebagai
pelayanan distribusi di Provinsi Jawa Barat, atau PLN Unit Induk Pusat Pengatur
Beban (UIP2B) sebagai pengatur beban secara keseluruhan dari Pembangkitan,
Transmisi dan sampai ke konsumen dengan komunikasi terhadap Unit Pelaksana
Pengatur Distribusi dan Gardu Induk. Sedangkan pusat-pusat adalah lembaga PLN
sebagai penunjang bisnis PLN, contohnya PLN Pusat Pendidikan dan Latihan yaitu
lembaga untuk pengembangan dan pelatihan pegawai PLN, serta pusat yang lain.
Unit induk dan/atau Pusat-pusat dipimpin oleh seorang General Manager Unit
Induk atau General Manager Pusat.
• Unit Pelaksana
Unit Pelaksana merupakan unit di bawah unit induk dan/atau pusat-pusat sebagai
pembagian wilayah pelayanan PLN kedalam ruang lingkup yang lebih kecil agar
pelayanan PLN dapat lebih terfokus dan langsung menyentuh pada masyarakat,
contohnya adalah Unit Pelaksana Pelayanan Pelanggan yaitu unit pelaksana di
bawah unit induk distribusi, atau Unit Pelaksana Pengatur Beban (UP2B) yaitu unit
pelaksana di bawah unit induk pengatur beban, contoh lain adalah Unit Pelaksana
Pendidikan dan Latihan yaitu unit pelaksana di bawah PLN Pusat Pendidikan dan
Latihan. Unit Pelaksana dipimpin oleh seorang Manager Unit Pelaksana.
• Unit Layanan
Unit Layanan adalah unit dibawah unit pelaksana dengan ruang lingkup pembagian
dari wilayah unit pelaksana, misalnya dalam satu unit pelaksana terdapat beberapa
unit layanan. Tetapi tidak semua unit pelaksana di PLN mempunyai unit layanan,
tergantung pada jumlah pelanggan dan area pelayanan unit pelaksana PLN, contoh
unit layanan pelanggan adalah unit layanan di bawah Unit Pelaksana Pelayanan
Pelanggan, atau unit layanan transmisi dan gardu induk unit layanan di bawah Unit
Pelaksana Transmisi. Unit Layanan dipimpin oleh seorang Manager Unit Layanan.
Sampai saat ini tercatat PLN mempunyai 50 Unit Induk, 6 Pusat-pusat, 373 Unit
Pelaksana, dan 1042 Unit Layanan.
6

2.4 Anak Perusahaan PT. PLN (Persero)


Anak-anak perusahaan dari PT. PLN (Persero) adalah sebagai berikut.
1. PT. Indonesia Power, berkedudukan di Jakarta.
2. PT. Pembangkitan Jawa Bali, berkedudukan di Surabaya.
3. PT. Pelayanan Listrik Nasional Batam (PT PLN Batam), berkedudukan
di Batam, Kepulauan Riau.
4. PT. Indonesia Comnets Plus, berkedudukan di Jakarta.
5. PT. Pelayanan Listrik Nasional Tarakan (PT PLN Tarakan), berkedudukan
di Tarakan, Kalimantan Utara.
6. PT. PLN Batubara, berkedudukan di Jakarta.
7. PT. Pengembangan Listrik Nasional Geothermal, berkedudukan di Jakarta.
8. PT. Prima Layanan Nasional Enjiniring, berkedudukan di Jakarta.
9. Majapahit Holding BV, berkedudukan di Amsterdam, Belanda.
10. PT. Haleyora Power, berkedudukan di Jakarta.
11. PT. Pelayaran Bahtera Adhiguna, berkedudukan di Jakarta.
7

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.

Implementasi sistem SCADA di dalam suatu sistem transmisi listrik tegangan


tinggi memerlukan instalasi RTU yang dipasang pada beberapa pusat-pusat
pembangkit dan gardu-gardu induk. Dengan adanya RTU memungkinkan Master
Station untuk mengumpulkan data dan melaksanakan control terhadap gardu-gardu
induk. Berikut merupakan Blok diagram dari sebuah sistem SCADA:

Gambar 3.1 Blok Diagram Sistem SCADA


8

2.2 Master Station


Master Station merupakan kumpulan perangkat keras dan lunak yang ada di control
center. Master Station berfungsi untuk melaksanakan telekontrol (telemetering,
telesignal, dan remote control) terhadap remote station. Konfigurasi dari sebuah
Master Station adalah seperti gambar berikut.

Gambar 3.2 Konfigurasi Master Station


Keterangan:
1. Workstation dispatcher 11. Layar tayang
2. Workstation engineer & update 12. Switch Gigabit Ethernet LAN
database 13. Server sub sistem komunikasi
3. Workstation DTS 14. Switch 100 Megabit Ethernet
4. Server SCADA LAN
5. GPS 15. Workstation di luar control
6. Server EMS center
7. Server data historikal dan update 16. Static display
database 17. Printer laser hitam putih
8. Server DTS 18. Printer laser berwarna
9. Projector 19. Gateway atau Router+Firewall
10. Server kontroller 20. Server frekuensi
9

Bagian-bagian utama dari Master Station diantaranya: Server, Workstation,


Aplikasi, LAN (Local Area Network), serta beberapa peripheral penunjang.

2.2.1 Server

Beberapa server pada Master Station diantaranya:


• Server SCADA, berfungsi sebagai pengolah dan penyimpan semua data
informasi yang diperoleh dari sub sistem komunikasi untuk dikirimkan kepada
server yang lain sesuai dengan kebutuhan.
• Server Sub Sistem Komunikasi, berfungsi sebagai kontrol komunikasi ke
RTU/remote station dengan model polling serta sinkronisasi yang ditentukan
sesuai dengan kebutuhan.
• Server Historikal, berfungsi sebagai penyimpan semua data dan informasi baik
yang dinamis maupun statis serta semua perubahan informasi yang didapat dari
server SCADA maupun server EMS
• EMS (Energy Management System), berfungsi sebagai pengolah data dari
server SCADA, server historikal, dan data snapshot dari sub komunikasi
dikombinasikan dengan logikal data yang ada di server EMS untuk
menjalankan aplikasi kelistrikan.
• Server DTS, berfungsi untuk menjalankan aplikasi training baik berupa
simulasi maupun modelling sesuai dengan kebutuhan dispatcher.
• Server Pengukur Frekuensi, berfungsi untuk mengakuisisi data frekuensi dari
transduser yang dipasang di pembangkit.

2.2.2 Workstation

Beberapa workstation pada Master Station diantaranya:


• Workstation Dispatcher, digunakan oleh dispatcher untuk memonitor sistem
kelistrikan.
• Workstation Engineer, digunakan oleh engineer Master Station untuk
melakukan modifikasi database.
• Workstation Update Database, digunakan untuk melakukan update database.
10

• Workstation di Luar Control Center, digunakan oleh pengguna yang berada di


luar control center untuk memantau kondisi sistem tenaga listrik untuk fungsi
pemeliharaan atau fungsi manajerial.

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.

2.2.4 Peripheral Penunjang

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

• Aplikasi EMS, untuk menampilkan fungsi Energy Management System.


• Aplikasi Update Database, digunakan untuk melakukan update database
SCADA atau EMS.
• Aplikasi HMI (Human Machine Interface), berfungsi menampilkan single
diagram, besaran listrik, dan melakukan remote control.

2.3 Remote Terminal Unit

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.

2.3.1 Modul CPU

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

2.3.2 Modul I/O (Input/Output)

Modul ini terdiri dari 4 jenis, yaitu:


• Modul Analog Input (AI), digunakan untuk mengambil informasi besaran ukur
seperti tegangan, arus, daya, frekuensi, dan lain-lain.
• Modul Analog Output (AO), digunakan RTU untuk melaksanakan perintah dari
Master Station yang bersifat analog (mengatur secara linear suatu peralatan
pada posisi atau nilai tertentu).
• Modul Digital Input (DI), digunakan sebagai sarana untuk mengambil informasi
status atau keadaan suatu peralatan pada RTU.
• Modul Digital Output (DO), digunakan RTU untuk melaksanakan perintah dari
Master Station yang bersifat digital (membuka atau menutup switch dan juga
menyalakan atau mematikan peralatan).

2.3.3 Modul Komunikasi

Modul komunikasi digunakan sebagai interface komunikasi antara RTU dengan


dunia luar atau dengan device yang lain. Interface komunikasi ini biasanya dibagi
menjadi 2, yaitu komunikasi ke control center dan komunikasi ke suatu device lain.

2.3.4 Modul Catu Daya (CD)

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.

Konfigurasi dari bagian-bagian utama RTU adalah seperti gambar berikut.


13

Gambar 3.3 Konfigurasi Remote Terminal Unit

2.4 CentOS

CentOS (Community Enterprise Operating System) adalah sebuah distribusi


linux sebagai bentuk dari usaha untuk menyediakan platform komputasi yang
cocok dipakai dalam skala Enterprise atau skala perusahaan yang bebas biaya atau
gratis. CentOS sendiri di code dari source code Red Hat Enterprise (RHEL) yang
dikembangkan dalam sebuah komunitas yang disebut CentOS Project.

Linux sendiri merupakan sebuah sistem operasi yang memiliki kemampuan


multiuser dan multitasking yang bersifat bebas untuk siapapun. Kebebasan yang
dijamin oleh sistem operasi ini diantaranya:

• Bebas untuk menggunakan software untuk tujuan apapun.


• Bebas untuk mengubah software agar sesuai dengan kebutuhan user. Cara ini
mengharuskan prasyarat tersediannya source code perangkat lunak Linux.
• Bebas untuk mendistribusikan dengan bentuk copy, baik secara gratis maupun
berbayar. Sebagai sistem dalam rumpun UNIX, GNU.
14

2.5 Telegram

Telegram adalah sebuah aplikasi layanan pengiriman pesan multiplatform yang


bersifat gratis dan nirlaba. Telegram tersedia untuk perangkat telepon seluler
(Android, iOS) dan sistem perangkat komputer (Windows, Linux). Telegram
diluncurkan pada 2013 oleh dua bersaudara Nikolai dan Pavel Durov asal Rusia.
Para pengguna dapat mengirim pesan dan bertukar foto, video, stiker, audio, dan
tipe berkas lainnya. Beberapa keunggulan telegram dibandingkan aplikasi yang
serupa diantaranya:
• Berbasis cloud dengan sinkronisasi tanpa batas yang membuat telegram dapat
digunakan pada beberapa perangkat secara bersamaan.
• Dapat mengirimkan file hingga ukuran 1.5 GB
• Terjamin keamanannya dengan dilindungi enkripsi yang membuat berbagai
informasi yang dibagi secara private akan selalu bersifat privasi. Telegram
dengan tegas menolak untuk memberi ‘pintu belakang’ akses informasi untuk
agen intelijen dari para pengguna Telegram.
• Mudah digunakan karena pengguna dalam membuat akun hanya memerlukan
nomor ponsel.

2.6 Telegram-cli

Telegram-cli merupakan sebuah telegram terminal client. Aplikasi ini dapat


menjalankan telegram namun dengan fitur command line interface, layaknya
command prompt pada sistem operasi windows. Telegram-cli ditulis dengan
menggunakan Bahasa C dan memiliki library wrapper untuk Bahasa Lua dan
Phyton.

2.7 Bot Telegram

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

khususnya akhir-akhir ini, ketika messenger telah menjadi kebutuhan sehari-hari


bagi setiap orang. Bot pada messenger ini merupakan sebuah akun yang dapat
digunakan untuk otomatisasi beberapa fungsi yang dapat dilakukan oleh messenger
itu sendiri, salah satu contoh yang paling umum digunakan adalah digunakannya
bot untuk membalas suatu pesan secara otomatis yang dikirim oleh user lain kepada
akun bot yang telah dibuat.

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 telegram dapat dikategorikan menjadi 2 jenis, diantaranya:

2.7.1 Bot MTProto

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.

2.7.2 Bot API

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:

Tabel 3.1 Kelebihan dan Kekurangan Bot Telegram Mode API


Kelebihan Kekurangan
• Disediakan secara resmi oleh • Sesama Bot API tidak dapat
telegram berkomunikasi
• Cenderung mudah dalam pembuatan • Harus dimulai oleh user lain terlebih
serta pengoperasian dahulu sebelum bot ini dapat
mengirim pesan
• Memiliki fitur yang lebih terbatas
dibanding dengan akun user biasa.

2.8 Bahasa Lua

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.

Beberapa kelebihan dari bahasa lua adalah sebagai berikut.

• Bahasa pemrograman yang portable


• Mudah dipahami
• Ringan dan cepat
• Dapat dipasangkan dengan bahasa pemrograman yang lainnnya
• Tidak membutuhkan kapasitas memory dan hard disk yang tinggi untuk
memasangnya
17

• Mendukung skema Object Oriented Programming, Pemrograman Prosedural,


serta Pemrograman Fungsional.
• Banyak dokumentasi mengenai penggunaan dan pengembangan bahasa Lua.

2.9 Comma Separated Values File


Comma Separated Values (CSV) File merupakan file teks yang menggunakan koma
atau semicolon (titik koma) untuk memisahkan nilai. File CSV menyimpan data
tabular (angka dan teks) dalam teks biasa. Setiap baris file terdiri dari satu atau lebih
kolom yang dipisahkan dengan semicolon. Penggunaan semicolon sebagai pemisah
kolom inilah yang membuat file ini dinamakan dengan Comma Separated Values
File.

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

PELAKSANAAN, HASIL DAN ANALISIS

4.1 Memasang Software-software yang Dibutuhkan

Software-software yang dibutuhkan pada CentOS untuk mengerjakan tugas yang


diberikan diantaranya:
• Telegram-cli, minimal versi 1.4.1
• Lua, minimal versi 5.3

Kedua aplikasi diatas dipasang melalui aplikasi Terminal pada CentOS.


Sebelumnya, perlu login sebagai root pada terminal. Root merupakan hak akses
tertinggi atau mutlak pada linux. Beberapa aplikasi, command, ataupun file
memerlukan hak akses root agar dapat dijalankan ataupun akses lainnya. Login
sebagai root pada terminal dapat dijalankan dengan command “su -”. Setelah login
sebagai root dilakukan, pemasangan telegram-cli dan lua sudah dapat dilakukan
secara satu per satu dengan menggunakan command yang berbeda.

Berikut command/script yang penulis gunakan untuk memasang Telegram-cli pada


CentOS.
git clone --recursive https://github.com/vysheng/tg.git && cd tg
yum install jansson-devel lua-devel readline-devel libconfig-
devel libevent-devel
yum install gcc gcc-c++
yum install openssl-devel
./configure
make

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

4.2 Membuat Bot Telegram

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 akun telegram dengan menggunakan sebuah nomor telepon

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

Jalankan kembali telegram-cli dengan mode server, yaitu dengan script


"bin/telegram-cli -k tg-server.pub -W -s
{nama_file}.lua --enable-msg-id"

Gambar 4.1 Diagram Alir Langkah Pengaturan Akun Telegram sebagai Bot
20

4.3 Fungsionalitas Bot

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

4.4 Diagram Alir Algoritma Bot

Gambar 4.2 Diagram Alir Algoritma Bot secara Umum


22

Gambar 4.3 Diagram Alir Algoritma Fungsionalitas 1 dari Bot


23

Gambar 4.4 Diagram Alir Algoritma Fungsionalitas 2 dari Bot


24

4.5 Penjelasan Algoritma Bot


Pada bagian ini akan dijelaskan potongan-potongan script dari bot yang berperan
penting dalam algoritma dari fungsionalitas bot. Script lain yang tidak dijelaskan
pada bagian ini merupakan script yang berperan dalam fungsionalitas akun
telegram untuk berfungsi sebagai bot, referensi dari script dengan fungsi tersebut
terlampir pada daftar pustaka.

4.5.1. Script untuk Mengirimkan Daftar Fungsionalitas Bot


register_command("!help", function(peer, params, msg)
send_msg(peer, "List command: \n" .. "!check: meminta list
gardu induk yang out of poll per 30 menit \n" .. "!point:
mengirim file data point (ALLIFSPOINT.csv) yang telah
dirapihkan\n", ok_cb, false)
end)

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.

4.5.2. Penjelasan Algoritma Fungsionalitas 1 dari Bot


Selanjutnya, akan dijelaskan beberapa potongan script untuk fungsionalitas bot
yang pertama, yakni mengirimkan nama-nama gardu induk yang dalam kondisi out
of poll pada 30 menit terakhir.

register_command("!check", function(peer, params, msg)


-- Make a variabel that contain name of "Gardu Induk"
day = (string.upper(string.sub(os.date(), 1, 3)))
date = giveDate()
time = giveTime()
local file =
assert(io.open("/home/arbi/Documents/KP/MESSAGES_SQL_"..
day .."_".. date .."_".. time ..".lst", "r"))
..
..

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

keluaran dari fungsi os.date()berupa tulisan bulan sedangkan yang dibutuhkan


adalah berupa angka, maka diubah dengan menggunakan conditional state
sebanyak 12 kali untuk setiap nama bulan. Pada fungsi giveTime(), potongan string
dari fungsi os.date(), dikonversi menjadi angka dengan menggunakan fungsi
tonumber(string). Hal ini dilakukan agar waktu (khususnya bagian menit) dapat

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")).

Sebelum penjelasan kode dilanjutkan, diperlihatkan terlebih dahulu potongan isi


dari file teks yang dibuka yang ditampilkan oleh gambar berikut.

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

register_command("!check", function(peer, params, msg)


..
..
search = {} -- Array for save all name of "Gardu Induk"
i = 0
found_same_gardu = false
while(true) do
local line_for_search = file:read("*line")
if not line_for_search then
break
end
search[i] = ""
-- Process for saving name of "Gardu Induk" to array
search
if ((string.find(line_for_search, ";" ,21)) == 22) then
if ((string.find(line_for_search, ";" ,24)) == 25)
then
search[i] = string.sub(line_for_search, 57, 76)
elseif ((string.find(line_for_search, ";" ,23)) ==
24) then
search[i] = string.sub(line_for_search, 56, 75)
else
search[i] = string.sub(line_for_search, 58, 77)
end
elseif ((string.find(line_for_search, ";" ,27)) == 28)
then
if ((string.find(line_for_search, ";" ,26)) == 27)
then
search[i] = string.sub(line_for_search, 61, 80)
elseif ((string.find(line_for_search, ";" ,25)) ==
26) then
search[i] = string.sub(line_for_search, 60, 79)
else
search[i] = string.sub(line_for_search, 62, 81)
end
end
-- Checking for the same name of "Gardu Induk" in array
search
if (i>=1) then
local k=0
while (k<i) do
if (search[k]==search[i]) then
found_same_gardu = true
break
end
k = k+1
end
end
-- Increase the size of array search if name of "Gardu
Induk" firstly saved in array search
if (found_same_gardu == false) then
i = i+1
end
found_same_gardu = false
end
io.close(file)
..
28

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

if (string.find(line, "up")) then


found_down = false
end
end
end
end
io.close(file)
-- Save the name of "Gardu Induk" that its last
condition of operational state is down
if found_down == true then
out_of_poll = out_of_poll .. search[j] .. "\n"
end
j = j + 1
end
..
..

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

boolean dengan nama found_down sebagai penentu apakah ditemukan kondisi


operational state berupa down atau tidak. Jika kondisi tersebut terpenuhi saat
pencarian dilakukan, maka variabel found_down akan bernilai true, sedangkan jika
ditemukan kondisi yang berlawanan yakni operational state berupa up, maka
variabel found_down akan bernilai false. Nama dari gardu akan dimasukkan ke
dalam variabel out_of_poll jika variabel found_down bernilai true setelah
pencarian selesai dilakukan untuk setiap line. Pencarian status gardu-gardu induk
ini akan berhenti jika pencarian telah dilakukan untuk seluruh nama-nama gardu
yang tersimpan pada array search = {}.

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)
..
..

4.5.3. Penjelasan Algoritma Fungsionalitas 2 dari Bot


Selanjutnya, akan dijelaskan beberapa potongan script untuk fungsionalitas bot
yang kedua, yakni merapikan file data point komunikasi untuk setiap gardu induk
sesuai format yang diinginkan oleh pembimbing secara otomatis dan memanfaatkan
bot telegram yang telah dibuat untuk mengirimkan file yang telah dirapikan kepada
user.

--Send Data Point File that have been fixed


register_command("!point", function(peer, params, msg)
-- Open CSV file
local file =
assert(io.open("/home/arbi/Documents/KP/ALL_IFSPOINT.csv", "r"))
..
31

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.

Sebelum penjelasan kode dilanjutkan, diperlihatkan terlebih dahulu potongan isi


dari file teks yang dibuka yang ditampilkan oleh gambar berikut.

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

if (string.find(line, ";")) then


-- Editing File
sisa = string.sub(line,
(string.find((string.sub(line, 1, findLast(line, "0"))), ";",
1)+1))

sub_lines = "\n" .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
34

temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 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))

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))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 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

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))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
36

sisa = string.sub(temp, (string.find(temp,


";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
if (string.find(sisa, " ", 1) == 1) then
sub_lines = sub_lines ..
(string.sub(sisa, 2, 2)) .. ";"
else
sub_lines = sub_lines ..
(string.sub(sisa, 1, 1)) .. ";"
end
--Move to new line
k = k+1
-- Print the edited line to file
file2:write(sub_lines)
sublines = ""
end
end
--Close all file
io.close(file)
io.close(file2)

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

dengan menggunakan fungsi assert(io.open("directory dan nama file",


"w")), huruf w pada fungsi tersebut lah yang menunjukkan mode untuk membuat

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().

4.6 Demo Bot

Gambar 4.9 Tampilan pada User saat Pengujian Bot


39

Gambar 4.10 Tampilan pada Server saat Pengujian Bot

Gambar 4.11 Tampilan pada Server saat Pengujian Bot


40

Langkah pertama yang dilakukan dalam pengujian bot adalah menjalankan


telegram-cli dengan mode server. Langkah yang dilakukan sesuai dengan
mekanisme atau diagram alir yang tercantum pada gambar 4.1. Dapat dilihat pada
gambar 4.10 dan 4.11 jika telegram-cli berhasil dijalankan dengan mode server,
sudah berfungsi sebagai bot dan siap untuk menerima pesan atau perintah dari user.

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 dilanjutkan dengan menguji fungsionalitas lain dari bot, yaitu


mengirimkan data point komunikasi untuk setiap remote station. Pengujian diawali
dengan user yang mengirimkan pesan dengan kode “!point”. Setelah pesan kode
tersebut dikirimkan, terlihat jika server membalas dengan pesan “Sending File…”,
ini menunjukkan jika proses merapikan file yang dilakukan oleh server telah selesai
dan file sedang dikirimkan kepada user.
41

Selanjutnya, pengujian dilakukan untuk menguji kemampuan multitasking dari bot,


yaitu dengan melakukan pengujian untuk fungsionalitas kedua (merapikan file dan
mengirim file kepada user) dan ketika file sedang dikirimkan kepada user, user
kembali mengirimkan kode “!check” untuk menguji fungsionalitas pertama dari bot
(mengirim nama-nama gardu induk yang dalam kondisi out of poll). Dari hasil yang
didapat terlihat jika bot berhasil menjalankan kedua fungsionalitas bot secara
paralel.

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

KESIMPULAN DAN SARAN

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

[1] https://www.pln.co.id, 24 Juli 2019, 10.00 WIB.

[2] Ierusalimschy, R., Programming in Lua Second Edition. PUC-Rio, Brazil,


2006.

[3] https://github.com/vysheng/tg/issues/1026, 25 Juli 2019, 11.00 WIB.

[4] https://www.wachid.web.id/2018/11/how-to-install-lua-53-on-centos-6.html,
26 Juli 2019, 10.30 WIB.

[5] https://github.com/mftrhu/telegram-cli-bot/blob/master/bot.lua, 28 Juni 2019,


11.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

A.1 Surat Tanda Diterima Kerja Praktek


46

A.2 Detil Pelaksanaan Kerja Praktek

Kegiatan kerja praktek yang penulis lakukan untuk setiap minggunya ditunjukkan
pada tabel berikut.

Minggu Periode Kerja Kegiatan


ke-
1 20 - 24 Mei 2019 Mengenali profil dan bidang kerja perusahaan,
mempelajari sistem SCADA sebagai Master
Station.

2 27 - 31 Mei 2019 Libur

3 3 - 7 Juni 2019 Libur

4 13 - 14 Juni 2019 Pengenalan integrasi atau komunikasi antara


RCC dan DCC, melihat beberapa bentuk fisik
dari peralatan di RTU.

5 17 - 21 Juni 2019 Mempelajari dan mengenali jenis-jenis bot pada


aplikasi messenger telegram, Memasang
software-software yang dibutuhkan untuk
melaksanakan tugas yang diberikan.

6 24 - 28 Juni 2019 Mempelajari Bahasa Lua yang akan


dimanfaatkan untuk pengolahan data serta
pembuatan bot telegram jenis MTProto,
mencoba memfungsikan akun sebagai bot agar
dapat membalas pesan yang masuk secara
otomatis, memberi fitur pada bot agar dapat
membalas pesan yang masuk dengan pesan yang
merupakan isi dari suatu file eksternal berformat
teks.

7 1 - 5 Juli 2019 Menggunakan akun bot telegram yang sudah


dibuat untuk melaporkan nama-nama gardu
47

induk yang sedang dalam kondisi out of poll


dengan melakukan parsing data pada file teks
(berformat lst) yang dikirim dari RTU menuju
server Master Station setiap 30 menit sekali. File
teks tersebut berisi update telemetering serta
status atau kondisi dari setiap gardu induk di
Jawa Barat

8 8 - 14 Juli 2019 Menggunakan Bahasa Lua untuk mengolah


string pada file spreadsheet berformat .csv yang
berisi data point komunikasi dari setiap gardu
induk di Jawa Barat. Tujuannya untuk
melakukan otomatisasi perapihan dari file
tersebut sesuai dengan format yang diinginkan
oleh pembimbing

9 15 - 19 Juli 2019 Memanfaatkan bot telegram yang telah dibuat


untuk mengirim file .csv yang telah dirapihkan
saat diminta oleh akun lain.

10 22 - 26 Juli 2019 Debugging bot telegram untuk seluruh fungsi


yang telah dibuat, merapihkan script-script yang
telah dibuat.
48

A.3 Dokumentasi Tambahan di Tempat Kerja Praktek

Keterangan: Meja Kerja Penulis bersama Rekan Kerja Penulis


49

A.4 Surat Tanda Telah Selesai Kerja Praktek


50

A.5 Formulir Evaluasi Kerja Praktek


51

LAMPIRAN B

B.1 Script Lengkap Bot Telegram

-- 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

-- Dispatch tables [command] -> function (peer, params, message)


commands = {}
-- Use `register_command` with `(command, func)` to add commands
to the tables.

function on_our_id (id)


our_id = id
end

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

local is_private_chat, peer = to_whom_should_we_reply(msg)

-- 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

-- Apply message with format "!check"


register_command("!check", function(peer, params, msg)
-- Make a variabel that contain name of "Gardu Induk"
day = (string.upper(string.sub(os.date(), 1, 3)))
date = giveDate()
time = giveTime()
local file =
assert(io.open("/home/arbi/Documents/KP/MESSAGES_SQL_"..
day .."_".. date .."_".. time ..".lst", "r"))
search = {} -- Array for save all name of "Gardu Induk"
i = 0
found_same_gardu = false
while(true) do
local line_for_search = file:read("*line")
if not line_for_search then
break
end
search[i] = ""
-- Process for saving name of "Gardu Induk" to array
search
if ((string.find(line_for_search, ";" ,21)) == 22) then
if ((string.find(line_for_search, ";" ,24)) == 25)
then
search[i] = string.sub(line_for_search, 57, 76)
elseif ((string.find(line_for_search, ";" ,23)) ==
24) then
search[i] = string.sub(line_for_search, 56, 75)
else
search[i] = string.sub(line_for_search, 58, 77)
end
elseif ((string.find(line_for_search, ";" ,27)) == 28)
then
if ((string.find(line_for_search, ";" ,26)) == 27)
then
search[i] = string.sub(line_for_search, 61, 80)
elseif ((string.find(line_for_search, ";" ,25)) ==
26) then
search[i] = string.sub(line_for_search, 60, 79)
else
54

search[i] = string.sub(line_for_search, 62, 81)


end
end
-- Checking for the same name of "Gardu Induk" in array
search
if (i>=1) then
local k=0
while (k<i) do
if (search[k]==search[i]) then
found_same_gardu = true
break
end
k = k+1
end
end
-- Increase the size of array search if name of "Gardu
Induk" firstly saved in array search
if (found_same_gardu == false) then
i = i+1
end
found_same_gardu = false
end
io.close(file)
-- Checking Status of "Gardu Induk" and save "Gardu Induk"
that in out of poll condition
j = 0
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
if (string.find(line, "up")) then
found_down = false
end
end
end
end
io.close(file)
-- Save the name of "Gardu Induk" that its last
condition of operational state is down
if found_down == true then
out_of_poll = out_of_poll .. search[j] .. "\n"
end
55

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)

--Send Data Point File that have been fixed


register_command("!point", function(peer, params, msg)
send_msg(peer, "Processing File...", ok_cb, false)
-- Open CSV file
local file =
assert(io.open("/home/arbi/Documents/KP/ALL_IFSPOINT.csv", "r"))
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)
--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

if (string.find(line, ";")) then


-- Editing File
sisa = string.sub(line,
(string.find((string.sub(line, 1, findLast(line, "0"))), ";",
1)+1))

sub_lines = "\n" .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
56

sisa = string.sub(temp, (string.find(temp,


";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 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))

sub_lines = sub_lines .. (string.sub(sisa, 1,


((string.find(sisa, ";", 1))-1))) .. "."
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
57

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 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))

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))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
58

sisa = string.sub(temp, (string.find(temp,


";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))

sub_lines = sub_lines .. (string.sub(sisa, 1,


(string.find(sisa, ";", 1))))
temp = sisa
sisa = string.sub(temp, (string.find(temp,
";", 1)+1))
if (string.find(sisa, " ", 1) == 1) then
sub_lines = sub_lines ..
(string.sub(sisa, 2, 2)) .. ";"
else
sub_lines = sub_lines ..
(string.sub(sisa, 1, 1)) .. ";"
end
--Move to new line
k = k+1
-- Print the edited line to file
file2:write(sub_lines)
sublines = ""
end
end
--Close all file
io.close(file)
io.close(file2)
send_msg(peer, "Sending File...", ok_cb, false)
send_document(peer,
"/home/arbi/Documents/KP/ALL_IFSPOINT_NEW.csv", ok_cb, false)
end)

--Show What this account can do


register_command("!help", function(peer, params, msg)
59

send_msg(peer, "List command: \n" .. "!check: meminta list


gardu induk yang out of poll per 30 menit \n" .. "!point:
mengirim file data point (ALLIFSPOINT.csv) yang telah
dirapihkan\n", ok_cb, false)
end)

-- Called when there is updated information on a user


function on_secrec_chat_update (user, what_changed)
end
function on_user_update (user, what_changed)
end
function on_chat_update (user, what_changed)
end

-- All updates after the last client execute have been received
function on_get_difference_end ()
end

-- Called after the replay of old events has ended


function on_binlog_replay_end()
if LOG_MESSAGES then
logfile = assert(io.open(LOG_FILE, "a"))
end
postpone(cron, false, RUN_CRON_EVERY)
started = true
print("We are online.")
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

--Find the last character in the line


function findLast(haystack, needle)
local j=haystack:match(".*"..needle.."()")
if j==nil then return nil else return j-1 end
end

Anda mungkin juga menyukai