Uygulama 7’de DHT11 sensörünü okuyarak sıcaklık ve nem grafiği çizdirmiştik. Bu uygulamada ise grafiğini çizdirdiğimiz bu değerleri MariaDB (MySQL) veri tabanında depolayacağız.
Öncelikle kitabın ilgili bölümünde anlatıldığı gibi MariaDB veri tabanı sunucusunu Raspberry Pi’a kurun ve mariadb konsolunu aşağıdaki gibi çalıştırarak bir veri tabanı ve tablo oluşturun. Veritabanımızın adı sensorler, tablomuzun adı dht11 ve tablonun içindeki alanlar sırasıyla zaman, sensor, deger seklinde olacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pi@raspberrypi:~ $ sudo mariadb -u root -p Enter password: MariaDB [(none)]> CREATE DATABASE sensorler; MariaDB [(none)]> USE sensorler; MariaDB [sensorler]> CREATE TABLE DHT11 (zaman TIMESTAMP DEFAULT CURRENT_TIMESTAMP, sensor VARCHAR(10), deger FLOAT); MariaDB [sensorler]> GRANT ALL ON sensorler.* TO pi@'%' IDENTIFIED BY 'raspberry'; MariaDB [sensorler]> flush privileges; MariaDB [sensorler]> exit |
Yukarıdaki SQL komutları ile veri tabanı ve tablo oluşturduk. GRANT komutu ile sensorler veri tabanına erişebilecek pi adında bir MariaDB kullanıcısı yarattık ve parolasını da raspberry olarak belirledik. Daha sonra bu bilgileri ilgili node’u yapılandırmak için kullanacağız. zaman alanı için tanımladığımız kayıt tipi TIMESTAMP’dir ve DEFAULT (varsayılan) değeri olan CURRENT_TIMESTAMP ile kaydın eklenmesi sırasındaki zamanı otomatik olarak kaydedecektir. Burada gerçekleştirilen işlemlerin detaylarını kitabın “Veri tabanı sunucusuna bağlanmak” adlı başlığında bulabilirsiniz.

Aşağıdaki akış şemasını oluşturmadan önce node-red-node-mysql adlı node’u yükleyin. Bu node veri tabanı sunucusuna bağlanmamızı ve SQL sorgu cümleleri (query) göndermemizi sağlayacak. Uygulama 7’de gerçekleştirdiğimiz akışı hiç değiştirmeden çalışma alanına ekleyin. Ardından aşağıda olduğu gibi birer adet function, mysql ve debug node’u seri biçimde bağlayın. Sicaklik-Nem adlı node’un çıkışlarını SQL sorgu cümlelerimizi oluşturacak olan function node’un girişine aşağıdaki gibi bağlayın.
SQL isimli function node’un JavaScript kodu aşağıda yer almaktadır. Bu kodu function node’una yazın.
1 2 3 4 5 6 7 |
var SQL = "INSERT INTO DHT11 (sensor, deger)" SQL = SQL + " VALUES ('" + msg.topic + "', " + msg.payload + ")"; msg.topic=SQL; return msg; |
Function node’u girişine uyglanan her iki mesajın da topic özelliği vardır. Sicaklik-Nem adlı node’un birinci çıkışından gelen msg nesnesinin topic değeri temp ve ikinci çıkışından gelenin ki ise humudity’dir. Bu topic değerleri veri tabanına eklediğimiz kayıttaki değerin hangi sensöre ait olduğunu belirtecek. Yukarıdaki kod sensor isimli tablo alanına topic değerini (temp veya humidity), değer alanına da payload’u yerleştirerek bir SQL sorgu cümlesi üretir. Ürettiği SQL cümlesini de msg.topic özelliği ile mysql node’una girdi olarak gönderir. Yukarıdaki JavaScript kodu ile üretilen SQL cümlesi şuna benzemektedir:
1 |
INSERT INTO DHT11 (sensor, deger) VALUES ('temp', 25.00) |
Şimdi de veri tabanına bağlantı kurarak SQL cümlesini gönderecek mysql node’unu yapılandıralım. Bunun için node’un özellikler panelini açarak aşağıdaki resimdeki gibi yeni bir MySQLDatabase tanımlayın.

Yapılandırmayı tanımlamak için kalem işaretine tıklattığınızda aşağıdaki gibi bir yapılandırma ekranı görüntülenir. Bu ekranda sırasıyla şu tanımlamaları yapın:
- Host: 127.0.0.1
- Port: 3306
- User: pi
- Password: raspberry
- Database: sensorler

Yapacağımız tüm işlemler bu kadar. Ctrl+d tuş bileşimine basarak akışı deploy edelim. Inject node, akışı tetiklediğinde (veya başındaki kutucuğa tıklatarak elle tetiklediğinizde) Raspberry Pi’ın GPIO port’una bağlı sensörden değerler okunarak hem grafikler güncellenecek hem de sensör değerleri veri tabanına kaydedilecektir. Eklediğimiz akış kolunun sonundaki debug node’un çıktısında çalıştırılan SQL sorgusunu ve sunucunun cevabını görebilirsiniz. MariaDB’den dönen cevapta affectedRows sayısının 1 olduğunu yani yeni bir kayıt eklendiğini teyit edebiliriz.

Dilerseniz mariadb istemcisini kullanarak tablodaki tüm kayıtları listeleterek kayıtların gerçekleşip gerçekleşmediğini görelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
MariaDB [sensorler]> USE sensorler; Database changed MariaDB [sensorler]> SELECT * FROM DHT11; +---------------------+----------+-------+ | zaman | sensor | deger | +---------------------+----------+-------+ | 2020-04-24 02:43:25 | temp | 25 | | 2020-04-24 02:43:25 | humidity | 34 | | 2020-04-24 02:44:00 | temp | 25 | | 2020-04-24 02:44:00 | humidity | 34 | | 2020-04-24 02:44:04 | temp | 25 | | 2020-04-24 02:44:04 | humidity | 34 | |
Sensör Verileri için Uygun Veri tabanı ve Görselleştirme
Zamana bağlı sensör değerlerini saklamak ve gerektiğinde yüksek başarımda sorgulamak için zaman serisi veri tabanları (Time Series Databases) tercih edilir. TSD kullanmak özellikle on binlerce satır veri biriktiğinde önem kazanır. Bu veri tabanları timestamp türlü verileri çok hızlı şekilde sorgulayabilir ve üzerinde işlem yapabilir. Yüksek miktarda sensör verisini kaydetmek için daha çok InfluxDB, TimeScaleDB ve Prometheus gibi TSD veri tabanları tercih edilir. Bu veri tabanlarında kayıtlı verileri görselleştirmek için Grafana adlı uygulama çokça tercih edilir.
