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

Tampilkan postingan dengan label iot. Tampilkan semua postingan
Tampilkan postingan dengan label iot. Tampilkan semua postingan

Kamis, 09 November 2023

Cara Chat GPT Membantu Kodingan Kamu - Edisi Subscribe Topic MQTT Web Socket

 



Chat GPT versi gratis 3.5 memang memiliki keterbatasan, "coba bandingkan dengan versi 4 yang berbayar", kata teman saya. Tidak langsung bisa dipakai dan akan memungkinkan sekali terjadi kesalahan konsep maupun koding dari jawaban yang  diberikan. Namun setidaknya sudah membuka pikiran lah kata teman saya yang ahli coding sejak kuliah. Lhaa ada teman lain yang kapok mecoba chatgpt karena malah membikin  tambah pusing karena jawabannya gak pernah sesuai. Ingat chatGPT itu memperoleh jawaban dari hasil training berulang-ulang dari konteks yang diberikan oleh coder nya maupun hasil interaksi dengan pengguna. Jadi tunggu beberapa tahun lagi maka sepertinya semakin menjadi benar apa yang dijawab oleh chatGPT.


Baca dulu : ChatGPT dan Publish MQTT melalui websocket


Seperti pada response chatGPT atas  pertanyaan saya tentang coding subscribe MQTT dibawah ini, dan perhatikan muncul error pada console di web browser.


<!DOCTYPE html>
<html>
<head>
    <title>MQTT WebSocket Subscriber</title>
</head>
<body>
    <h1>MQTT WebSocket Subscriber</h1>

    <label for="topic">Topic:</label>
    <input type="text" id="topic" placeholder="Enter the topic to subscribe to">
    
    <button id="subscribeButton">Subscribe to Topic</button>

    <div id="messageDisplay">
        <!-- Received messages will be displayed here -->
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
    <script>
        var client = null; // MQTT client
        
        // Function to handle the button click
        function subscribeToTopic() {
            var topicInput = document.getElementById("topic");
            var topic = topicInput.value;

            if (!client) {
                client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId");

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

                // Set up the message handler
                client.onMessageArrived = onMessageArrived;
                
                // Connect to the MQTT broker via WebSocket
                client.connect(options);
            }

            // Subscribe to the specified MQTT topic
            client.subscribe(topic);
        }

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

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

        // Called when a message is received
        function onMessageArrived(message) {
            var messageDisplay = document.getElementById("messageDisplay");
            messageDisplay.innerHTML += "Received message: " + message.payloadString + "<br>";
        }

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

Console menampilkan hasil error berikut :


Ternyata subscribe ke topik gagal karena terjadi kesalahan berupa koneksi ke broker belum terjadi. Bagaimana bisa subscribe kalau konek aja belum ? Jadi saya harus memperbaiki dengan mengeluarkan proses connect ke luar dari function " subscribeToTopic() " dan menempatkan diawal <script>.


        if (!client) {
            client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId-12323");

                // Set up the connection options
           var options = {
                    useSSL: false, // Set to true if your broker supports secure WebSocket connections
                    onSuccess: onConnect,
                    onFailure: onFailure,
                };
		        // Set up the message handler
                client.onMessageArrived = onMessageArrived;
                
                // Connect to the MQTT broker via WebSocket
                client.connect(options);
            }



Dan benar saja pesan dapat dikirimkan dari client mqtt explorer dari PC saya menuju web browser melalui websocket port 8000.




Selanjutnya saya tinggal mengabungkan script sub dan pub sebelumnya untuk membuat aplikasi "e-voting" yang lebih menarik "UI" nya dan siap didemokan.




Chat GPT memang keren broooo....asal bisa menggiringnya saja ya...
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:

Kamis, 26 Oktober 2023

Pengenalan Protokol IOT - MQTT Melalui Simulasi Wokwi

 


Untuk melanjutkan praktek kali ini ada baiknya mengikuti pembahasan sebelumnya agar tidak tersesat :



Sebenarnya saya tidak terlalu suka dengan simulasi elektronika karena saya terbiasa membuat prototype pada breadboard, namun ketika saya menemukan simulator yang bernama  wokwi saya menjadi sangat kagum karena wokwi bisa menghubungkan board microcontroller yang dipakai dengan simulator wifi sesungguhnya. Nama AP wifi yang dipakai pada wokwi adalah  "Wokwi-GUEST" dan saya masih belum terpikir gimana script HTML pada cloud bisa menjadi Access point wifi. AMAZING !

Untuk mempersingkat waktu maka sebaiknya pembaca bikin aja akun wokwi kemudian baca dan pahami contoh-contoh yang telah ada. Untuk platform IOT maka mikrokontroler yang disediakan adalah ESP32 (sayangnya bukan ESP 8266 namun bisa dimaklumi, sama aja kok). Saya telah membuat simulasi pengukuran suhu dengan sensor DHT22 dan kemudian dilempar ke broker MQTT ( bisa dibaca disini )






Scriptnya seperti berikut :

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>

const int DHT_PIN = 13;
DHTesp dht;

// Ini untuk wifi kusus di simulasi wokwi

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";

//ubah dengan nama topik (namakamu) yg berbeda dengan teman kamu

#define TOPIK_SUHU "/namakamu/suhu"
#define TOPIK_HUMI "/namakamu/humi"

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;

float temp = 0;
float hum = 0;

void setup_wifi() { //perintah koneksi wifi
  delay(10);
  // mulai konek ke wifi
  Serial.println();
  Serial.print("Terhubung ke .. ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA); //setting wifi chip sebagai station/client
  WiFi.begin(ssid, password); //koneksi ke jaringan wifi

  while (WiFi.status() != WL_CONNECTED) { //perintah tunggu esp32 sampi terkoneksi ke wifi
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi terhubung");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}



void reconnect() { //perintah koneksi esp32 ke mqtt broker baik itu sebagai publusher atau subscriber
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // perintah membuat client id unik agar broker menerima
    String clientId = "Unesa-d4-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("Terhubung ke broker ..");
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
 
  Serial.begin(115200);
 
  setup_wifi(); //memanggil setup_wifi untuk dieksekusi
 
  client.setServer(mqtt_server, 1883); //konek ke broker
 
  dht.setup(DHT_PIN, DHTesp::DHT22);//inisialiasi komunikasi dengan sensor dht22
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 5000) { //perintah publish data tiap 5 detik
    lastMsg = now;
    TempAndHumidity  data = dht.getTempAndHumidity();

    String temp = String(data.temperature, 2); //membuat variabel temp untuk di publish ke broker mqtt
    client.publish(TOPIK_SUHU, temp.c_str()); //publish data dari varibel temp ke broker mqtt
   
    String hum = String(data.humidity, 1); //membuat variabel hum untuk di publish ke broker mqtt
    client.publish(TOPIK_HUMI, hum.c_str()); //publish data dari varibel hum ke broker mqtt

    Serial.print("Temperature: ");
    Serial.println(temp);
    Serial.print("Humidity: ");
    Serial.println(hum);
  }
}


Sehingga saat dijalankan secara amazing bisa melempar data suhu dan kelembaban melalui broker hivemq. Dan sebagai PC client yang akan membaca data suhu dan kelembaban ini saya gunakan MQTT explorer yang sudah pernah dibahas pada tulisan sebelumnya.





Lakukan penambahan TOPIK suhu dan kelembaban untuk melakukan subscribe atau berlangganan data yang diinginkan.






Dan hasilnya bisa dilihat pada layar muncul data dari topik yang telah di subscribe dan kemudian  bisa ditampilkan pada grafik seperti berikut.






Jika ingin melempar data ke smartphone, maka gunakan aplikasi "IOT MQTT PANEL" yang dapat di unduh di play store. Gambar grafik smartphone contohnya bisa dilihat pada gambar animasi paling atas atau bisa dilihat pada video youtube disini.





Jika ingin belajar menampilkan grafik pada smartphone melalui aplikasi diatas, kontak saya aja ya...

Share:

Jumat, 03 Maret 2023

PZEM-004T : Terhubung ke Internet melalui Node Red, apakah aman ?

 



Node red pada dasarnya ditujukan pada penggunaan kontrol internal dari suatu sistem dimana jaringan komputernya cukup berupa intranet saja. Ini mungkin terlihat tidak menarik dijaman serba IOT namun dari banyak kejadian penyusupan hacker ke dalam kontrol berbasis internet akan sangat berbahaya. Ingat kejadian ini ?




Wah berbahaya juga ya? Jadi yang aman apa ya ? Security dan kecepatan serta kenyamanan akses juga menjadi pertimbangan dimana keduanya saling berbanding terbalik, mau cepat ya ujungnya tidak bisa terlalu ketat tingkat keamanannya. 


Namun kali ini saya tidak akan terlalu jauh membahas keamanan dari node-red karena mungkin akan melenceng jauh dari pembahasan saya di elektronika. Jadi saya akan membahas 2 cara membawa pengukuran pzem-004t  berbasis node red ( bisa dibaca sebelumnya disini ) menuju ke luar internet.


Menggunakan MQTT


Cara ini sudah pernah saya tulis beberapa tahun lalu, jadi jika ingin mempelajarinya secara mendasar dapat dibaca kembali disini. Setupnya pada node-red cukup sederhana namun hasilnya dapat dihandalkan.







Menggunakan VPN  ZeroTier One


Cara ini cukup beresiko karena meminjam jaringan orang lain sebagai VPN nya walau dari iklannya ZeroTier dibilang akan aman-aman saja. Namun untuk skala belajar di sekolah atau kampus mungkin ini menjadi solusinya. Jadi setelah kamu mendaftarkan akun di Zerotier.com dan membuat networknya, maka dapat menginstall softwarenya di node manapun dan yg terpenting pada PC tempat menginstall Node Red. Jadi semua PC, smartphone android dan linux sekalipun dapat dibuat menjadi 1 jaringan VPN, walau menggunakan jaringan seluler atau dibelakang wifi sekalipun.










Setelah terkoneksi antar network zerotier dengan node PC dan Smartphone android seperti contoh gambar diatas, maka dapat dilakukan pengetesan dengan ping antara node yang terhubung.





Nah jika sudah terhubung antar node ini maka resmilah hubungan yang  "terlarang" antara pzem-nodered-internet dalam melakukan penghitungan daya pada suatu sistem kelistrikan arus AC. Alamat web UI node red yg biasanya http://localhost:1880/ui kini dapat diakses dari jaringan vpn zero tier one dengan alamat http://ip pc node red :1880/ui







Share:

Kamis, 02 Maret 2023

PZEM-004T : Menghubungkan ke grafik PC melalui Node-Red

 


Sebelum melanjutkan praktek pzem ke pc dibawah ini, ada baiknya membaca terlebih dahulu tulisan saya terdahulu mengenai node-red dan modbus, sehingga lebih mudah memahaminya. Saya tidak akan mengulang kembali cara instalasi node red pada pc berbasis windows maupun linux, namun langsung mengingatkan agar jangan lupa menginstall package pada palletes atau npm node js yang berhubungan dengan komunikasi modbus.




Seperti pada pembahasan pzem-004T sebelumnya pada bagian 1 dan bagian 2, untuk membaca tegangan pada pengukuran energi menggunakan pzem-004T adalah dengan akses pembacaan pada alamat 0x0000. Dan dengan menggunakan node-red ini menjadi cukup mudah dilakukan, yaitu menggunakan console debug seperti gambar dibawah ini :




Dan jika perkabelan pada pzem vs usb to serial benar maka pada console debug akan muncul output tegangan.



 

Selanjutnya kita pun dapat merubah parameter pembacaan dengan menampilkan ke semua data yang bisa diperoleh pada Pzem-004T.




Pada gambar diatas dapat dilihat dengan mudahnya dapat mengambil data pengukuran pzem dan kesemuanya dalam satu array yang urut. Jadi jika disandingkan dengan pengukuran dari software bawaan pzem, maka gambarnya sperti ini.




Selanjutnya dengan sedikit pemrograman maka array tadi bisa dipecah dan ditampilkan pada grafik html atau web. Untuk memulainya ada baiknya dibaca dulu pembahas penulisan grafik web UI disini.

Dan hasilnya bisa dilihat seperti berikut  pada alamat browser http://localhost:1880/ui .








Script pada function  untuk merubah array modbus menjadi nilai tegangan seperti ini :



Jadi dengan kreatifitas yang tidak terbatas pada node-red maka akan sangat mudah membuat Man Machine Interface berbasis web ke perangkat sensor maupun aktuator berbasis modbus.

 

Share:

PZEM-004T : Membedah modbus sensor daya serbaguna [part2]

 


Pada bagian sebelumnya telah dijelaskan standar modbus untuk melakukan pembacaan pada sensor daya Pzem-004T. Contoh kasus yang diberikan adalah untuk membaca input register pada alamat tunggal yaitu tegangan dan frekuensi. Bagaimana jika memanggil pembacaan data dengan 16 byte seperti pengukuran arus ? Mari kita baca datasheet dibawah ini :



Terlihat alamat untuk melihat pengukuran arusnya adalah 0x0001 s/d 0x0002 dimana dipecah menjadi 2 bagian 16 bits / 2 byte. Hasil pada real term seperti ini :




01 04 00 01 00 02 20 0B


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
00 01  = 2 byte alamat address memori  untuk  arus pada 0x0001
00 02  = 2 byte jumlah data yang diminta berupa 2 alamat 
20 0B  = Checksum / CRC 16 modbus


Dan replynya seperti berikut  :


01 04 04 00 26 00 00 1A 4F

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
04     =  jumlah byte data yg di response berjumlah 4 byte
00 26  = 2 byte data arus LSB ( digit belakang)
00 00  = 2 byte data arus MSB ( digit depan)
1A 4F  = Checksum / CRC 16 modbus


Jadi dari data diatas  didapatkan reply 2 byte hexa  0x00 (depan) dan 0x26 (belakang) sehingga angka desimalnya adalah 0 dan 38. Jadi berdasarkan datasheet angka pengukuran arusnya adalah 0,038 ampere atau 38 mA.


Jika ingin merubah ID dari modbus Pzem maka kita harus kembali ke datasheet dimana perintah command yg diberikan adalah 0x06 pada address memori 0x0002.



Slave Address + 0x06 + Register Address High Byte + Register Address Low Byte + Register
Value High Byte + Register Value Low Byte + CRC Check High Byte + CRC Check Low Byte.


Sehingga jika ingin merubah ID pzem menjadi 100 (desimal) atau hexa 0x64 perintahnya seperti berikut :






01 06 00 02 00 64 29 E1


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
06     =  Perintah ubah register/ function 06
00 02  = 2 byte alamat address memori  untuk ID modbus 0x002
00 64  = 2 byte alamat baru 100 ( 0x64)
29 E1  = Checksum / CRC 16 modbus


Reply yg diberikan jika perubahan benar terjadi dan disimpan adalah sama dengan hexa yg dikirim seperti gambar diatas. Dan kini perangkat Pzem nya sudah memiliki ID baru yaitu 100 seperti yg terlihat pada gambar berikut :




 
Sedangkan hal yg perlu diperhatikan selanjutnya adalah perintah untuk mereset jumlah pemakaian energi watt hour menjadi nol dimana pada data sheet diberikan petunjuk dengan menggunakan perintah  ID  + 0x42 + CRC , dimana jika pada alamat 100 seperti gambar dibawah :




 

Pada software pzem PC juga bisa dilihat hasil resetnya :




Lalu sempat terpikir, bagaimana jika tidak mengetahui alamat slave ID dari Pzem ? Ada kok caranya mereset menurut datasheet ...



0xF8 + 0x41 + 0x37 + 0x21 + CRC check high byte + CRC check low byte.   ( 3721 adalah password default ).


Mari kita coba ...



Ternyata response nya gagal.....0xF8 0xC1 artinya gagal melakukan kalibrasi awal....lain kali kita coba lagi

Share:

PZEM-004T : Membedah modbus sensor daya serbaguna [part1]

 


Mungkin, sensor daya serbaguna "pzem" sudah banyak sekali dan mudah menemukan pembahasannya di internet, baik dibahas youtuber dalam dan luar negeri maupun di berbagai forum diskusi elektronika dan IOT. Umumnya yang dibahas adalah penjelasan mengenai script dan library jika pzem digunakan sebagai sensor daya pada arduino maupun esp8266. Namun kali ini sesuai seri pembahasan MODBUS yang saya buat 2 tahun sebelumnya ( klik disini ) maka saya akan mebahas "jeroan" dari protokol modbus yang digunakan Pzem-004T. Pada bagian pertama ini kita akan bahas rangkaian dan dasar modbus yang digunakan.

Karena saya tidak menggunakan arduino, maka kali ini saya akan menghubungkan langsung pzem-004T langsung ke PC melalut USB to TTL seperti panduan setup koneksi perkabelan yang tertulis pada kertas manual. Mdul pzem yang saya dapatkan adalah versi dengan trafo CT dengan arus maksimum 100A dan saya hubungkan ke PC sebagai gambar berikut.



Penulis awalnya kesulitan untuk mengakses pzem-004T secara serial melalui tools pada PC, namun setelah membaca skematik dari pzem-004T dapat disimpulkan bahwa IC procesor dari pzem V9881D mendapatkan suply tegangan DC dari sisi mains atau ac yang akan diukur.



Jadi ilmu yang didapat dari membaca skematik adalah bahwa pzem-004T yang original hanya bisa mengukur tegangan AC dari 80 volt - 260 volt sehingga tidak bisa mengukur daya pada tegangan ac dibawah 80 volt. Hal ini banyak dikeluhkan orang sehingga ada salah satu video youtube yang saya sempat liat merubah sumber tegangan dari input dc zener dikiri IC regulator 7133 menjadi berasal dari 5 volt usb to serial. Hasilnya pun kini bisa melakukan pengukuran dari 0 volt sampai dengan 260 volt. 

Keluhan yang lain dari alat yang baru saya dapatkan ini mungkin berupa kerusakan produksi dimana solderan pada optocoupler / optoisolator yang tidak bagus sehingga sempat membuat kebingungan akibat aliran data yang tekadang putus nyambung. Dengan melakukan penyolderan ulang hal ini dapat diatasi secara tuntas.

Untuk melakukan pengetesan awal maka pembaca dapat mengunduh software test pzem di link ini : klik disini.




Dari software ini juga bisa dilakukan perubahan parameter dan mereset nilai penggunaan energi.




Dari pabriknya china sana sensor ini diseting dengan alamat atau device ID 1 dan dengan menggunakan software ini ID modbus nya bisa diubah jika ingin menggunakan beberapa sensor secara bersamaan.

Lalu bagaimana cara membaca pengukuran sensor ini ? Tenang saja, jika belum paham mengenai cara akses dan baca protokol modbus bisa membaca tulisan saya sebelumnya disini. Jadi kita perlu unduh software serial terminal bernama real term yang cukup kompleks namun sangat bermanfaat untuk membedah berbagai protokol serial. Perhatikan urutan gambar berikut dan bisa langsung dipraktekkan juga.







Untuk memudahkan pemahaman awal pembaca yang mungkin kebingungan, maka saya akan coba menjabarkan modbus untuk mendapatkan nilai tegangan AC nya yang sesuai berdasarkan manualnya dimana memiliki address 0x000. Perintahnya seperti berikut ini :


01 04 00 00 00 01 31 CA


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
00 00  = 2 byte alamat address memori  untuk tegangan pada 0x0000
00 01  = 2 byte jumlah data yang diminta berupa 1 alamat saja
31 CA  = Checksum / CRC 16 modbus


Sedangkan reply dari pzem adalah sebagai berikut :


01 04 02 09 03 FF 61

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
02     =  jumlah byte data yg di response 
09 03  = 2 byte data tegangan dalam hexa
FF 61  = Checksum / CRC 16 modbus


Jika menggunakan kalkulator merubah Hexa ke Decimal, maka nilai tegangan 0x0903 ini sama dengan nilai 2307 yang memiliki arti tegangan yang diukur oleh pzem-004T adalah 230,7 volt. Lalu bagaimana jika ingin membaca nilai frekuensi jala-jala / mains ?


01 04 00 07 00 01 80 0B

Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
00 07  = 2 byte alamat address memori  untuk frekuensi pada 0x0007
00 01  = 2 byte jumlah data yang diminta berupa 1 alamat saja
80 0B  = Checksum / CRC 16 modbus



Replynya bagaimana ?



01 04 02 01 F4 B9 27

01     =  Alamat device id slave
04     =  Perintah membaca input register/ function 04
02     =  jumlah byte data yg di response 
01 F4  = 2 byte data frekuensi dalam hexa
B9 27  = Checksum / CRC 16 modbus


Jika dirubah nilai frekuensi hexa 0x01F4 dalam decimal bernilai 500 dengan kata lain 50,0 hz. Pada bagian selanjutnya saya akan jelaskan cara merubah parameter lainnya pada pzem-004T dan melakukan reset ketika ID dari modbusnya tidak diketahui.



Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (6) arduino (24) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (53) 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 (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (7) mqtt (3) ninmedia (4) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (86) pcb (2) power (1) praktek (2) project (33) proyek (1) python (5) radio (15) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) 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 (166) television (28) transistor (2) troubleshoot (3) tulisan (90) tutorial (101) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika