Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Kamis, 09 November 2023

Cara Chat GPT Membantu Kodingan Kamu - Edisi Publish MQTT Web Socket

 



Perkenalan saya dengan fenomena Artificial Inteligent "Chat GPT" memasuki tahun ke dua dan terus menghasilkan rasa takjub di otak saya. Walau ada sedikit ke khawatiran yang selalu muncul sejak awal, yaitu mungkin akan mengakibatkan  'kemalasan' otak untuk berpikir. Namun atas saran seorang teman yang sangat membanggakan platform dari openAI apalagi si dia sudah mencoba versi 4 yang berbayar, saya makin gatel untuk mencobanya. Asalkan kamu bisa menggiring "prompt"  nya, maka semua pertanyaan yang kamu ajukan akan mendapatkan hasil yang memuaskan, begitu saran teman saya ini.

Seperti pada tulisan kali ini disaat suntuk kepanasan di siang bolong, saya membaca kembali tulisan saya sebelumnya tentang e-voting menggunakan MQTT dan python ( disini ), dan ketika melihat tampilan e-votingnya begitu 'rudimental' maka saya teringat dulu saya pernah juga membuat APK android  berbasis web saat bermain-main esp8266 dan kunci motor, bisa dibaca disini

Tapi permasalahannya saya gak paham apakah "plain" html dapat melakukan koding MQTT ? Seingat saya ada istilah di broker mqtt yang saya sering gunakan yaitu hivemq memiliki support terhadap protokol websocket di port 8000. Daripada pusing maka saya menggunakan fasilitas chat GPT untuk mencari jawaban bagaimana  cara coding htmlnya. Ayo saya share ke pembaca langkah2 saya menggunakan chat GPT.



Saya iseng aja membuka pembicaraan seperti gambar diatas dengan bertanya apakah chat gpt dapat mengirimkan pesan MQTT ? Ya tentu saja chat gpt namanya saja "chat" ya terbatas untuk mengirimkan jawaban dari pertanyaan. Selanjutnya saya menggiring chat gpt untuk menjawab pertanyaan seperti "kapan kira-kira bisanya kirim pesan mqtt?" , "apa kirim sms bisa lewat chat gpt?", "tolong dong kirimkan pesan mqtt", sangat iseng pokoknya.

Sampai saat saya waras kembali, saya mengajukan pertanyaan sederhana: " Can i send mqtt message via HTML ?" dan jawabannya mencerahkan saya.



Yes, you can send MQTT messages from a web page using HTML and JavaScript, but you would need to use a JavaScript library or framework that supports MQTT, such as the Eclipse Paho MQTT JavaScript library. Here are the general steps to send MQTT messages from a web page:

  1. Include the MQTT JavaScript library: You need to include the MQTT JavaScript library in your HTML page. You can do this by including the library's JavaScript file in your HTML, like this:
html
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>


Dan kemudian saya meminta untuk dituliskan contohnya, " show me complete html for mqtt publisher".

Creating a complete HTML page for an MQTT publisher requires more than just HTML; you'll need JavaScript and, optionally, CSS to create a user interface. Below is a basic example of an HTML page that includes JavaScript for an MQTT publisher. This example uses the Eclipse Paho MQTT JavaScript library to send messages to an MQTT broker. Remember to replace the MQTT broker and topic information with your own.

html
<!DOCTYPE html> 
<html> <head> <title>MQTT Publisher</title> </head> <body> <h1>MQTT Publisher</h1> <label for="message">Message:</label> <input type="text" id="message" placeholder="Enter your message"> <button id="publishButton">Publish Message</button> <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script> <script> // Function to handle the button click function publishMessage() { var messageInput = document.getElementById("message"); var message = messageInput.value; // Create an MQTT client var client = new Paho.MQTT.Client("mqtt.eclipse.org", 80, "clientId"); // Set up the connection options var options = { onSuccess: onConnect, onFailure: onFailure, }; // Connect to the MQTT broker client.connect(options); // Called when the connection is successful function onConnect() { console.log("Connected to the MQTT broker"); // Send the MQTT message var message = new Paho.MQTT.Message(message); message.destinationName = "your/topic"; // Replace with your desired MQTT topic client.send(message); } // Called when the connection fails function onFailure(message) { console.log("Connection failed: " + message.errorMessage); } } // Attach the click event to the button var publishButton = document.getElementById("publishButton"); publishButton.addEventListener("click", publishMessage); </script> </body> </html>
*)Scriptnya agak kacau disini, namun di chat gpt dan editor notepad saya rapi kok !


Wihhh ayo kita coba langsung copy paste di notepad, sesuaikan parameter dan jalankan ! namun ada error yang muncul pada console html ( pencet click kanan lalu pilih  inspeksi  atau CTRL+SHIFT+I) dimana  library java nya error. Lalu saya bertanya begini :

mqttws31.min.js got error


dan dijawab :


I apologize for any confusion. The mqttws31.min.js script I mentioned earlier might not be the latest version, and it's possible that it may not work as expected. HiveMQ and the Paho MQTT library may have evolved since my last update.

To ensure that you are using an up-to-date version of the Paho MQTT JavaScript library that works with HiveMQ, it's best to include the latest version from a reliable source. You can get the latest version from the Eclipse Paho GitHub repository or their official website.

Here's how to include the latest version from the Eclipse Paho GitHub repository:

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.1.0/mqttws31.min.js"></script>

Alternatively, you can download the library directly from the Eclipse Paho GitHub repository and host it on your own server to ensure you are using the most recent version:

  1. Go to the Eclipse Paho GitHub repository for JavaScript: https://github.com/eclipse/paho.mqtt.javascript

  2. Download the latest release of the Paho JavaScript library.

  3. Host the downloaded JavaScript file on your server or include it directly in your HTML as needed.

Remember to replace "your-hivemq-broker-url" and other configuration settings with the correct values for your HiveMQ instance. Additionally, make sure that your HiveMQ instance is properly configured to support WebSocket connections.



Dan hasilnya untuk contoh (yang sudah saya sesuaikan) script pub yang benar ke broker seperti berikut 

<!DOCTYPE html>
<html>
<head>
    <title>MQTT WebSocket Publisher</title>
</head>
<body>
    <h1>MQTT WebSocket Publisher</h1>
    
    <label for="message">Message:</label>
    <input type="text" id="message" placeholder="Enter your message">
    
    <button id="publishButton">Publish Message</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
	
    <script>
        // Function to handle the button click
        function publishMessage() {
            var messageInput = document.getElementById("message");
            var pesan = messageInput.value;

            // Create an MQTT client
            var client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId-yttggg");

            // Set up the connection options
            var options = {
                useSSL: false,  // Set to true if your broker supports secure WebSocket connections
                onSuccess: onConnect,
                onFailure: onFailure,
            };

            // Connect to the MQTT broker via WebSocket
            client.connect(options);

            // Called when the connection is successful
            function onConnect() {
                console.log("Connected to the MQTT broker");

                // Send the MQTT message
                var message = new Paho.MQTT.Message(pesan);
                message.destinationName = "/ahocool/chatgpt"; // Replace with your desired MQTT topic
                client.send(message);

                // Disconnect after sending the message (optional)
                client.disconnect();
            }

            // Called when the connection fails
            function onFailure(message) {
                console.log("Connection failed: " + message.errorMessage);
            }
        }

        // Attach the click event to the button
        var publishButton = document.getElementById("publishButton");
        publishButton.addEventListener("click", publishMessage);
    </script>
</body>
</html>



Hasilnya ketika saya membuka client mqtt dan klik publish pada topik "/ahocool/chatgpt " seperti gambar berikut :




Selanjutnya pada tulisan berikut akan kita bahas mengenai proses subscribe dan masih dengan bantuan chatgpt.
Share:

Sabtu, 04 November 2023

E-Voting sederhana menggunakan Mqtt - Python

 



Tulisan kali ini merupakan pembahasan praktek pengenalan konsep MQTT sebagai protokol paling terkenal yang digunakan pada dunia IOT. Praktek ini telah dilakukan pada kelas mikrokontroler di Jurusan Teknik Listrik - Fakultas Vokasi - Universitas Negeri Surabaya dan respon mahasiswa peserta kuliah sangat 'heboh' karena dengan MQTT-Python-Excel bisa mengumpulkan data pooling secara cepat namun sederhana karena menggunakan bahan-bahan yang sudah ada pada laptop mahasiswa. 

Sebagai bahan bacaan agar tidak menimbulkan 'ndas ngelu' sebaiknya dibaca dulu tulisan mengenai perkenalan MQTT bisa di klik  disini : https://www.aisi555.com/2023/10/pengenalan-protokol-iot-mqtt-melalui.html


Titik berat pada praktek ini adalah coding python dengan library siap pakai berupa :

  • Paho-MQTT : Library untuk melakukan PUB-SUB data mqtt (baca disini)
  • Xlwing : Library untuk pengolahan data ke excel (baca disini)


Praktek pertama yang saya berikan adalah pengambilan data hoby dari mahasiswa, cukup sederhana dengan script seperti dibawah ini :


import random
from datetime import datetime
from paho.mqtt import client as mqtt_client
import xlwings as xw


#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['data']
row = 5 #global var buat awal row

#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/hobi"  

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


#koneksi
def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    

#subscribe ke mqtt broker
def subscribe(client: mqtt_client):
    #routine ketika ada pesan masuk
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        to_excel(msg.payload.decode()) #kirim ke excel
    # daftar pada kedua topic
    client.subscribe(topicsub)
    client.on_message = on_message 


def to_excel(data):
    datae = data.split(',')
    sekarang = datetime.now()   
    global row
    #menulis ke kolom excel
    nim = 'B' + str(row)
    nama = 'C' + str(row)
    hobi =  'D' + str(row)
    ct = 'E' + str(row)
    sht.range(nim).value = datae[0]
    sht.range(nama).value = datae[1]
    sht.range(hobi).value = datae[2]
    sht.range(ct).value = sekarang
    row = row + 1

def run():
    client= connect_mqtt()
    subscribe(client)
    client.loop_forever()
    
if __name__ == '__main__':
    run()
    
    


Script diatas sangat 'straight forward, dimana ada sebuah topik '/unesa/hobi' yang akan dikirimkan data pesan melalui broker mqtt dan client cukup menginputkan teks 'nim,nama,hobi'. Tiap pesan akan diparsing / dipecah oleh tanda koma dan kemudian dilemparkan ke excel melalui package 'xlwings'.





Saking sederhananya koding python yg saya buat, kekurangannya tidak ada filtering terhadap mahasiswa yang sudah mengririmkan data masih bisa kirim data kembali, begitu juga dengan pesan-pesan ngawur yang akhirnya meng 'hang' kan script python. Tapi setidaknya mahasiswa merasakan kecepatan proses PUB-SUB dari MQTT yang ordenya milisecond. Pokonya konsepnya sudah tersampaikan dengan benar.

Untuk itu pada praktek selanjutnya yaitu pooling "JIKA PEMILU HARI INI" saya membuat lebih tertib dengan rincian sebagai berikut :


- Data pemilih yang berhak dan pass key 



Pada gambar diatas saya mebuat data berupa NIM dari peserta voting yang berhak melakukan voting (saya ambil data peserta kuliah dan copas pada bagian bawah sheet pooling agar tidak kelihatan). Kemudian di kolom selanjutnya saya generate data nomor random sebagai password untuk melakukan voting secara sah. 

Kalau pada kejadian voting atau pemilu sesungguhnya, mungkin password / passkey ini diberikan kepada pemilih saat pemberian surat undangan. Hati-hati jangan menempatkan formula random pada cell yg digunakan sebagai database karena nilai random akan berubah-ubah saat melakukan perubahan pada sheet. Jadi solusinya membuat formula pada kolom kosong di sebelah lalu copy paste valuenya saja pada  kolom yang akan diambil datanya. Saya juga menambahkan status voting dari tiap nim agar tidak terjadi double voting.


- Pemilih hanya voting 1 kali
#ambil database pemilih
data_pemilih =[]
baris_awal=33  # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
    dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
    data_pemilih.append(dict_pilih)
    baris+=1
    
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
    print(x)


Potongan koding diatas berfungsi sebagai pemindah data pemilih pada cell excel dan kemudian dipindahkan menuju variable berupa list python dengan tiap anggotanya merupakan dictionary seperti hasil dibawah ini :




Jadi ada sejumlah data list yang berisikan data seperti ini :  {'nim': '22091387017', 'key': '20204', 'pool': '0'}. Data ini nanti akan membandingkan data['nim'] , data['key'] serta data['pool'] dengan hasil pengiriman data MQTT saat voting sehingga dapat mengecek mahasiswa yang berhak melakukan voting. Koding yang akan 'trap' data pemilih seperti berikut ini :


def to_excel(data):
    datae = data.split(',') # parsing data yang masuk di topik mqtt
    
    #kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
    index_list=0
    for y in data_pemilih:
        #data pemilih sesuai dan belum vote
        if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0': 
            #cek inputan nama pasangan calon presiden / wakil presiden
            if datae[2].lower() == 'amin':
                nilai = sht.range('D20').value + 1
                sht.range('D20').value = nilai
            elif datae[2].lower() == 'gofud':
                nilai = sht.range('J20').value + 1
                sht.range('J20').value = nilai
            elif datae[2].lower() == 'praban':
                nilai = sht.range('P20').value + 1
                sht.range('P20').value = nilai     
            else : #calon presiden namanya salah
                client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
                break
                
            #kirim notif ke nim bahwa berhasil vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
            #update dict dari pool
            data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
            #update cell hitungan voting di excel
            sht.range('F' +str(index_list+ baris_awal)).value = 1
            break
        
        elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
            #kirim notif sudah melakukan vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
            break
        elif y['nim'] == datae[0] and y['key'] != datae[1] :
            #kirim notif passkey anda salah
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
            break
        index_list+=1
        
    if index_list >= baris :
            #kirim notif anda belum terdaftar
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
            


- Notifikasi status voting


Pada koding diatas dapat dilihat ada pengiriman notifikasi ke topik "/unesa/pemilu/[nim]" dimana nim merupakan nim dari pemilih. Sehingga pada aplikasi client bisa juga melakukan pengecekan status voting, asal kan subscribe pada topik yang sama.


Contoh proses voting dan notifikasi voting pada client smartphone IOTMQTTPANEL seperti berikut ini :

*)Topik Voting "/unesa/pemilu"



Memang tampilan IOTMQTTPANEL sangat 'rudimental' namun sudah mewakili konsep dan proses e-voting yang lebih cepat melalui mqtt-pyhton. Jangan lupa menambahkan gambar pasangan capres cawapres pada sheet excel dan mengatur lebar kolom/baris agar sesuai (contoh gambar paling atas). Dalam kesempatan berikutnya saya akan mencoba membuat tampilan UI voting lebih menarik, atau mungkin ada mahasiswa yang mau dapat nilai A secara otomatis? Kontak saya aja ya....

PS: Ehhh gak sampe seminggu saya berhasil membuat apk nya berbasis websocket. Jika mau belajar cara bikin aplikasi mqtt di html / javascript silahkan bisa request belajar private.





Koding lengkap :

from paho.mqtt import client as mqtt_client
import xlwings as xw
import random


#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['pool']


#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/pemilu"  

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


#ambil database pemilih
data_pemilih =[]
baris_awal=33  # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
    dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
    data_pemilih.append(dict_pilih)
    baris+=1
    
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
    print(x)
    


#koneksi ke broker
def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    

#subscribe ke mqtt broker 
def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg): #jika ada pesan masuk
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        to_excel(msg.payload.decode())
    # daftar pada kedua topic
    client.subscribe(topicsub)
    client.on_message = on_message 


def to_excel(data):
    datae = data.split(',') # parsing data yang masuk di topik mqtt
    
    #kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
    index_list=0
    for y in data_pemilih:
        #data pemilih sesuai dan belum vote
        if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0': 
            #cek inputan nama pasangan calon presiden / wakil presiden
            if datae[2].lower() == 'amin':
                nilai = sht.range('D20').value + 1
                sht.range('D20').value = nilai
            elif datae[2].lower() == 'gofud':
                nilai = sht.range('J20').value + 1
                sht.range('J20').value = nilai
            elif datae[2].lower() == 'praban':
                nilai = sht.range('P20').value + 1
                sht.range('P20').value = nilai     
            else : #calon presiden namanya salah
                client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
                break
                
            #kirim notif ke nim bahwa berhasil vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
            #update dict dari pool
            data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
            #update cell hitungan voting di excel
            sht.range('F' +str(index_list+ baris_awal)).value = 1
            break
        
        elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
            #kirim notif sudah melakukan vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
            break
        elif y['nim'] == datae[0] and y['key'] != datae[1] :
            #kirim notif passkey anda salah
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
            break
        index_list+=1
        
    if index_list >= baris :
            #kirim notif anda belum terdaftar
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
            


def run():
    global client
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()
    

if __name__ == '__main__':
    run()

SELAMAT BELAJAR !!

Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (27) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika