Skip to content

raspberry üzerinden okunan verinin python ile mysqle eklenmesi ve google chart ile bu verinin grafiğinin oluşturulması örneği

daha önceki örneklerimizde raspberry nin sistem özelliklerini okumayı ve bu verileri rrd veri tabanına kaydetmeyi ve izlemesi konusunda örnekler yapmıştık.

bu yöntemin uygun olmayacağı veya istenmeyeceği durumlar olabilir. böyle bir durum olduğunu düşünerek okuduğumuz cpu sıcaklık değerini bir veri tabanına (örneğimizde mysql olacak) kaydedelim ve dinamik bir arayüz ile veri tabanına kaydettiğimiz verileri kullanıcılarımız sunacağımız bir uygulama geliştirelim.

öncelikle veri tabanımızda hangi verilerin olacağını belirlemeli ve veritabanımızı oluşturmalıyız. raspberry pinin klasik dağıtımları üzerinde mysql, php, apache gibi sunucu yazılımları mevcut değil. bunları kurmanız gerektiğini unutmayınız. internette konu hakkında dokümanlar mevcut. uygun bir zamanda detaylı olarak onuda ekleyebiliriz. bunların olduğunu var sayarak esas konumuza dönelim.

bu örneğimizde tarih ve saat verisinin yanında sadece sıcaklık değerini tutmamız yeterli olacaktır.

sudo mysql -u root -p

CREATE DATABASE raspberry_sistem;
USE raspberry_sistem;

CREATE TABLE cpu_temp ( id INT NOT NULL AUTO_INCREMENT,
                      tarih DATE NOT NULL,
                      saat TIME NOT NULL,
                      sicaklik varchar(50),
                      PRIMARY KEY ( id ));

GRANT INSERT,SELECT ON raspberry_sistem.* TO 'raspberry'@'localhost' IDENTIFIED BY 'pi';
FLUSH PRIVILEGES;

artık veritabanımız hazır. sıra sıcaklık değeri okuyarak veri tabanına eklemeye geldi. ben örneğimi python kullanarak yapacağım. benim kullandığım python kütüphaneleri sizin raspberry üzerinde olmayabilir. kodun çalışması için eksik kütüphaneleri yüklemeniz gerekmektedir.

#sicaklik_cpu.py  dosyasi
import time
import os
import fnmatch
import MySQLdb as mdb
import logging
import time
import datetime

#cpu sicaklik degerinin okunmasi
def cpu_sicaklik_oku():
 res = os.popen('vcgencmd measure_temp').readline()
 return(res.replace("temp=","").replace("'C\n",""))


#mysql veritabanina veri eklenmesi
def insertDB(cpu_sicaklik):
  sql = "INSERT INTO cpu_temp (tarih, saat, sicaklik) VALUES ('%s', '%s', '%s' )" % (time.strftime("%Y-%m-%d"), time.strftime("%H:%M"), cpu_sicaklik)

  try:

    con = mdb.connect('localhost', 'raspberry', 'pi', 'raspberry_sistem');
    cursor = con.cursor()
    cursor.execute(sql)
    con.commit()
    con.close()

  except mdb.Error, e:
    logger.error(e)

#sicaklik okuma ve veritabanina yazma fonksiyonlarini calistiralim
cpu_sicaklik = float(cpu_sicaklik_oku())
print cpu_sicaklik
insertDB(cpu_sicaklik)

kodun oldukça sadece ve anlaşılır olduğunuz düşüyorum. temel olarak sıcaklık verisinin okunmasını ve bu verinin veri tabanına eklenmesini sağlayarak iki ayrı fonksiyon oluşturduk. ve bu fonksiyonları sırası ile çağırıyoruz.

komut satırından kodumuzu test edelim.

pi@cicek /var/www/raspberry $ sudo python sicaklik_cpu.py 
54.1

sıcaklık değeri okundu ve ekrana yazıldı ve herhangi bir hata vermedi. kontrol için eklediğimiz kodu “print cpu_sicaklik” her şey tamam olduktan sonra kaldıracağız. veri tabanına gerekli veri girişi doğru şekilde yapıldığının kontrolünü de yapalım.

mysql> select * from cpu_temp;
Empty set (0.01 sec)

mysql> select * from cpu_temp;
+----+------------+----------+----------+
| id | tarih      | saat     | sicaklik |
+----+------------+----------+----------+
|  1 | 2015-07-19 | 22:35:00 | 54.1     |
+----+------------+----------+----------+
1 row in set (0.00 sec)

kodumuz sağlıklı olarak çalışıyor. şimdi bu işlemi otomatikleştirmek için crontab içine yerleştirelim.

pi@cicek /etc $ cat /etc/crontab 

*/5 *  * * *   root    sudo python /var/www/raspberry/sicaklik_cpu.py

5 dakika bir çalışacak şekilde gerekli ilavemizi de yaptıktan sonra sıra kullanıcı arayüzüne geldi. grafik çizimi için google chart servisini line chart kullanacağım. detaylı bilgiyi https://developers.google.com/chart/interactive/docs/gallery/linechart adresinden alınabilir.

bu servis sayesinde grafik kütüphaneleri ile fazla uğraşmayacağım ve işimi kolayca halledeceğim.

<!DOCTYPE html>


	<script type="text/javascript" src="https://www.google.com/jsapi"></script>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
		<script type="text/javascript">
			google.load('visualization', '1', {'packages':['corechart']});
			google.setOnLoadCallback(drawChart);

			function drawChart() {
				var json = $.ajax({
					url: 'get_json.php', 
					dataType: 'json',
					async: false
				}).responseText;
				
				var data = new google.visualization.DataTable(json);
				var options = {
					title: 'Raspberry CPU Sicaklik',
					width: 600,
					height: 400
				};
				var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
				chart.draw(data, options);

				setInterval(drawChart, 500 );
			}
		</script>  



  <div id="chart_div" style="width: 600px; height: 400px;"></div>

yukarıdaki kodu index.html olarak kaydelim ve esas işi yapacak get_json.php php dosyamızı da oluşturalım

<?php

$con = mysql_connect('localhost', 'raspberry', 'pi') or die('veri tabani baglanti hatasi');
mysql_select_db('raspberry_system', $con); 
$query = mysql_query('SELECT * FROM cpu_temp');

$table = array();
$table['cols'] = array(
    array('label' => 'saat', 'type' => 'string'),
	array('label' => 'sicaklik', 'type' => 'number')
);

$rows = array();
while($r = mysql_fetch_assoc($query)) {
    $tempa = array();
	$tempa[] = array('v' => $r['saat']);
	$tempa[] = array('v' => (int) $r['sicaklik']); 
    $rows[] = array('c' => $tempa);
}

$table['rows'] = $rows;

$jsonTable = json_encode($table);

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo $jsonTable;
?>

adres satırına raspberry adresini yazdığımızda göreceğimiz grafik aşağıdaki gibi olacaktır.

Google App Engine ilk uygulama

Google in yeni hizmetlerinden birisi olan appengine özellikle python geliştiricilerini sevindiren bir servis. Şu an için bir çok geliştiriciye tam olarak hitap etmesede işe yarar bir servis.

http://code.google.com/appengine/

adresine girerek kaydımızı yaptırıyoruz. Daha sonra

http://code.google.com/appengine/downloads.html

adresinden güncel olan SDK yi indiriyoruz ve sistemimize kuruyoruz. Kurulumun yapılabilmesi için sisteminizde Python olması gerekmekte. Eğer sistemimizde python yok ise python.org adresinde sistemimize uygun olan paketi indirip kurmamız gerekecek.

Şimdi http://appengine.google.com/ adresine girerek bir adet proje oluşturalım. Proje ayalarını yaptıktan sonra bir editor açalım ve alışıldığı üzere “Hello world” uygulamasını gerçekleştirelim.

#mkdir test_project
#cd test_project

#vi hello.py

import wsgiref.handlers

print ‘Content-Type: text/plain’
print ”
print ‘Hello, world!’

#vi app.yaml

application: test_project
version: 1
runtime: python
api_version: 1

handlers:
– url: /.*
script: hello.py

Sıra mevcut dosyalarımı google sunucularına yüklemeye geldi. Burada dikkat etmemiz gereken nokta app.yaml dosyası içindeki ” application: test_project” satırı. Buradaki test_project yerine http://appengine.google.com/ adresinde oluşturduğumuz proje adını yazmamız gerekiyor.

#cd ..
#appcfg.py update test_project

Bundan sonra bizden app engine kayıt olurken girdigimiz google hesabımıza ait eposta adresini ve şifresini isteyecektir. bunları girdikten sonra dosyalarımız google sunucularına yüklenmeye başlayacaktır.

Sıra geldi projemizi test etmeye. Oluşturdugumuz proje adına göre google bize http://test_project.appspot.com şeklinde bir adres vermişti. Bu adrese girerek uygulamanızı test edebilirsiniz. Veya domanininiz için gerekli dns tanımlarını yaptı iseniz kendi domain adresinizide kullanabilirsiniz. Örnek http://uygulama.ferhatcicek.com – http://cicek.appspot.com .

pardus ve mod_python

apache ve mod_python u pisi deposundan kurduktan sonra

/etc/apache2/modules.d/16_mod_python.conf

dosyasının içeriğini aşağıdaki şekilde değiştirelim

  LoadModule python_module modules/mod_python.so
    
      AddHandler mod_python .py
      PythonHandler mod_python.publisher
      PythonDebug On
    
  DirectoryIndex index.py

bundan sonra
/var/www/localhost/htdocs/

dizini altına python isimli bir dizin oluşturalım ve eğer apache çalışıyorsa

#sudo service apache restart

komutunu verelim. çalışmıyor ise

#sudo service apache start

ile apache yi başlatalım.

Şimdi sıra test etmeye geldim.

hello.py isimli bir dosya oluşturalım ve dosya içine aşağıdaki kodu yazarak bu yeni dosyayı oluşturduğumuz python klasörü altına kaydedelim.

def hello(name=None):
if name:
return 'Hello, %s!' % name.capitalize()
else:
return 'Hello there!'

şimdi gezinti aracımızı açarak adres satırına
http://localhost/python/hello.py/hello

yazalım.

Hello there!
yazısını görüyorsak sorun yoktur. :)

python ile kredi kartı no kontrolü

Daha önce kredi kartı numarasının kontrolü için luhn algoritmasından bahsetmiştim. Luhn algoritmasını python ile yazacak olursak aşağıdaki şekilde yapabiliriz.

def kontrol(kartno):
toplam = 0
hanesayisi = len(kartno)
tekcift = hanesayisi & 1
for sira in range(0, hanesayisi):
hane = int(kartno[sira])
if not (( sira & 1 ) ^ tekcift ):
hane = hane * 2
if hane < 9:
hane = hane - 9
toplam = toplam + hane
# return toplam
return ( (toplam % 10) == 0 )

kartno=raw_input("Kredi kartı numarasını gir  :")
if  kontrol(kartno) :
print kartno, 'nosu geçerli'
else:
print kartno, 'nosu geçerli değil'

python ile mysql’e bağlanma

Python ile MySQL e bağlanmak için sistemizde MySQLdb kütüphanesi olmalı. Bu kütüphane ile mysql veritabanı üzerinde işlem yapmak oldukça kolaylaşıyor. Aşağıda basit mysql örneği gözükmektedir.

try:
import MySQLdb
except ImportError:
sys.exit( "MySQLdb modulu gerekli - bulunamadi" )
''' MySQLdb nin sistemde varlığını kontrol ederek bağlıyoruz'''
db_hostname="benim_sunucum"
db_database="benim_veritabanım"
db_username="benim_veritabani_kullanici_adim"
''' vertabanı tanımlamalarını yapıyoruz'''
dbcon=MySQLdb.connect(host=db_hostname,user=db_username,db=db_database )
'''veritabanına bağlantı kuruyoruz'''
cursor=dbcon.cursor()
sql = """SELECT * FROM benim_tablom"""
cursor.execute(sql)
'''sql soruusunu işletiyoruz'''
data = cursor.fetchone()
field = cursor.description
'''sql sorgusu sonucu donen verinin ilk satirini aliyoruz'''
cursor.close()
dbcon.close()
'''veritabanı bağlantısını sonlandırıyoruz'''
print data
'''veriyi yazdırıyoruz'''

Python ile Nokia S60 için adım adım uygulama geliştirme – II

Bir önceki yazıda S60 cihazımız için python ile uygulama geliştirmek için gerekli dosyaları nereden bulacığımızı ve S60 cihazımıza python yüklemeyi ve çalıştırmayı anlatmıştım.

Bu yazımızda ise işi kişisel bilgisayarımızda python ile kod yazmak için yapmamız gerekenlerden ve bunları S60 cihazımıza yükleyerek yorumlayıcı tarafından çalıştırılması üzerinde duracağız.

Öncelikle forum.nokia sitesinden S60 cihazımıza uygun python SDK ları indirelim ve bilgisayarımıza kuralım. Bununla birlikte python.org sitesinden python un en son sürümünü bilgisayarınıza indirip kurmanızı öneririm. forum.nokia sitesinden indirdiginiz SDK yi bilgisayarınıza kurdugunuz zaman içerisinde işinize yarabilecek oldukça kullanışlı kılavuzlar bulacaksınız.

Şimdi sıra python kodlarını yazacagımız bir editöre ehtiyacımız var. Ben editplus ve ultraedit tercih ediyorum ancak bu yazılımlar paralı oldugu için isterseniz notepad, wordpad v.b. bir editor kullabilir veya context.cx adresinden oldukça başarılı ve bedava bir yazılım olan context i edinebilirsiniz. Tercih sizindir.

Artık kodlama kısmıan geldik. Eğer Python hakkında hiç bir bilginiz yok ise burdan sonrasına devam etmeden önce python.org sitesinden python hakkındaki kılavuzları edinmenizi öneririm. Çünkü bundan sonrası python programlama bilgisine dayanmaktadır.

Bir klasik olarak ilk kodumuzu yazalım..

import appuifw
appuifw.app.title = u”Hello World”
appuifw.note(u”Hello World!”, ‘info’)

Python ile Nokia S60 için adım adım uygulama geliştirme – I

İlk önce python un ne olduğunu açıklamakta fayda var. Python nesne yönelimli, fonksiyonel ve yapısal programlama öğelerini de içerisinde barındıran bir programlama dilidir.
Öncelikle telefonumuzun hakkında biraz ayrıntılı bilgiye ihtiyacımız var.

http://www.forum.nokia.com/devices/ adresine giriyoruz ve bu adresten telefonumuz hakkında bilgileri ediniyoruz. Benim telefonum Nokia 6670. Telefonumu seçtigim zaman

Back To Top