Эта страница является
переводом страницы
Log Journal. Перевод выполнен на 100%.
Пример журнала событий
iRidium server позволяет хранить в базе данных информацию о состоянии устройств в доме. Зачастую пользователь хочет видеть в интерфейсе журнал событий, произошедших в доме в течении дня (недели, месяца). В данном примере рассматривается способ создания такого журнала событий в панельном проекте.
Для разработки журнала событий нам потребуется модифицировать серверный и панельный проект.
Серверный проект
1 Настройте запись значений тегов в базу данных
2 Добавьте в проект два виртуальных канала Day и Month и виртуальный тег Data.
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");
Панельный проект
1 Далее откройте панельный проект, добавьте на него попап-шаблон с элементом Item1. Создайте также список List, на котором будет отображаться журнал событий. В свойствах списка укажите ранее созданный попап как шаблон для размещения списка. Создайте кнопки для отображения событий за день и за месяц.
2 Настройте кнопки "Day" и "Month" так, чтобы они отправляли на виртуальные каналы "Day" и "Month" тексты "day" и "month" соответственно.
3 Добавьте скрипт
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 = [];
})
}
});
});
скачать пример серверного проекта
скачать пример панельного проекта