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

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:

Senin, 11 Juli 2022

Magang Industri "Kembali" Menghiasi Aisi555 Setelah Pandemi - Teknik Listrik D4 Unesa Surabaya

 



Semangat berbagi ilmu dari aisi555 baik melalui tulisan maupun praktek langsung dilapangan, sempat mengalami episode "down" setelah terpukul pandemi corona di tahun 2020 dan 2021. Padahal di tahun 2020 mendapat kepercayaan kembali untuk menerima magang anak - anak SMK 1 dan SMK 2 dari kota Kediri, serta yang menggembirakan adalah ditandatanganinya kerjasama magang industri dengan fakultas vokasi ITS, setelah pada 2019 berhasil menerima trial magang anak ITS - D4 kontrol selama 6 bulan. Dan ini semuanya buyar akibat pandemi yang mengurung semua kegiatan pendidikan di rumah saja. Ya saya sadar itu diluar kendali saya dan saya tetap berusaha berbagi ilmu melalui jalur online, baik di blog ini dan saya mulai membuat tutorial via video youtube dan facebook.



Kegiatan diatas merupakan puncak dari rencana besar aisi555 untuk berkecimpung di dunia pendidikan bertema elektronika dan IOT, dimana aisi555 menjadi tersadar bagaimana terbukanya pikiran bahwa dunia pendidikan memiliki pangsa pasar yang tidak akan habis. Namun seperti merupakan salah satu "takdir" penulis, ketika tawaran kerjasama banyak datang, namun 2 minggu setelah pameran diatas, dunia pendidikan dipaksa melakukan "lockdown" karena merebaknya kasus covid yg menyebar di sekolah. Dan setelah lama menunggu akhirnya aisi555 kembali mendapatkan kepercayaan mengisi kuliah tamu dalam bungkus "kampus merdeka" pada 2021. 


Aisi555 yang bernaung dibawah bendera PT. Indotech Infrastruktur Solusi kemudian menjalin kerjasama magang Industri untuk mahasiswa yang kini dibebaskan memilih jenis industri apa yang akan di ambil, yang kemudian kesempatan ini diambil oleh anak-anak jurusan D4 Teknik Listrik - Prodi Vokasi - Unesa Surabaya angkatan 2019. Magang industri ini telah diadakan pada februari - juni 2022 dengan tema yang diambil bergaris besar pada Baterai dan monitoringnya secara IOT. 



Pola magang kali ini diadakan secara Online dan Offline dimana ada meeting pengarahan teori setiap minggunya yang dilaksanakan melalui media meeting video online. Kemudian di tiap bulanannya diadakan pertemuan tatap muka untuk melakukan evaluasi dan menyusun project yang tepat sebagai tugas akhir dan laporan magang sesuai tema yang diberikan oleh pihak kampus. Berikut ini beberapa garis besar atau tema yang diberikan tiap bulannya :


  • Bulan 1 : Pengenalan organisasi perusahaan dan peraturan perusahaan
  • Bulan 2  : Teknologi baterai sell basah / aki, charging dan discharging serta perawatannya
  • Bulan 3  : Baterai Lithium ion dan Mikrokontroller
  • Bulan 4  : Komunikasi data sensor dan IOT  
  • Bulan 5  : Digital Marketing
  • Bulan 6  : Proyek akhir yang berhubungan dengan Baterai & IOT




Dan pada akhir dari periode magang kali ini telah dilaksanakan presentasi project akhir dari masing-masing peserta sebagai berikut :


Project 1 :  Charger Accu Auto Cut Off berbasis timer 555




Project 2 :  Desulfator Aki Basah berbasis timer 555




Project 3 :  BMS dan PowerBank Baterai Li-Ion 18650 




Project 4 :  Monitoring Kesehatan Accu Berbasis Arduino




Project 5 :   Monitoring Kesehatan Aki Secara IOT dengan Protokol MQTT





Berminat untuk magang bersama aisi555 ? Kontak kami ada di sebelah kanan layar ....Saya tunggu ....

Share:

Jumat, 27 Mei 2022

Belajar LoRaWan Antares - Pengolahan Data Device ( Req - Resp ) Dengan Python & MQTT

 


Setelah saya sukses membuat hello world antara modul LoRa dengan Gateway LoRawan Telkom (baca disini), saya akan lanjut membahas pengolahan data yang "lebih berguna" menggunakan sensor sejuta umat DHT dan dengan protokol IOT paling enteng yaitu MQTT. Untuk memahami bagaimana pemahaman PUB dan SUB dari platform IOT Antares yang menggunakan standar M2M, maka perlu sekali untuk memahami pembahasan sebelumnya di blog ini, diantaranya :


  • Proses PUB dan SUB dari Antares yang menggunakan 1 topik untuk PUB/REQ dan 1 topik untuk SUB/RESP. Jadi ketika data diterima antares, tidak serta merta akan diberikan kepada yag subscribe, jadi butuh REQUEST data dengan payload tertentu dan kemudian menerima RESPONSE pada 1 topik (hanya 1 tiap akun) yg telah di subscribe. Bisa dibaca disini  ,  disini , dan disini
  • Python Paho-mqtt sebagai library paling umum untuk menerima dan mengolah protokol mqtt sehingga dapat dilanjutkan ke proses selanjutnya seperti menyimpan database, membuat grafik atau mengirim ke bot telegram. Bisa dibaca dulu agar mengerti disini dan disini.




Hardware yang kita gunakan masih seperti sebelumnya yaitu breakout board LoRa RFM95 dan arduino uno/nano/pro sebagai pengontrol nya. Sebagai sensor saya gunakan DHT22 yang lebih bagus dari kakaknya DHT11, rangkaiannya kira-kira seperti ini (sesuaikan dengan pin SPI pada arduino yg dipakai) :




Script arduinonya merupakan penggabungan tutorial hello world  sebelumnya dengan menggunakan library LoRaWan Packet yang lumayan stabil untuk pengiriman data. Tanpa menunda-nunda saya bagikan script untuk mengirim suhu dan kelembaban ke Antares melalui LoRaWan :


#include <SPI.h>
#include <LoRa.h>
#include "DHT.h"
#include <LoRaWanPacket.h>

//Sesuaikan PIN CS, Reset, DIO0

const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2;

const int dhtPin = 3; //Sesuaikan pin DHT

//Sesuaikan dev address dan key device LoRa
const char *devAddr = "aabbccdd";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";

#define DHTTYPE DHT22  //Sensor DHT22
DHT dht(dhtPin, DHTTYPE); 

struct LoRa_config
{
  long Frequency;
  int SpreadingFactor;
  long SignalBandwidth;
  int CodingRate4;
  bool enableCrc;
  bool invertIQ;
  int SyncWord;
  int PreambleLength;
};

//Frekuensi Telkom LoRawan 922MHZ, sesuaikan dengan BTS GW terdekat

static LoRa_config txLoRa = {922000000, 10, 125000, 5, true, false, 0x34, 8};

void LoRa_setConfig(struct LoRa_config config)
{
  LoRa.setFrequency(config.Frequency);
  LoRa.setSpreadingFactor(config.SpreadingFactor);
  LoRa.setSignalBandwidth(config.SignalBandwidth);
  LoRa.setCodingRate4(config.CodingRate4);
  if (config.enableCrc)
    LoRa.enableCrc();
  else
    LoRa.disableCrc();
  if (config.invertIQ)
    LoRa.enableInvertIQ();
  else
    LoRa.disableInvertIQ();
  LoRa.setSyncWord(config.SyncWord);
  LoRa.setPreambleLength(config.PreambleLength);
}

void LoRa_TxMode()
{
  LoRa_setConfig(txLoRa);
  LoRa.idle();
}

void setup()
{
  Serial.begin(9600);
  while (!Serial);

  LoRaWanPacket.personalize(devAddr, nwkSKey, appSKey);

  LoRa.setPins(csPin, resetPin, irqPin);

  if (!LoRa.begin(txLoRa.Frequency)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }

  Serial.println("LoRa init succeeded.");
  Serial.println();
  dht.begin();

}


String SendTempHumid(){ //kirim data pengukuran DHT
   
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" °C ");
  //yang dikirim data berupa string JSON
  
  return( "{\"suhu\":" + String(t) + ",\"humi\":" + String(h) +"}"); 
  }


void loop() {
  if (runEvery(10000)) {

    LoRa_sendMessage();
    Serial.println("Kirim data!");
  }
}

void LoRa_sendMessage()
{
  LoRa_TxMode();
  LoRaWanPacket.clear();
  //Serial.println(SendTempHumid());
  LoRaWanPacket.print(SendTempHumid());
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}





Dan hasil yang didapatkan berupa data JSON string pada console web antares.




Lalu bagaimana cara mengunduh atau mengambil data dari web antares tadi ? Sebenernya pada python telah dibuatkan library untuk mengunduh data antares secara http yang telah saya bahas disini : https://www.aisi555.com/2020/08/solderpiraspberry-pi-ke-antares-semakin.html . Namun kali ini saya ingin menggunakan protokol MQTT agar lebih memahami proses SUB dan PUB pada antares yang berbeda dengan broker MQTT pada umumnya. Secara singkat proses untuk mendapatkan data dari database antares sebagai berikut:


1. Gunakan broker MQTT antares dan dengan topik yang FIX gak bisa diutak-atik. Sesuaikan script dibawah dengan User key pada akun antares yang digunakan.

broker = 'mqtt.antares.id'
port = 1883
topicsubantares = "/oneM2M/resp/antares-cse/1111111111111111:2222222222222222/json"  
topicpubantares = "/oneM2M/req/1111111111111111:2222222222222222/antares-cse/json"


2. Jika ingin mengunduh data terakhir dari sebuah device, maka dikirimkan (PUB) ke topik yang cuman ada satu itu. Pesan request JSON nya seperti ini :

def antares_request_last(client: mqtt_client):
    data_raw = ("{"
      "\"m2m:rqp\": {"
      "\"fr\": \"1111111111111111:2222222222222222\","
      "\"to\": \"/antares-cse/antares-id/APP_NAME/Cevice_Name/la\","
      "\"op\": 2,"
      "\"rqi\": 123456,"
      "\"ty\": 4"
      " }"
      "}")
    ret=client.publish(topicpubantares,data_raw)


3. Response dari antares akan dikirim ke topik SUB (fix 1 saja untuk 1 akun) dengan format seperti berikut:

   "m2m:rsp" : {
      "rsc" : 2000,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_TQ_E2xnzT42t3zsS",
            "ty" : 4,
            "ri" : "/antares-cse/cin-TQ_E2xnzT42t3zsS",
            "pi" : "/antares-cse/cnt-pqq6TLDSTvqCizzB",
            "ct" : "20220526T080631",
            "lt" : "20220526T080631",
            "st" : 0,
            "cnf" : "text/plain:0",
            "cs" : 239,
            "con" : "{\"type\":\"uplink\",\"port\":1,\"data\":{\"suhu\":30.1,\"h
umi\":79.2},\"counter\":6,\"radio\":{\"gps_time\":1337562409369,\"hardware\":{\"
snr\":0.5,\"rssi\":-106},\"modulation\":{\"bandwidth\":125000,\"spreading\":10},
\"delay\":0.05295205116271973,\"freq\":922,\"size\":40}}"
         }
      },
      "to" : "1111111111111111:2222222222222222",
      "fr" : "/antares-cse"
   }


4. Dari data  diatas maka dibutuhkan pemahaman bahasa python dan konsep parsing Dictionary atau JSON string untuk dapat mengolah data lebih jitu. 


def parsing_data(datae):
    datanya = json.loads(datae['m2m:rsp']['pc']['m2m:cin']['con'])
    gps_time = math.floor(datanya['radio']['gps_time']/1000) +25200
    waktu = datetime(1980, 1, 6) + timedelta(seconds=gps_time - (35 - 19))
    #print(type(datanya['radio']['gps_time']))
    print(waktu)
    print('Suhu       = ' + str(datanya['data']['suhu']) + ' Celcius ')
    print('Kelembaban = ' + str(datanya['data']['humi']) + ' % Rh\n\n')   



Script python lengkapnya akan saya bagikan jika pembaca membutuhkannya, dan yang ingin bertanya langsung aja ke email: ahocool@gmail.com atau whatsapp ke 08155737755. Hasilnya bisa dilihat pada video singkat berikut ini :





Share:

Senin, 13 September 2021

ESP8266 - @Telegram_Bot - Part 4 : Kirim Grafik Real Time ke Bot

 


Seperti yang sudah kita praktekkan sebelumnya, Modul ESP8266 sekelas Wemos D1 memiliki kemampuan untuk berkomunikasi dengan API Telegram BOT secara pooling. Namun dikarenakan limitasi dari resource dan syarat dari API yang menggunakan SSL terenkripsi maka akan menyebabkan lambatnya respon yg didapat. Untuk itu butuh perantara di mesin yg lebih cepat seperti raspberry pi atau komputasi cloud yg dapat melayani kebutuhan kapan saja. 

Setelah berhasil menyimpan data dan menggambarkan grafiknya, kita sampai pada pembahasan terakhir yaitu mengirimkan grafik realtime melalui bot telegram. Secara garis besar alur cerita dari logika yg saya buat seperti berikut :


  • ESP8266 membaca sensor DHT 11 dan mengirimkan secara PUB ke MQTT Broker.
  • MQTT broker meneruskan data ke pihak yg melakukan SUB, dalam hal ini PC+python di rumah saya.
  • Python melakukan penyimpanan data suhu dan kelembaban ke SQLite secara berkala setiap ada pesan MQTT yg sampai ke PC.
  • Python mengontrol komunikasi ke API telegram bot dan kemudian mengirimkan grafik jika diminta.


Library atau modul python yg digunakan untuk mengotrol telegram bot adalah python-telegram-bot, jangan lupa untuk meginstalnya di komputer kamu.


$ pip install python-telegram-bot 


Sedangkan module lainnya sudah dibahas pada praktek sebelumnya, tanpa berpanjang lebar lagi, berikut ini script python sebagai jembatan ESP8266 dengan telegram bot


from telegram import Bot, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Updater, MessageHandler, Filters
import random, json, sqlite3, datetime, time
from paho.mqtt import client as mqtt_client
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style

# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic di praktek sebelumnya


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

bot = Bot('XXXXXXXX:XXXXXXXXXXXXXXXXXX') #isi sesuai Token BOT anda


#Masukkan ke database dan tambahkan kolom date
def sql_insert(s,h):
db = sqlite3.connect("humitemp.db") #buat dulu databasenya
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()

def graph_data(uid):
# Connect to database
sqlite_file = 'humitemp.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn')
    #pilih 30 data terakhir
c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 30')
data = c.fetchall()

temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Kondisi Lingkungan")

# Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Suhu [°C]")
ax1.plot_date(dates, temperature, '-', label="Suhu", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Kelembaban [% RH]")
ax2.plot(dates, humidity, '-', label="Kelembaban", color='g')

# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.savefig("figure.png") #simpan dalam file gambar

c.close()
conn.close()
bot.send_photo(uid, photo=open('figure.png', 'rb')) #kirim ke bot telegram berupa gambar

def reply(uid, teks, tombolList): #biar tampil tombol bot keren
if len(tombolList) == 0:
tombol = ReplyKeyboardRemove()
else:
tombol = ReplyKeyboardMarkup([tombolList], resize_keyboard=True)
bot.send_message(uid, parse_mode="HTML", text='<b>' + teks + '</b>', reply_markup=tombol)


def respond(data, update): #membaca dan membalas respon dari pengguna bot
message = data.message
teks = message.text
uid = message.chat.id # user id

if teks == 'suhu':
bot.send_message(uid, parse_mode="HTML", text="<b>Suhu</b> : " + str(suhu) + " °C")
elif teks == 'humi':
bot.send_message(uid, parse_mode="HTML", text="<b>Kelembaban</b> : " + str(humi) + " % rH")
elif teks == 'grafik':
graph_data(uid) #kirim grafik

if teks.find('suhu') != -1 or teks.find('humi') != -1 or teks.find('/start') != -1:
reply(uid, "ESP8266 ULO by Aisi555.com", ["suhu", "humi", "grafik"])
else:
reply(uid, "Silahkan Pilih Tombol", ["suhu", "humi", "grafik"])
return "ok"


# koneksi Mqtt
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 topik mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
global suhu, humi, indeks
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode()) #parsing json
suhu = data["suhu"]
humi = data["humi"]
sql_insert(suhu,humi) #kirim ke SQLite
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message


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


if __name__ == '__main__':
updater = Updater(bot=bot)
dispatcher = updater.dispatcher

dispatcher.add_handler(MessageHandler(Filters.text, respond))

print("@" + bot.username + " siap.")
updater.start_polling()
run()
updater.idle()


Berikut ini penjelasan secara detail, dimulai dari Module Python yg digunakan :


from telegram import Bot, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Updater, MessageHandler, Filters
import random, json, sqlite3, datetime, time
from paho.mqtt import client as mqtt_client
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


Yang dibawah ini merupakan inilisalisasi broker MQTT dan token BOT Telegram.


# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic di praktek sebelumnya


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

bot = Bot('XXXXXXXX:XXXXXXXXXXXXXXXXXX') #isi sesuai Token BOT anda


Selanjutnya routine / function untuk mengatur koneksi MQTT dan Subcribe topiknya. Setiap ada message yg masuk dari MQTT langsung disimpan pada database SQLite.


# koneksi Mqtt
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 topik mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
global suhu, humi, indeks
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode()) #parsing json
suhu = data["suhu"]
humi = data["humi"]
sql_insert(suhu,humi) #kirim ke SQLite
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message


Setelah data tersedia dari broker MQTT, maka dilakukan penyimpanan database oleh function berikut :


def sql_insert(s,h):
db = sqlite3.connect("humitemp.db") #buat dulu databasenya di SQLite
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()


Respon dari Telegram Bot dilakukan di function berikut ini :


def respond(data, update): #membaca dan membalas respon dari pengguna bot
message = data.message
teks = message.text
uid = message.chat.id # user id

if teks == 'suhu':
bot.send_message(uid, parse_mode="HTML", text="<b>Suhu</b> : " + str(suhu) + " °C")
elif teks == 'humi':
bot.send_message(uid, parse_mode="HTML", text="<b>Kelembaban</b> : " + str(humi) + " % rH")
elif teks == 'grafik':
graph_data(uid) #kirim grafik

if teks.find('suhu') != -1 or teks.find('humi') != -1 or teks.find('/start') != -1:
reply(uid, "ESP8266 ULO by Aisi555.com", ["suhu", "humi", "grafik"])
else:
reply(uid, "Silahkan Pilih Tombol", ["suhu", "humi", "grafik"])
return "ok"


Biar tambah keren ditambahkan reply keyboard "markup" seperti berikut :


def reply(uid, teks, tombolList): #biar tampil tombol bot keren
if len(tombolList) == 0:
tombol = ReplyKeyboardRemove()
else:
tombol = ReplyKeyboardMarkup([tombolList], resize_keyboard=True)
bot.send_message(uid, parse_mode="HTML", text='<b>' + teks + '</b>', reply_markup=tombol)




Untuk menampilkan grafik digunakan module Matplotlib, persis dengan pembahasan sebelumnya.


def graph_data(uid):
# Connect to database
sqlite_file = 'humitemp.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn')
    #pilih 30 data terakhir
c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 30')
data = c.fetchall()

temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Kondisi Lingkungan")

# Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Suhu [°C]")
ax1.plot_date(dates, temperature, '-', label="Suhu", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Kelembaban [% RH]")
ax2.plot(dates, humidity, '-', label="Kelembaban", color='g')

# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.savefig("figure.png") #simpan dalam file gambar

c.close()
conn.close()
bot.send_photo(uid, photo=open('figure.png', 'rb')) #kirim ke bot telegram berupa gambar


Hasil pada BOT Telegram seperti berikut ini :




Grafik lebih jelasnya seperti pada gambar berikut :




Keren bukan ? Selamat mencoba ! 

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 (25) 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 (26) 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