Материал из for iRidium developers
Перейти к: навигация, поиск
Other languages:
English • ‎русский

Пример журнала событий

iRidium Server позволяет хранить в базе данных информацию о состоянии устройств в доме. Зачастую пользователь хочет видить в интерфейсе жернал событий, произошедших в доме в течении дня(недели, месяца). В данном примере рассматривается способ создания такого журнала событий в панельном проекте.
Для разработки журнала событий нам потребутеся модифицировать серверный и панельный проект
В серверный проект необходимо:
1Настройте запись значений тегов в базу данных

ServerProjectTags.png

2Добавьте в проект 2 виртуальных канала: Day и Month
3Добавьте в проект скрипт

var LIMIT_TO_RECORD = 300;  //Максимальное количество записей
/**
 * Функция получения значений из базы данных
 * @param {string} Полное имя тега
 * @param {string} Значение тега
 */
function makeDataFromDatabase(in_TagName, in_Value) {
   var Day = new iDate(); // Получаем iDate объект, из текущей даты и времени
   var l_oSql = IR.GetDatabase();  
   var l_oDate;
   var l_sTagID;
   var l_sTagName;
   var l_nGetDate;
   var l_nValue;
   var l_sMakeDate;
 
 
 
   if (in_Value == "day") {
      // Создаем iDate объект из последней даты
      l_oDate = new iDate(Day.year, Day.month, (Day.date - 1), Day.hours, Day.minutes, Day.seconds, Day.ms);
   }
   else if (in_Value == "month") {
      // Создаем iDate объект из последнего месяца
      l_oDate = new iDate(Day.year, (Day.month - 1), Day.date, Day.hours, Day.minutes, Day.seconds, Day.ms); 
   }
   // Обращаемся к базе данных, выбираем все события с указанной датой
   var l_oDataByDate = l_oSql.Request('SELECT TAG_ID, DATETIME, VALUE FROM INTEGER_TAG_HISTORY WHERE DATETIME > '+l_oDate.value+' ORDER BY DATETIME DESC'); 
   if (l_oDataByDate.Rows) {
      for (var j = 0; j < LIMIT_TO_RECORD; j++) {
         l_sTagID = l_oDataByDate.GetRowValue(0,j); //Получаем ID тега
         l_nGetDate = l_oDataByDate.GetRowValue(1,j); //Получаем время изменения значения тега
         l_nValue = l_oDataByDate.GetRowValue(2,j);  //Получаем значение тега
 
         // Создаем объект iDate из времени измененения значения тега
         var date = new iDate(l_nGetDate);
         //Создаем строку с датой и временем
         l_sMakeDate = '';
         if (date.date < 10)
            l_sMakeDate += "0" + date.date + ".";
         else l_sMakeDate += date.date + ".";
         if (date.month < 10)
            l_sMakeDate += "0" + date.month + "." + date.year + " [";
         else l_sMakeDate += date.month + "." + date.year + " [";  
         if (date.hours < 10)
            l_sMakeDate += "0" + date.hours + ":";   
         else l_sMakeDate += date.hours + ":";   
         if (date.minutes < 10)
            l_sMakeDate += "0" + date.minutes + ":"; 
         else l_sMakeDate += date.minutes + ":";   
         if (date.seconds < 10)
            l_sMakeDate += "0" + date.seconds + "] ";
         else l_sMakeDate += date.seconds + "] ";
 
         // Запрашиваем имя тега из базы данных по его ID
         var l_oDataByTagID = l_oSql.Request('SELECT NAME, TAG_ID FROM TAGS_PASSPORT WHERE TAG_ID = '+l_sTagID); 
         var l_oDataByTagIDRows = l_oDataByTagID.Rows;
         for (var k = 0; k < l_oDataByTagID.Rows; k++) {  //Добавляем к строке имя тего и его значение
            l_sTagName = l_oDataByTagID.GetRowValue(0,k);
            l_sMakeDate += l_sTagName + " is " + l_nValue;  
            IR.SetVariable("Server.Tags.Data", l_sMakeDate);  //Записываем значение в серверный тег
         }
      }
      l_oSql.Close()  
   }     
}
IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(in_sName, in_sValue)
{
   if (in_sValue == "day" || in_sValue == "month")  
      //Вызываем функцию генерации данных из базы данных
      makeDataFromDatabase(in_sName, in_sValue);
});
 
// Подписываемся на теги
IR.SubscribeTagChange("Server.Channels.Month");
IR.SubscribeTagChange("Server.Channels.Day");

4Далее открываем панельный проект, добавляем на него элемент List, на котором будет отображаться журнал событий и создаем кнопки для отображения событий за день и за месяц

PanelProjectJournal.png

4Добавляем скрипт

IR.AddListener(IR.EVENT_START,0,function()
{  
   var l_sAllData = '';
   var l_bTest = false;
   var l_oInterval = null;
   var l_aNewData;
   var INTERVAL_TO_REFRESH = 60000;  //значение интервала обновления данных
 
   //Интервал автообновления данных
   IR.SetInterval(INTERVAL_TO_REFRESH, function(){
      IR.GetDevice("iRidium Server").Set("Day", "day");   
   });
   IR.SetTimeout(500, function () {
      IR.GetDevice("iRidium Server").Set("Day", "day");     
   });
   //Слушатель для смены режима день\месяц
   IR.AddListener(IR.EVENT_CHANNEL_SET, IR.GetDevice("iRidium Server"), function (in_sName, in_sValue) {
      if (in_sName == "Day" || in_sName == "Month") {
         l_bTest = true;  
      } 
   });
 
   IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("iRidium Server"), function (in_sName, in_sValue) {      
      if (in_sName == "Data" && l_bTest) {
         IR.ClearInterval(l_oInterval);
         l_sAllData += (in_sValue + "\n");  
         IR.GetPage("Page 1").GetItem("Item 1").Clear();
         l_oInterval = IR.SetTimeout(1000, function () {  
            l_aNewData = l_sAllData.split("\n");  //Парсим строку по разделителю "\n"
            for (var i = 0; i < l_aNewData.length - 1; i++) {
               IR.GetPage("Page 1").GetItem("Item 1").CreateItem(i, 1, {Text: l_aNewData[i]});   //заполняем список
            }
            l_bTest = false; 
            l_sAllData = '';
            l_aNewData = [];            
         })             
      }   
   });    
});


скачать пример серверного проекта
скачать пример панельного проекта