OpenHAB 2 veri kalıcılığı

Akıllı ev sistemi makale serisinde ilerlerken OpenHAB 2’nin temel kurulumlarını tamamlayarak ilk sensör verilerini toplamaya başladık. Önümüzdeki makalelerde, topladığımız bu verilerle aksiyon almaya başlayacağız; fakat daha fazla ilerlemeden önce yapmamız gereken başka yapılandırmalar da var. Şu anki duruma baktığımızda sensörlerden verilerimizi toplamaya başladık; fakat bunları bir yerde biriktirmediğimiz için geriye dönük veriye ulaşamıyoruz. Örneğin; oturma odamızın son 1 haftalık ısı verisini sorgulayamıyorum. Bunun nedeni henüz verimizi saklayacağımız bir veri deposu yapılandırmamış olmamız. Bu makelemde daha önceden yapılandırmalarını yaparak sensörlerimizi eklediğimiz OpenHAB 2 sistemimizin bir kısım verisini MySQL veritabanına saklamayı sizlerle paylaşacağım.

Üzerinde çalıştığım sistemi hatırlatmak gerekirse; Raspberry Pi 3 donanım üzerinde koşan Raspbian işletim sistemi üzerinde OpenHAB 2 kurulu.

Her zaman olduğu gibi ilk işimiz depo güncellemeleri;

sudo apt-get update

OpenHAB veri kalıcılığı için aralarında InfluxDB, Apache Derby, H2, PostgreSQL ve MySQL gibi çeşitli persitance depolarını desteklemekte. Ben bu depolar arasından tercihimi MySQL’den yana kullandım. Sistemimize MySQL kurulumunu yapalım;

sudo apt-get install mysql-client  mysql-server

Kurulum sırasında verdiğimiz şifre ile MySQL’e giriş yapalım;

mysql -u root -p

MySQL komut satırında aşağıdaki komutlar yardımıyla OpenHAB adıyla bir veritabanı ve yine aynı isimle bir kullanıcı oluşturalım. Son olarak da kullanıcımıza oluşturduğumuz veritabanı için izin vererek MySQL komut satırından çıkalım;

CREATE DATABASE OpenHAB;
CREATE USER 'openhab'@'localhost' IDENTIFIED BY '<Sizin_belirleyeceğiniz_bir_şifre>';
GRANT ALL PRIVILEGES ON OpenHAB.* TO 'openhab'@'localhost';
Quit
MySQL komut satırından kullanıcı ve veritabanımızı oluşturalım

Veritabanı yapılandırması ardından Paper UI arayüzüne geçerek Extensions –> PERSISTENCE bölümünde yer alan MySQL Persistence eklentisini kuralım;

PaperUI-Persistance

OpenHAB 2 Paper UI henüz arayüz üzerinden MySQL yapılandırmasını desteklemediği için geri kalan ayarları komut satırı üzerinden gerçekleştirmemiz gerekiyor.

OpenHAB 2’ye hangi veritabanına ve ne şekilde bağlanacağını belirtmek için /opt/openhab2/conf/services klasörü altına (burada OpenHAB 2’nin /opt/openhab2 klasöründe kurulu olduğunu varsayıyorum) yer alan mysql.cfg  dosyasının içeriğini aşağıdaki şekilde doldurmalıyız;

url=jdbc:mysql://localhost:3306/OpenHAB
user=openhab
password=<belirlediğiniz_şifre>
reconnectCnt=1
mysql.cfg dosyasına MySQL bağlantı bilgilerini yazıyoruz

Password değeri olarak sizin belirttiğiniz değeri yazmayı unutmayın…

MySQL bağlantı bilgilerini yapılandırdıktan sonra sırada veri kalıcılığı stratejimizi belirtmekte. Veri kalıcığı stratejisi OpenHAB’a hangi nesne verisinin ne zaman saklanması gerektiğini söyleyecektir. Bu amaçla /opt/openhab2/conf/persistence klasörü altına (burada OpenHAB 2’nin /opt/openhab2 klasöründe kurulu olduğunu varsayıyorum) yeni bir mysql.persist dosyası oluşturmalıyız. Bu dosya iki temel bölümden oluşacaktır; stratejiler ve nesneler. Stratejiler verinin saklanma sıklığını belirten cron ifadelidir. Geliştirmeye yardımcı olmak adına OpenHAB 2 aşağıdaki stratejileri ön tanımlı olarak sunmaktadır;

  • everyChange: Nesnenin durumu her değiştiğinde yeni durum bilgisini saklar
  • everyUpdate: Nesnenin durumu her güncellendiğinde durum bilgisini saklar. everyChange stratejisinden farklı olarak durum bilgisinin değişip değişmediği kontol edilmez.
  • restoreOnStartup: Uygulama açılışında nesnenin durumu tanımsız ise bilinen son değerinin geri yüklenmesi sağlanır.

Nesneler ise hangi nesneye hangi stratejinin uygulaması gerektiğinin belirtildiği ifadelerdir.

mysql.persist dosya içeriği
Strategies {
    herGun  : "0 0 0 * * ?"
    herDakika : "0 * * * * ?"
}

Items {
    * : strategy = everyChange, herGun, restoreOnStartup
    Isi_*,Hava_durumu_* : strategy = herDakika, restoreOnStartup
}

Yukarıdaki örnek persist dosyasında Isi_ ve Hava_durumu_ ile başlayan tüm nesnelerimiz için herDakika ve restoreOnStartup stratejilerinin uygulanacağını belirttik. Bu ifadeki *’a dikkatinizi çekerim.  herDakika stratejisi dakikada bir değişikliklerin saklanacağını belirten bir cron ifadesine sahip. Dolayısıyla ısı ve hava durumu nesnelerimizin durumları dakikada bir saklanacak, sistem yeniden başladığında son değerleri geri yüklenecek. Items bölümünün ilk satırında yer alan ifade ile varsayılan olarak tüm nesneler için bir tanımlama yapmaktayız.

Aynı dosyayı daha önce detaylarını paylaştığım Eclipse SmartHome Designer ile düzenlenemeniz de münkün;

Eclipse SmartHome Designer ile mysql.persist dosyasını düzenleyebilirsiniz

Değişiklikleri devreye almak için OpenHAB 2 hizmetini yeniden başlatabilirsiniz;

sudo systemctl restart openhab

Bu işlemler ardından OpenHAB 2 belirlediğiniz kriterler doğrultusunda sistem verilerini MySQL veritabanına kaydedecektir.

İsterseniz kaydedilen bu verileri sitemap üzerinde gösterebilmeniz mümkün. Bunun için chart bileşenini kullanabilirsiniz;

Chart label="Isı Değişimi" item=zwave_device_controller_node2_sensor_temperature period=1d refresh=10000

Yukarıdaki örnekte, daha önce kurulumunu yaptığımız MultiSensor 6’dan gelen ısı verisini 1 günlük bir grafik olarak sitemap’te gösterilmesi sağlanmakta. Örneğimizdeki item grafiği gösterilecek nesneyi, refresh verinin tazelenme sıklığını belirtmekte. period ise gösterilecek veri için zaman aralığını ifade etmektedir. period alanı için aşağıdaki değerler kullanılabilir;

İfadeAçıklama
hson bir saat
4hson dört saat
8hson sekiz saat
12son oniki saat
Dson bir gün
3Dson üç gün
Wson bir hafta
2Wson iki hafta
Mson bir ay
2Mson iki ay
4Mson dört ay
Yson bir yıl

Bir başka örnek kullanım;

Frame label="Salon - Sensör Grafikleri" {
    Chart label="Isı Değişimi" item=zwave_device_controller_node2_sensor_temperature period=1d refresh=10000
    Chart label="Aydınlık" item=zwave_device_controller_node2_sensor_luminance period=1d refresh=10000
}

Site haritamızdaki bu ifade aşağıdaki şekilde grafikler oluşturacaktır;

Sensör grafiği

Leave a Comment

en_USEnglish