Arsip untuk September, 2017


Assalamu’alaikum Wr. Wb.

Diagram Sync Data ke server slave

Diagram Sync Data ke server slave

alamat server slave di ralat di http://appscenter.aio.co.id/weatherlogger/

alamat master logger di http://weatherlogger.ap.ngrok.io/

Oke saya lanjutkan. remind lagi ini adalah seri berantai dari posting berikut ya

  1. https://tarecha.wordpress.com/2015/10/26/project-raspberry-pi/
  2. https://tarecha.wordpress.com/2017/06/05/project-weather-logger-part-1/
  3. https://tarecha.wordpress.com/2017/06/26/project-weather-logger-part-2-tambahan-sensor-tekanan-udara/
  4. https://tarecha.wordpress.com/2017/07/01/project-weather-logger-part-3-komunikasi-udp/
  5. https://tarecha.wordpress.com/2017/07/15/project-weather-logger-part-4-simpan-di-server-mysql/
  6. https://tarecha.wordpress.com/2017/07/24/project-weather-logger-part-5-view-data-dan-export/
  7. https://tarecha.wordpress.com/2017/07/25/project-weather-logger-part-6-plot-graphic/
  8. https://tarecha.wordpress.com/2017/07/29/project-weather-logger-part-7-ngrok-http-tunneling/
  9. https://tarecha.wordpress.com/2017/08/27/project-weather-logger-part-8-ganti-sensor-bme280/

 

sepertinya ini part terahir ya. selanjutnya cman tambahan2 fitur saja mungkin, seperti mbandingkan suhu malang sama pasuruan atau membandingkan suhu dalam 3 hari terakhir. cman improvement di PHP nya saja.

Big Picture System

Big Picture System

tentu masih ingat gambar ini kan di part sebelumnya. ya tujuan ada synconize data adalah mengatasi ketebatasan koneksi internet yang baru bisa jalan saat tehtering internet melalui smartphone dilakukan. dan ketika master logger raspberry pi tidak konek internet sehingga tidak bisa diakses langsung menggunakan ngrok http tunelling. user bisa akses ke slave server. tentu kombinasinya itu multi site, jadi berapapun master logger raspberry pi / windows yang ada bisa di sync datanya ke slave server. slave server ini pun bisa lebih dari 1, bisa 2, bisa 3. tapi sih cukup 1 saja saya rasa sudah lebih dari cukup

Jika Anda kritis dengan skema yang saya buat kira2 akan menanyakan hal seperti ini

  1. Mengapa menggunakan port 80 baik pada socket untuk komunikasi dengan node mcu maupun save datanya menggunakan php yang juga jalan di port 80 ?
  2. mengapa simpan datanya tidak langsung pakai mysql yang nembak langsung ke database, lebih efisien daripada masih harus bikin program php nya

Ok saya akan coba jawab

  1. Port 80 adalah port open yang sangat jarang sekali oleh administrator jaringan di blok ( klo di blok gk bisa buka kompas youtube ataupun gmail ) jadi karena “port yang pasti dibuka” maka saya gunakan port 80 untuk komunikasi nya. meski agak aneh kirim data UDP ke node mcu pakai port 80.
  2. Jarang sekali ada web hosting yang membuka port 3306 untuk akses MySQL secara langsung, saya berfikir kedepan gimana kalau saya taruh di webhosting yang murah atau bahkan webhosting gratisan ? setahu saya mereka gk buka port 3306 nya. Jadi saya pakai program PHP untuk save datanya karena dia jalan di port 80 yang pasti open dan bisa ditaruh di webhosting shared biasa. contohnya slave server http://appscenter.aio.co.id/weatherlogger/ s    ini hanya diopen port 80 nya saja karena ini adalah webserver yang bisa diakses dari luar :-). soal keamanan juga. sebenarnya saya numpang ke server saya sendiri he he . tapi insyaAllah aman kok.

 

kode lengkapnya saya upload di https://github.com/tarecha/weatherlogger karena saya gk bisa pakai git, biasanya pakai svn tortoise, ah ribet jadi diupload biasa pakai file .zip

file sync.py

import socket
import sys
import datetime
import time
import urllib2
import urllib

 

urlsourcegetsync = "http://localhost/getsync.php"
urlsourceupdatestatus = "http://localhost/updatestatussync.php"
urldestinationinsertdata = "http://isikan alamat slave server/insertdata.php"
key = "12345"
updateflag = 'sync1'
limit = '20'
sleeptime = 1
sleeptimeerror = 5
i=0
while 1:
         
        try :
                print '# '+str(i)
                datagetupdate={}
                datagetupdate['k']= key
                datagetupdate['sync'] = updateflag
                datagetupdate['limit'] = limit
                dataformaturl = urllib.urlencode(datagetupdate)                    
                requesttoserver = urllib2.urlopen(urlsourcegetsync,dataformaturl,timeout=5)
                datarowall=requesttoserver.read()
                             
                if(datarowall[0]!='i'): #jika kembalian ada i nya maka gagal kalau tidak maka lanjut
                        datarow = datarowall.split("#")
                        datarow.pop() #hapus last row karena isinya kosong (/r/n/r/n) new line                        
                        print 'ada data baru'
                        #print datarowall
                        #print datarowall
                        #print datarow
                        for valuetosync in datarow:
                                
                                datasync={}
                                datasync=valuetosync.split(",")
                                data={}
                                data['k']= key
                                data['iddata'] = datasync[0]
                                data['idnode'] = datasync[1]
                                data['hum'] = datasync[2]
                                data['temp'] = datasync[3]
                                data['press'] =  datasync[4]                                
                                data['waktu'] = datasync[5]                                
                                if updateflag=='sync1':
                                        data['sync1'] = '1'
                                else:
                                        data['sync1'] = '0'
                                if updateflag=='sync2':
                                        data['sync2'] = '1'
                                else:
                                        data['sync2'] = '0'
                                #print data
                                dataformaturl = urllib.urlencode(data)                                
                                requesttoserver = urllib2.urlopen(urldestinationinsertdata,dataformaturl,timeout=5)               
                                
                                infosavephp = requesttoserver.read().split("#")
                                time.sleep(sleeptime) 
                                
                                #print '=========================================================================='  
                                if(infosavephp[0]=='i')and(infosavephp[1]=='Berhasil Insert'):
                                        print 'Informasi : Sync ke Slave Server : ID '+infosavephp[2]
                                        #updatestatus
                                        dataupdatestatus={}
                                        dataupdatestatus['k']=key
                                        dataupdatestatus['iddata']=infosavephp[2]
                                        dataupdatestatus['sync']=updateflag
                                        dataformaturl = urllib.urlencode(dataupdatestatus)
                                        requesttoserver = urllib2.urlopen(urlsourceupdatestatus,dataformaturl,timeout=5)
                                        infosavephp = requesttoserver.read().split("#")                                       
                                        print 'Informasi : '+infosavephp[1]+ ' ke master logger'
                                else:
                                        print 'update status sync gagal '
                                        print infosavephp
                                
                                
                                     
                                        
                else: #kembalian getsync.php
                        print 'tidak ada data baru'
                        
                time.sleep(sleeptime)                        
                 
        except urllib2.HTTPError:
                print 'Tidak konek server untuk sync'
                sleep(sleeptimeerror) 
        except urllib2.URLError:
                print 'Tidak konek server untuk sync'
                time.sleep(sleeptimeerror) 
                
        except socket.error:
                print 'Tidak konek node'
                #tidak pernah exit karena kalau tidak konek dilewati dan ngulang
                #5 detik kemudian
                #sys.exit()
                time.sleep(sleeptimeerror) 
        except Exception as e:
                print 'Error Message '+ str(e)
                print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
                print "General Error Unexpected error:", sys.exc_info()[0]
                time.sleep(sleeptimeerror) 
        i+=1
        
       


Sync Data

Sync Data

 

ini dari cara kerjanya adalah .

selama koneksi ada maka dia akan sync data, ketika tidak ada ya tetep jalan cman gk sync data karena gk konek. ketika ada koneksi maka list data yang belum di sync kana disync secara berurutan.

sekian kira2.

nanti akan saya buatkan resume dalam bahasa inggris sekalian di ikutkan dalam project hackster.io.

 

Terima Kasih

Wassalamu’alikum Wr. Wb.