skip to Main Content

python örnekleri : cpu sayısı

Python’da bir sistemdeki CPU sayısını öğrenmek için multiprocessing modülünü kullanabilirsiniz. Örnek kod aşağıdaki gibidir:

import multiprocessing

# Sistemdeki CPU sayısını alın
cpu_count = multiprocessing.cpu_count()

print(f"CPU sayısı: {cpu_count}")

sqlite veritabanına verilerin kaydedilmesi ve flask frameworkunda bu verilerin mathplotlib ile grafiklerinin çizim örneği

öncelikle proje klasörümü ve kullanacağımız virtualenv yi oluşturulalım

fcicek@ferhatcicek:~$ mkdir system_usage

fcicek@ferhatcicek:~$ mkdir system_usage
fcicek@ferhatcicek:~$ cd system_usage/
fcicek@ferhatcicek:~/system_usage$ python -m venv env

projemizde sistem verilerini saklamak iin sqlite veritabanını kullancağız. kullanacağımız system_usage veritababı oluşturalım

fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db
sqlite> .quit

veritabanı dosyamızı oluşturduktan sonra sıra tablomuzu oluşturmaya geldi. bunu sql ortamında yapabiliriz ancak bu örnekte python ile oluşturacağız..

fcicek@ferhatcicek:~/system_usage$ nano sqlite_db_create.py

aynı isimli tablo varsa sileceğiz ve veri tabanımızla aynı isimli bir tablo oluşturacağız. örneğimizi basit tutmak adına anlık cpu ve hafıza verilerini tablomuzda tutacağımız için tablomuzda bu veriler için gerekli alanları oluşturacağız…

import sqlite3 as lite
import sys
con = lite.connect('system_usage.db')
with con: 
    cur = con.cursor() 
    cur.execute("DROP TABLE IF EXISTS system_usage")
    cur.execute("CREATE TABLE system_usage(timestamp DATETIME, cpu NUMERIC, mem NUMERIC)")

kodumuz yazık şimdi virtualenv i aktif ederek kodumu çalıştıralım…

fcicek@ferhatcicek:~/system_usage$ source env/bin/activate
(env) fcicek@ferhatcicek:~/system_usage$ python sqlite_db_create.py 

python kodumuz sonucu kontrol etmek istersek. clidan veritabanına bakıp tablonun durumunu inceleyebiliriz.

(env) fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .table
system_usage
sqlite> .quit

örneğimizde cpu ve hafıza verilerini saklayacağız. bunun için pythonde psutil paketini kullanacağız. psutil paketini yükleyelim

(env) fcicek@ferhatcicek:~/system_usage$ pip install psutil

psutil paketini daha önce kullanmamış olabilirsiniz.. programımızda kullanacağımız verileri içerecek basit bir uygulama yapalım.

import psutil

print('MEM  % used:', psutil.virtual_memory()[2])
print('CPU % used:', psutil.cpu_percent(2))

programi çalıştıralım.

(env) fcicek@ferhatcicek:~/system_usage$ python psutil_system.py 
MEM  % used: 86.5
CPU % used: 2.0

anlık olarak cpu ve hazfıza kullanım bilgileriniz artık alabiliyoruz. bu bilgilerini şimdi de veritabanımıza ekleyelim.

bunun için program tarafımızdan sonlandırılana kadar 60 saniyede bir cpu ve hazfıza kullanım değerini okuyarak sqlite veritabanına ekleyecek basit bir kod yazalım.

(env) fcicek@ferhatcicek:~/system_usage$ nano data_logger.py     
import time
import sqlite3
import psutil

dbname='system_usage.db'

ornekleme_zamani = 60

def sistem_bilgisi_oku():
    mem = psutil.virtual_memory()[2]
    cpu = psutil.cpu_percent(1)
    if mem is not None and cpu is not None:
        return cpu,mem

def veritabani_ekle (cpu, mem):
    conn=sqlite3.connect(dbname)
    curs=conn.cursor()
    curs.execute("INSERT INTO system_usage values(datetime('now'), (?), (?))", (cpu, mem))
    conn.commit()
    conn.close()

def main():
    while True:
        cpu, mem = sistem_bilgisi_oku()
        veritabani_ekle (cpu, mem)
        time.sleep(ornekleme_zamani)

main()

artık verilerimizi bir veri tabanında turuyoruz. şimdi bunu web üzerinden bağlantı yapacak kullanıcılar için görselleştirelim. bunun için flask frameworkunu kullancağız. virtualenv altına flask ve ilişkili paketleri yükleyelim.

(env) fcicek@ferhatcicek:~/system_usage$ pip install flask

kullanıcı browser kullanarak sayfamıza bağlandığında, veritabanındaki en son cpu ve hafıza kullanım verisini sorgulayarak bu veriyi ekrana yazdıralım.

(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py
from flask import Flask, render_template, request
app = Flask(__name__)
import sqlite3

def getData():
	conn=sqlite3.connect('system_usage.db')
	curs=conn.cursor()
	for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
		time = str(row[0])
		cpu = row[1]
		mem = row[2]
        print(str(cpu))
        print((str(mem))
	conn.close()
	return time, cpu, mem

@app.route("/")
def index():	
	time, cpu, mem = getData()
	templateData = {
		'time': time,
		'cpu': cpu,
		'mem': mem
	}
	return render_template('son_olcum.html', **templateData)
    
if __name__ == "__main__":
   app.run(host='0.0.0.0', port=5000, debug=True)

flask frameworkun tema yapısını kullanacağımız için templates dizinini oluşturup içinde gerekli dosyaları oluşturmamız gerekmektedir. python dosyamızda ilişkilendirilen tema dosyası son_olcum.html veiçerisinde kullanılacak verinin templateData olarak belirtildi.

(env) fcicek@ferhatcicek:~/system_usage$ mkdir templates
(env) fcicek@ferhatcicek:~/system_usage$ cd templates
(env) fcicek@ferhatcicek:~/system_usage/templates$ nano son_olcum.html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">    
<title>System Durum</title>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

</head>

<body>

<div class="container-fluid">
    <div class="jumbotron">
        <p class="lead">Son veri okuma  :  {{ time }}   <a href="/"class="button">Güncelle</a></p>     
        <hr class="my-4">
        <p class="lead">CPU Kullanım Oranı  % : {{ cpu }}</p>    
        <p class="lead">Memory Kullanım Oranı  % : {{ mem }} </p>   
        <hr class="my-4">
    </div>        
</div>

</body>
</html>

şimdi kodumuzu test edelim.

(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py

tarayıcımız ile http://sunucuip:5000 adresine bağlandığımız aşagıdaline benzer bir ekran ile karşılaşmamız gerekecek…

kodumuz biraz daha geliştirmenin zamanı geldi. cpu ve hafıza verilerini veritabanımızda tuttugumuz için bu veriyi bir grafik olarka ekrana yansıtabiliriz. bu işlem sırasında mathplotlib paketinde faydalanacağımız için öncelikle kurulumunu yapalım.

(env) fcicek@ferhatcicek:~/system_usage$ pip install matplotlib

şimdi kodumuza yapacağımız ilave , belirtilen örnekleme sayısınca veri tabanından veri çekip bunu grafiği oluşturup son kullanıcıya ileteceğiz. cpu ve hafiza grafiklerini çizdirmek için app.route metodundan faydalanacağız.

from flask.globals import session
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io

from flask import Flask, render_template, send_file, make_response, request
app = Flask(__name__)

import sqlite3

def sonKayit():
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
                time = str(row[0])
                cpu = row[1]
                mem = row[2]
        conn.close()
        return time, cpu, mem

def sonKayitDizi (orneklemeSayisi):
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT "+str(orneklemeSayisi))
        data = curs.fetchall()
        tarihDizi = []
        cpuDizi = []
        hafizaDizi = []
        for row in reversed(data):
                tarihDizi.append(row[0])
                cpuDizi.append(row[1])
                hafizaDizi.append(row[2])
        conn.close()
        return tarihDizi, cpuDizi, hafizaDizi
    
def maksimumKayit():
        conn=sqlite3.connect('system_usage.db')
        curs=conn.cursor()
        for row in curs.execute("select COUNT(cpu) from  system_usage"):
                maksimumKayitDizi=row[0]    
        conn.close()
        return maksimumKayitDizi


global orneklemeSayisi
orneklemeSayisi = maksimumKayit()
if (orneklemeSayisi > 101):
    orneklemeSayisi = 100

@app.route("/")
def index():
        time, cpu, mem = sonKayit()
        templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
        return render_template('index.html', **templateData)
    
@app.route('/', methods=['POST'])
def post_form():
        global orneklemeSayisi
        orneklemeSayisi = int (request.form['orneklemeSayisi'])
        numMaxSamples = maksimumKayit()
        if (orneklemeSayisi > numMaxSamples):
                orneklemeSayisi = (numMaxSamples-1)
        time, cpu, mem = sonKayit()
        templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
        return render_template('index.html', **templateData)
    
@app.route('/plot/cpu')
def cpu_cizim():
        times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
        ys = cpuDizi
        fig = Figure()
        axis = fig.add_subplot(1, 1, 1)
        axis.set_title("CPU [%]")
        axis.set_xlabel("Örnekleme")
        axis.grid(True)
        xs = range(orneklemeSayisi)
        axis.plot(xs, ys)
        canvas = FigureCanvas(fig)
        output = io.BytesIO()
        canvas.print_png(output)
        response = make_response(output.getvalue())
        response.mimetype = 'image/png'
        return response
    
@app.route('/plot/mem')
def hafiza_cizim():
        times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
        ys = hafizaDizi
        fig = Figure()
        axis = fig.add_subplot(1, 1, 1)
        axis.set_title("MEM [%]")
        axis.set_xlabel("Örnekleme")
        axis.grid(True)
        xs = range(orneklemeSayisi)
        axis.plot(xs, ys)
        canvas = FigureCanvas(fig)
        output = io.BytesIO()
        canvas.print_png(output)
        response = make_response(output.getvalue())
        response.mimetype = 'image/png'
        return response

    
if __name__ == "__main__":
   app.run(host='0.0.0.0', port=5000, debug=True)
<!-- index.html -->
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>System Durum</title>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

</head>

<body>

<div class="container-fluid" align=center>
    <div class="jumbotron">
        <p class="lead"><a href="/"class="button">Güncelle</a></p>                                
        <hr class="my-4">
        <p class="lead">Son veri okuma  :  {{ time }}   </p>
        <hr class="my-4">
        <p class="lead">CPU Kullanım Oranı  % :<b> {{ cpu }} </b></p>
        <p class="lead">Memory Kullanım Oranı  %<b> : {{ mem }} </b></p>
        <hr class="my-4">
    </div>
</div>
<div class="container-fluid" align=center>

        <form method="POST">
                <input name="numSamples" value= {{orneklemeSayisi}}>
                <input type="submit">
                </form></p>
        <hr>
        <img src="/plot/cpu"  width="80%" height=400>
        <img src="/plot/mem"  width="80%" height=400>

</div>
</body>
</html>

kodumuzu aşagıdaki şekilde günceller ve çalıştırırsak aşagıdaki gibi ekran görüntüsüne sahip olacağız

linux de cpu kullanımını kısıtlamak

genel olarak bir uygulamanın çok fazla cpu tüketmesi istenilmez. bu cpu tüketimi genel olarak bir kaç nedenden kaynaklanır.

  • kötü programcılık örnekleri
  • zafiyat oluşturmak için kötü niyetli uygulamalar
  • iyi yönetilmeyen sunucularda yük dengeleme v.b. yapılmaması
  • gerçekten işlem gücü gerektiren kernel derleme, 3d render v.b. işlemlerde

cpu tüketimi neden olursa olsun pcde bunun olmasını elbette istemiyoruz.. bunun için oldukça kullanışlı bir uygulama mevcut. önce uygulamayı sistemize kuralım.

sudo apt-get install cpulimit

kurulu yaptıktan sonra kullanmaya başlayabilirsiniz basit bir örnek yapalım.

cpulimit -l 20 python face-detect.py haarcascade.xml

diğer kullanım seçenekleri için help den yararlanılabilir. sisteminizde faza tüketilen uygulamalar için http://www.ferhatcicek.com/bilisim-dunyasi/isletim-sistemi-bilisim-dunyasi/linux/sh/20170821/yuksek-kaynak-tuketen-uygulamalari-bulmak/2177.html yazısına bakabilirsiniz.

Usage: cpulimit TARGET [OPTIONS...] [-- PROGRAM]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
                         The -e option only works when
                         cpulimit is run with admin rights.
      -P, --path=PATH    absolute path name of the
                         executable program file
   OPTIONS
      -b  --background   run in background
      -f  --foreground   launch target process in foreground and wait for it to exit
      -c  --cpu=N        override the detection of CPUs on the machine.
      -l, --limit=N      percentage of cpu allowed from 1 up.
                         Usually 1 - 800, but can be higher
                         on multi-core CPUs (mandatory)
      -m, --monitor-forks  Watch children/forks of the target process
      -q, --quiet        run in quiet mode (only print errors).
      -k, --kill         kill processes going over their limit
                         instead of just throttling them.
      -r, --restore      Restore processes after they have
                         been killed. Works with the -k flag.
      -s, --signal=SIG   Send this signal to the watched process when cpulimit exits.
                         Signal should be specificed as a number or 
                         SIGTERM, SIGCONT, SIGSTOP, etc. SIGCONT is the default.
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process,
                         or if it dies
          --             This is the final CPUlimit option. All following
                         options are for another program we will launch.
      -h, --help         display this help and exit

linuxte yüksek kaynak tüketen uygulamaları bulmak

root@cicekpc:/home/fcicek#  ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
  PID  PPID CMD                         %MEM %CPU
 2878  2102 /usr/lib/firefox/firefox    17.8 28.3
 1274     1 /usr/sbin/mysqld             1.8  0.0
 2579  2102 /usr/bin/compiz              1.4  1.5
 2710  2452 /usr/bin/gnome-software --g  1.0  0.0
 1313  1267 /usr/lib/xorg/Xorg -core :0  0.8  1.8
 2723  2452 nautilus -n                  0.6  0.0
 2879     1 /usr/lib/fwupd/fwupd         0.6  0.0
 3083  2102 /usr/lib/gnome-terminal/gno  0.5  0.1
 1513     1 dockerd -G docker --debug -  0.5  0.1

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.

raspberry pi sıcaklığının değerinin öğrenilmesi ve rrd ile izlenmesi

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı  yazıda rrd kullanımına değinmiştim. yazıdaki örnekte kayseri şehrinin sıcaklık değeri kullanılmıştı.

bu yazıda ise raspberry pi nin iç sıcaklık değerlerini kullanalım. kit üzerinden sıcaklık değerini iki yöntemle öğrenebiliriz.

1. yöntem  vcgencmd komutunu kullanarak

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp
temp=56.2'C

çıktısı yukarıdan görüldüğü gibi doğrudan rrd veritabanına göndermeye uygun değil bunun için aşağıdaki şekilde çıktımızı kırpalım.

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "'" -f1
56.2

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -c6-9
56.2

2. yöntem ise cpu log çıktısına bakmak.

pi@raspberrypi ~ $ cat /sys/class/thermal/thermal_zone0/temp
56224

bu yapıda tam işimize yaramayabilir. çıktıyı okunabilir bir duruma getirmemiz gerekiyor.

root@raspberrypi:~# /opt/vc/bin/vcgencmd measure_temp | sed "s/temp=\([0-9]\+\.[0-9]\+\)'C/\1/"
56.2

root@raspberrypi:~# awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp
56.2

artık raspberry nin sıcaklık değerinin nasıl öğrenileceğini bildiğimize göre örneğimizde yer alan

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

satırı yerine uygun kodu yazarak raspberrynin sıcaklık değerini rrd grafikleri üzerinden takip edebiliriz.

linux makinelerde cpu log dizin yapısından ufak farklılıklar olabilir ancak 2. yöntemle linux kullanan tüm cihazlarda cpu sıcaklık değeri öğrenebiliriz.

Back To Top