Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Nodered Function İle SQLite DB'den Veri Çekip Chart Oluşturma Hk.
#1
Arkadaşlar herkese merhaba.

PLC olan cihazlarımızdan aldığım çıkışları Raspberry'e bağladım. Sonrasında nodered ile  görselleştirdim. Cihazlar up-down olunca uyarı veriyor, mail atıyor ayrıca bu aktiviteleri SQLite dbye yazıyor. Buraya kadar herşey tamam. Bundan sonra yine birkaç eklenti yapmak istiyorum.

Bir raporlama sistemi yapıp, günlük haftalık aylık ve yıllık olmak üzere DB'den verileri alıp grafisel olarak göstermek istiyorum.

Bunun için db'den veri çağırma kodları gerekiyor, ve bu aldığım kodları grafiğe enjekte edeceğim.


Basitçe ifade etmem gerekirse, SQLite ile DB'ye yazdığımız verileri, Nodejs, dilince çağırmam gerekiyor.

Aslında db'ye veri yazdırması kolay, aşağıdaki şekilde yazdırdım, ancak nasıl veri okuyacağım malesef bilmiyorum.. Aşağıdaki kodlar belki fikir verebilir..


PHP Kod:
var date Date.now();

var 
newMsg = {
 
   "topic""INSERT INTO Test VALUES (CURRENT_TIMESTAMP , \"" +
 
   msg.topic "\",\""  
 
   msg.label "\"," msg.payload ")"
}

return 
newMsg
NoBody Can Stop Me !!!!!
Bul
Cevapla
#2
Arkadaşlar biraz daha açayım, birde görsel ekliyorum

[Resim: bN8RcU.png]


Test  isminde bir db oluşturup içine  test tablosu ve bu tabloyada 4 tane sütun ekledim...

Date - Status - Name - Value

Aşağıdaki şekilde cihazların kablosunu çekince databaseye verileri yazıyor.


PHP Kod:
           ← T →          Date                      Status            Name              Value

 Edit Delete 2018
-11-15 05:41:43 running Laser 2 Working 0
 Edit Delete 2018
-11-15 05:41:55 stopped Laser 3 Error!!! 1
 Edit Delete 2018
-11-15 05:41:57 running Laser 3 Working 0
 Edit Delete 2018
-11-15 05:42:12 stopped Laser 5 Error!!! 1
 Edit Delete 2018
-11-15 05:42:14 running Laser 5 Working 0
 Edit Delete 2018
-11-15 05:42:22 stopped Laser 6 Error!!! 1
 Edit Delete 2018
-11-15 05:42:23 running Laser 6 Working 0
 Edit Delete 2018
-11-15 05:43:05 stopped Laser 4 Error!!! 1
 Edit Delete 2018
-11-15 05:43:06 running Laser 4 Working 0
 Edit Delete 2018
-11-15 06:12:40 stopped Laser 1 Error!!! 1
 Edit Delete 2018
-11-15 06:12:41 running Laser 1 Working 0
 Edit Delete 2018
-11-15 09:22:59 stopped Laser 2 Error!!! 1
 Edit Delete 2018
-11-15 09:23:01 running Laser 2 Working 0
 Edit Delete 2018
-11-15 13:33:11 stopped Laser 1 Error!!! 1
 Edit Delete 2018
-11-15 13:33:13 running Laser 1 Working 0
 Edit Delete 2018
-11-15 13:46:03 stopped Laser 2 Error!!! 


Bir örnek kod buldum, aşağıda ekliyorum.
Bu kodlara uygun olarak istediğim zaman aralığında bugün - yarın geçen hafta -geçen ay olmak üzere, bendeki db yapısına uygun hale aşağıdaki kodu nasıl getirebilirim, destek olmanız ricasıyla.

PHP Kod:
// This will handle any device and any attribute as long as it is in the DB
var p_30d  1000*60*60*24*30 //30 Days
var p_7d  1000*60*60*24*//7 Days
var p_1d    1000*60*60*24 // 1 Day
var = new Date();
var 
current d.getTime();
var 
today0h d.setHours(0,0,0,0);
var 
day d.getDay();
var 
monday0h today0h - (day + (day === ? -6:1)) * p_1d;
var 
fromdate 0;
var 
enddate 0;
var 
sql = [];
var 
sourcelist = [];
var 
aggrlist = [];
var 
title "";


// Get the period and the list of data sources 
// also set some default values if one or the other does not exist yet
sourcelist context.get("sourcelist");
if (
sourcelist===undefined) { // if running for the first time
 
   sourcelist = [];
}
aggrlist context.get("aggrlist");
if (
aggrlist===undefined) { // if running for the first time
 
   aggrlist = [];
}
fromdate context.get("fromdate");
if (
fromdate===undefined) {
 
   // set the period to a default if it is not selected yet
 
   fromdate current-p_1d;
}
enddate context.get("enddate");
if (
enddate===undefined) {
 
   // set the period to a default if it is not selected yet
 
   enddate current;
}

switch(
msg.topic) {
 
   case "period":
 
       switch(msg.payload) {
 
           case "today":
 
               fromdate today0h;
 
               enddate today0h+p_1d;
 
               break;
 
           case "yesterday":
 
               fromdate today0h-p_1d;
 
               enddate today0h;
 
               break;
 
           case "thisweek":
 
               fromdate monday0h;
 
               enddate monday0h+p_7d;
 
               break;
 
           case "lastweek":
 
               fromdate monday0h-p_7d;
 
               enddate monday0h;
 
               break;
 
           case "last24h":
 
               fromdate current-p_1d;
 
               enddate current;
 
               break;
 
           case "last7d":
 
               fromdate current-p_7d;
 
               enddate current;
 
               break;
 
           case "last30d":
 
               fromdate current-p_30d;
 
               enddate current;
 
               break;
 
       }
 
       context.set("fromdate",fromdate);
 
       context.set("enddate",enddate);
 
       break;
 
   case "datasource":
 
       if (msg.payload==="delete") {
 
           // remove all previous data sources
 
           sourcelist = [];
 
       } else {
 
           sourcelist context.get("sourcelist");
 
           if (sourcelist===undefined) { // if running for the first time
 
               sourcelist = [];
 
           }
 
           sourcelist.push(msg.payload);
 
       }
 
       context.set("sourcelist",sourcelist);
 
       break;
 
   case "aggrsource":
 
       if (msg.payload==="delete") {
 
           // remove all previous data sources
 
           aggrlist = [];
 
       } else {
 
           aggrlist context.get("aggrlist");
 
           if (aggrlist===undefined) { // if running for the first time
 
               aggrlist = [];
 
           }
 
           aggrlist.push(msg.payload);
 
       }
 
       context.set("aggrlist",aggrlist);
 
       break;
 
   case "minus1w":
 
       fromdate fromdate-p_7d;
 
       enddate enddate-p_7d;
 
       context.set("fromdate",fromdate);
 
       context.set("enddate",enddate);
 
       break;
 
   case "plus1w":
 
       fromdate fromdate+p_7d;
 
       enddate enddate+p_7d;
 
       context.set("fromdate",fromdate);
 
       context.set("enddate",enddate);
 
       break;
 
   case "minus1d":
 
       fromdate fromdate-p_1d;
 
       enddate enddate-p_1d;
 
       context.set("fromdate",fromdate);
 
       context.set("enddate",enddate);
 
       break;
 
   case "plus1d":
 
       fromdate fromdate+p_1d;
 
       enddate enddate+p_1d;
 
       context.set("fromdate",fromdate);
 
       context.set("enddate",enddate);
 
       break;
}


// Regenerate the SQL statements
// Run through the data source list an generate the SQL statements
sql = [];
if (
sourcelist.length>0) {
 
   for (var 0sourcelist.lengthi++) {
 
       var parts sourcelist[i].split("/");
 
       sql.push({ topic"SELECT * FROM sensor_data WHERE device='"+parts[0]+"' AND sensor='"+parts[1]+"' AND epoch >= " fromdate " AND epoch <= " enddate });
 
   }

if (
aggrlist.length>0) {
 
   for (var 0aggrlist.lengthi++) {
 
       var parts aggrlist[i].split("/");
 
       sql.push({ topic"SELECT * FROM sensor_aggr WHERE device='"+parts[0]+"' AND sensor='"+parts[1]+"' AND epoch >= " fromdate " AND epoch <= " enddate });
 
   }

if (
sql.length===0) {    
    
// Dummy select that returns nothing to clear the chart
 
   sql.push({ topic"SELECT * FROM sensor_data WHERE device='xxxx'" });
}

// set the completed flag for the join node later
sql[sql.length-1].complete=true;
// pass along the email flag to redirect the flow later
if (msg.topic==="email") {
 
   sql[sql.length-1].email=true;
}

// Generate report title
if (sourcelist.length===&& aggrlist.length===0) {
 
   title "No data source";
} else {
 
   if (sourcelist.length!==0) {
 
       title title sourcelist.toString()+ ", ";
 
   }
 
   if (aggrlist.length!==0) {
 
       title title aggrlist.toString()+ ", ";
 
   }
 
   title title.substring(0,title.length-2);
 
   title title " | ";

 
   var d = new Date();
 
   d.setTime(fromdate);
 
   var yyyy d.getFullYear();
 
   var mm d.getMonth() < "0" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based
 
   var dd  d.getDate() < 10 "0" d.getDate() : d.getDate();
 
   var hh d.getHours() < 10 "0" d.getHours() : d.getHours();
 
   var mmm  d.getMinutes() < 10 "0" d.getMinutes() : d.getMinutes();
 
   var ss  d.getSeconds() < 10 "0" d.getSeconds() : d.getSeconds();
 
   title title dd "." mm "." yyyy;
 
   d.setTime(enddate);
 
   yyyy d.getFullYear();
 
   mm d.getMonth() < "0" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based
 
   dd  d.getDate() < 10 "0" d.getDate() : d.getDate();
 
   hh d.getHours() < 10 "0" d.getHours() : d.getHours();
 
   mmm  d.getMinutes() < 10 "0" d.getMinutes() : d.getMinutes();
 
   ss  d.getSeconds() < 10 "0" d.getSeconds() : d.getSeconds();
 
   title title " - " dd "." mm "." yyyy;
}
sql[sql.length-1].title=title;

return [ 
sql ]; 
NoBody Can Stop Me !!!!!
Bul
Cevapla
#3
Javascript ile ilgili bir problem arkadaşlar, destek bekliyorum.
NoBody Can Stop Me !!!!!
Bul
Cevapla
#4
Kardeş,

SQL ile tarihsel sorgulama yapmak işini görecektir.

İlk verdiğin örnekte;

var date = Date.now(); kodu gereksiz ve işlevi yok.
Veritabanı tarafında ve kayıt esnasında CURRENT_TIMESTAMP ile zaman bilgisi veritabanınızdaki "Date" sütununa kaydediliyor.

Aynı yöntemi sorgulama ve filtrelemelerde de kullanabilirsin.

Yani; SQLITE için verileri alırken yine bu zaman metodundan yararlanabilirsin.

Örneğin;

select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-7 DAY')

böyle bir sorgu ile kayıtlar tablondan 7 gün öncesinden başlayarak tüm kayıtlar listelenir. Belli bir aralığı almak istersen;
select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-7 DAY') AND Date < datetime(CURRENT_TIMESTAMP, '-1 DAY')

Böyle bir sorgulamada da 7 gün öncesinden başlayarak sorgulama yapılan günden 1 gün öncesine kadar olan kayıtlar listelenir.



Bu tür sorgular ile kayıtları  filtreleyip alabilirsin. (1 gün öncesi, 7 gün öncesi, 30 gün öncesi vs.)

select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-1 YEAR')

Örneğin böyle bir kodla da 1 öncesinden başlayarak kayıtlar listelenir. Diğer bir ifadeyle; 1 yılı geçmiş kayıtlar alınmaz.

MONTH, YEAR, DAY vs. parametreler mevcut. Bu tür bilgilere google ile ulaşabilirsin.

https://sqlitebrowser.org/ bu adresteki uygulama ile veritabanı dosyanı açıp üzerinde sorgu denemeleri yapabilirsin.

İşini görecek sorguları oluşturduktan sonra ise https://www.highcharts.com vb. bir araçla grafikleri oluşturabilirsin.
Cevapla
#5
(19-11-2018, 22:23)Administrator Adlı Kullanıcıdan Alıntı: Kardeş,

SQL ile tarihsel sorgulama yapmak işini görecektir.

İlk verdiğin örnekte;

var date = Date.now(); kodu gereksiz ve işlevi yok.
Veritabanı tarafında ve kayıt esnasında CURRENT_TIMESTAMP ile zaman bilgisi veritabanınızdaki "Date" sütununa kaydediliyor.

Aynı yöntemi sorgulama ve filtrelemelerde de kullanabilirsin.

Yani; SQLITE için verileri alırken yine bu zaman metodundan yararlanabilirsin.

Örneğin;

select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-7 DAY')

böyle bir sorgu ile kayıtlar tablondan 7 gün öncesinden başlayarak tüm kayıtlar listelenir. Belli bir aralığı almak istersen;
select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-7 DAY') AND Date < datetime(CURRENT_TIMESTAMP, '-1 DAY')

Böyle bir sorgulamada da 7 gün öncesinden başlayarak sorgulama yapılan günden 1 gün öncesine kadar olan kayıtlar listelenir.



Bu tür sorgular ile kayıtları  filtreleyip alabilirsin. (1 gün öncesi, 7 gün öncesi, 30 gün öncesi vs.)

select * from kayitlar where Date > datetime(CURRENT_TIMESTAMP, '-1 YEAR')

Örneğin böyle bir kodla da 1 öncesinden başlayarak kayıtlar listelenir. Diğer bir ifadeyle; 1 yılı geçmiş kayıtlar alınmaz.

MONTH, YEAR, DAY vs. parametreler mevcut. Bu tür bilgilere google ile ulaşabilirsin.

https://sqlitebrowser.org/ bu adresteki uygulama ile veritabanı dosyanı açıp üzerinde sorgu denemeleri yapabilirsin.

İşini görecek sorguları oluşturduktan sonra ise https://www.highcharts.com vb. bir araçla grafikleri oluşturabilirsin.



Hocam merhabalar, desteğiniz dolayısıyla teşekkür ederim.

Aslında var date = dateNow(); seçeneği var iken saat kafasına göre takılıyordu, sildim şimdi 3 saat öncesinden kayıtları atıyor, yani GMT +3 yapmam lazım, bu sorunu nasıl aşabilirim acaba ?

Harici bir high chart kullanmak istemiyorum, rasppberry PI içinde node entegre ve bunu değerlendirmek istiyorum, ahtta size yolladığım kodlar çalışanı ve bir arkadaş yapmış.

Bunu kendi db'me uydurmak stiyorum ancak birkaç yer daha değiştirmem gerekiyor. ANcak henüz bulamadım.
NoBody Can Stop Me !!!!!
Bul
Cevapla


Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi