Project weather logger part 4 : Simpan di server MySQL

Posted: 15 Juli 2017 in Otomasi dan Robotika

Assalamu’alaikum Wr. Wb.

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/

Ok semakin kesini semakin sulit dan rumit, sampai saya sendiri bingung bagaimana menuliskannya agar mudah dipahami. saya akan bikin sekma gambar big picture nya ya. biar jelas “maksudnya apa”.

Big Picture System

Big Picture System

Flow Sync Data
Flow syc data

oh ya seperti yang saya infokan sebelumnya ada tambahan komponen. sebenarnya arus nya cukup. hanya saja saya curiga dht nya gk stabil jadi saya kasi regulator tambahan 3.3v. lagi pula ams117 nya itu sisa raspi yang dulu.

pin vu ini 5v dari usb kita sambungkan ke regulagor. ada kapasitor elco dan keramik agar dayanya stabil

schematic

schematic

 

Bagaimana save di server mysql ?

saya menggunakan file php untuk savenya , pyhon melempar data ke file insertdata.php lalu php yang save datanya. mengapa demikian ? coba anda cari web hosting yang port MySQL 3306 nya dibuka, apalagi saya berencana di hosting gratisan. tentu yang dibuka port 80 nya saja untuk akses web nya. jadi kira2 sekemanya seperti ini

skema insert data

diagram simpan data

diagram simpan data

kira2 seperti ini

 

dan nantinya kita memonitor melalui grafik hubungan suhu, humiditym dan pressure di waktu yang sama, nanti ya

grafik gabung semua

grafik gabung semua

 

oke kita mulai langkah2 nya. mungkin ini akan overlap ya karena beberapa menggunakan coding untuk next capter.

Pre oh ya karena saya pakai Raspberry pi maka perlu install phpmyadmin, mysql, dan apache disini http://lastbug.net/blog/2016/01/23/install-apache-php-and-mysql-and-phpmyadmin-on-raspberry-pi/

atau mudahnya jalankan perintah ini arti -y adalah langsung install gk perlu ketik Yes waktu konfirmasi install
 
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install apache2 apache2-utils libapache2-mod-php5 php5 php-pear php5-xcache php5-mysql mysql-server mysql-client phpmyadmin
 
  1. Membuat database
    Buat user dan database masterlogger dan tabel masterdata. yang perlu dicatat iddata auto_increment dan primary key di master logger untuk generate id datanya dimana nilai auto increment ini nanti diambil untuk di save pada file csv ( comma sparated value ). sedangkan nanti di database slave iddata tidak perlu jadi primary key dan autoincrement karena nilai id nanti diambil dari master logger sehingga sama persis dan bisa saja di slave database menampung iddata yang sama karena slave logger bisa menampung lebih dari 1 node raspberry pi. panjang lah ceritanya. agak bingung ya ?

    struktur tabel masterdata

    struktur tabel masterdata

  2. File PHP untuk insert data
    oke pastikan anda sudah familiah dengan xampp ya. kita langsung saja bikin filenya
    pertama adalah config.php file ini menyimpan settingan  database
isi dari config.php
</pre>
<?php
//define ini untuk mengakali code ignitner yang gk bisa akses ke filenya langsung karena ambil settingan dari sana
define('BASEPATH', "/");
define('ENVIRONMENT', "production");

//include $_SERVER['DOCUMENT_ROOT']."/application/config/database.php";
include "/application/config/database.php";
$key = $db['default']['key'];

//===============================================================================
error_reporting(E_ERROR | E_PARSE);
$conn =mysqli_connect($db['default']['hostname'],$db['default']['username'],$db['default']['password']);

if (!$conn)
{

die('i#Server tidak konek#Periksa link');
}

$selected_database = mysqli_select_db($conn, $db['default']['database']);
if (!$selected_database)
{
die('i#Database tidak ditemukan#Periksa database');
}

?>
<pre>

lalu berikut file insertdata.php
variabel $k adalah key semacam password yang dicocokkan setiap posting data dari program python. isinya saya simpan di database .php milik code igniter

</pre>
<?php
include "config.php";

if(isset($_POST['k']))
{
if( $_POST['k'] ==$key)
//jika variabel k sama dengan key makan proses input.
//ini untuk autentikasi meski sebenarnya metode ini sangat mudah dibobol pakai wireshark untuk lihat datanya
{
$iddata =$_POST['iddata']; //master server (lokal raspberry pipakai autoincrement jadi gak perlu sebenarnya , hanya buat slave servernya saja
$idnode =$_POST['idnode'];
$dhthum =$_POST['dhthum'];
$dhttemp =$_POST['dhttemp'];
$bmptemp =$_POST['bmptemp'];
$bmppress =$_POST['bmppress'];
$waktu =$_POST['waktu'];
$sync1 =$_POST['sync1'];
$sync2 =$_POST['sync2'];

if ($iddata=="auto")
{
$valuecoloumn = 'idnode,dhthum,dhttemp,bmptemp,bmppress,waktu,sync1,sync2';
$valuedata = '"'.$idnode.'","'.$dhthum.'","'.$dhttemp.'","'.$bmptemp.'","'.$bmppress.'","'.$waktu.'","'.$sync1.'","'.$sync2.'"';
}
else
{
$valuecoloumn = 'iddata,dhthum,dhttemp,bmptemp,bmppress,waktu,sync1,sync2';
$valuedata = '"'.$iddata.'","'.$idnode.'","'.$dhthum.'","'.$dhttemp.'","'.$bmptemp.'","'.$bmppress.'","'.$waktu.'","'.$sync1.'","'.$sync2.'"';
}

$sql="insert into masterdata($valuecoloumn) values($valuedata);";
//echo $sql;
$hasil = mysqli_query($conn,$sql);
//echo $hasil;

if (!$hasil)
{
echo "i#Gagal Insert#".$sql;
}
else
{
//melempar nilai last id untuk di save csv. karena ini jalan di server lokal maka kemungkinan diskoneknya kecil
//belum coba ke slave server yang tidak ada auto incrementnya
echo 'i#Berhasil Insert#'.mysqli_insert_id($conn).'#'.$valuedata;
}

}
else
{
echo "i#Key Salah#Periksa Key";
}
}
else
{
echo "i#Tidak post#Periksa Post";
}
?>

akses insert data.php

akses insert data.php

karena ini bukan di raspberry pi maka saya tambahkan child folder html  di xampp windows.

3. insertdata python

berikut edit coding pythonnya


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

UDP_IP = "192.168.3.192"
UDP_PORT = 80
MESSAGE = "d"
urlserver = "http://localhost/html/insertdata.php"
key = "098dfsiuohjsdf98709sdf8709"
namafilecsv = "rawdata5.csv"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(10) #dalam 10 detik setelah kirim tunggu data, kalau lewat bypass
data ={}
errordatasensor ='belum pernah NAN'
i=0
lastdhthum = -99999
lastdhttemp = -99999
lastbmptemp = -99999
lastbmppress = -99999
d={}
d[0] = 'N1,32,324,23,23'
while True:

try :
print '-------------------------------------------------------------------------------------'
#Set the whole string
# sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

# receive data from client (data, addr)
#d = sock.recvfrom(1024)
#pemisahan data dengan karakter "," nanti buat save di mysql

reply = d[0].split(",")


curmin = datetime.datetime.now().time().minute
cursec = datetime.datetime.now().time().second
#curhour = datetime.datetime.now().time().hour
curtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print 'Nodesensor reply : ' + str(reply) +' at '+curtime

#kadang dht22 gagal baca dan menghasilkan nan (not a number)
#jadi kalau gagal gunakan data dari pembacaan sebelumnya
#untuk amannya kalau data bukan angka maka gunakan data sebelumnya
#termasuk data dari sensor bmp280

if (i==3):
reply[1] = 'nan'
reply[2] = 'nan'
reply[3] = 'nan'
reply[4] = 'nan'


i+=1

if reply[1].replace('.','').isdigit():#dihilangkan koma dan titik lalu dicek apakah nomor saja
lastdhthum=reply[1]
#ini adalah kondisi normal dimana data dibaca benar.
else:
reply[1]=lastdhthum
print 'Ada data NaN di dhthum gunakan last data '+str(lastdhthum)
errordatasensor = 'pernah NAN dhthum di waktu '+curtime

if reply[2].replace('.','').isdigit():
lastdhttemp=reply[2]
#ini adalah kondisi normal dimana data dibaca benar.

else:
reply[2]=lastdhttemp
print 'Ada data NaN di dhttemp gunakan last data '+str(lastdhttemp)
errordatasensor = 'pernah NAN dhttemp di waktu '+curtime

if reply[3].replace('.','').isdigit():
lastbmptemp=reply[3]
#ini adalah kondisi normal dimana data dibaca benar.
else:
reply[3]=lastbmptemp
print 'Ada data NaN di bmptemp gunakan last data '+str(lastbmptemp)
errordatasensor = 'pernah NAN bmptemp di waktu '+curtime

if reply[4].replace('.','').isdigit():
lastbmppress=reply[4]
#ini adalah kondisi normal dimana data dibaca benar.
else:
reply[4]=lastbmppress
print 'Ada data NaN di bmppress gunakan last data '+str(lastbmppress)
errordatasensor = 'pernah NAN bmppress di waktu '+curtime

#cek isi apakah data terakhir benar
#print 'lastdhthum '+lastdhthum
#print 'lastdhttemp '+lastdhttemp
#print 'lastbmptemp '+lastbmptemp
#print 'lastbmppress '+lastbmppress
print errordatasensor


#tiap 10 menit simpan di file csv, karena dalam 10 menit lama
#untuk mencegah save berulang di menit ke 10 dilihat detiknya
#selama kurang dari 5 maka di save karena ada sleep 5 detiknya

#if (curmin % 10 ==0)and (cursec < 6) :
if 1:
#simpan menggunakan php

data['k']= key
data['iddata'] = 'auto'
data['idnode'] = reply[0]
data['dhthum'] = reply[1]
data['dhttemp'] = reply[2]
data['bmptemp'] = reply[3]
data['bmppress'] = reply[4]
data['waktu'] = curtime
data['sync1'] = 'false'
data['sync2'] = 'false'
dataformaturl = urllib.urlencode(data)

requesttoserver = urllib2.urlopen(urlserver,dataformaturl)
infosavephp = requesttoserver.read().split("#")
#print infosavephp
#print '=========================================================================='
if(infosavephp[0]=='i')and(infosavephp[1]=='Berhasil Insert'):
print 'Informasi Save ke Server : ID '+infosavephp[2]+' '+infosavephp[3]

if(infosavephp[0]=='i')and(infosavephp[1]!='Berhasil Insert'):#selain berhasil
print 'Gagal Insert Server : '+infosavephp[2]
#karena gagal insert maka isi infosavephp[2] adalah sql nya untuk di cek
#karena tetap pakai dimana infosavephp[2] harusnya berisi id auto increment maka diganti
#untuk di save csv
infosavephp[2] = 'No ID'

with open(namafilecsv,'a') as file:
file.writelines(infosavephp[2]+','+curtime+','+d[0]+'\n')
#urutan csv nya iddataterakhir disave, waktu, data d (isi sensor)
print 'data disimpan di csv ' +infosavephp[2]+' '+curtime+' '+str(reply)
# print '=========================================================================='

&nbsp;

except urllib2.HTTPError:
print 'Tidak konek server'
except urllib2.URLError:
print 'URL Salah'

except socket.error:
print 'Tidak konek node'
#tidak pernah exit karena kalau tidak konek dilewati dan ngulang
#5 detik kemudian
#sys.exit()
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(5)

kalau diekseskusi seperi ini . saat habis insert akan mengembalikan nilai auto increment. yang nanti nya id tersebut akan disave di csv sebagai kolom iddata jadi data nya sama persis kalau dicek berdasarkan iddatanya oh ya ini karena tidak di rumah maka untuk nilai sensornya saya kasi nilai tetap

data csv

data csv

oke deh. done.
next dilanjut ya
wassalamu’alaikum

Iklan

Tinggalkan Balasan

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s