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:
<?php 
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:
<?php 
           ← 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!!! 1


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:
<?php 
// 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 ; //7 Days
var p_1d   =  1000*60*60*24 ; // 1 Day
var d = new Date();
var
current = d.getTime();
var
today0h = d.setHours(0,0,0,0);
var
day = d.getDay();
var
monday0h = today0h - (day + (day === 0 ? -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 i = 0; i < sourcelist.length; i++) {
       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 i = 0; i < aggrlist.length; i++) {
       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===0 && 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() < 9 ? "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() < 9 ? "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