Страница 1 из 5

Добавленны: Функции работы с историей

Добавлено: Пт июн 03, 2016 1:32 pm
Ivan
В последнем обновлении 03.06.2016 функции работы с историей

function getHistoryMin($varname, $start_time, $stop_time)
Возвращает минимальное значение за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Минимальное значение

Пример, запрос

Код: Выделить всё

$data = getHistoryMin("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ: 0
function getHistoryMax($varname, $start_time, $stop_time)
Возвращает максимальное значение за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Минимальное значение

Пример, запрос

Код: Выделить всё

$data = getHistoryMax("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ: 0
function getHistoryCount($varname, $start_time, $stop_time)
Возвращает количество значений за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Максимальное значение

Пример, Запрос

Код: Выделить всё

$data = getHistoryCount("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ: 10
function getHistorySum($varname, $start_time, $stop_time)
Возвращает сумму значений за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Сумма

Пример, Запрос

Код: Выделить всё

$data = getHistorySum("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ: 143
function getHistoryAvg($varname, $start_time, $stop_time)
Возвращает среднее значений за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Среднее

Пример, Запрос

Код: Выделить всё

$data = getHistoryAvg("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ: 18,43
function getHistory($varname, $start_time, $stop_time)
Возвращает массив значений истории
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • start_time - Время начало выборки, включительно (метка времени Unix)
  • stop_time - Время конца выборки, включительно (метка времени Unix)
Выходные значение: Массив элементов Array(VALUE, ADDED)

Пример, Запрос

Код: Выделить всё

$data = getHistory("RainGauge1.value", -3*60*60);
echo print_r($data, true)."<br/>\n";
 
Ответ

Код: Выделить всё

Array
(
    [0] => Array
        (
            [VALUE] =>  0
            [ADDED] => 2016-06-03 09:53:37
        )

    [1] => Array
        (
            [VALUE] =>  0
            [ADDED] => 2016-06-03 09:54:37
        )

    [2] => Array
        (
            [VALUE] =>  0
            [ADDED] => 2016-06-03 09:54:38
        )

    [3] => Array
        (
            [VALUE] =>  0
            [ADDED] => 2016-06-03 09:54:39
        )
)
 
function getHistoryValue($varname, $time, $nerest)
Возвращает среднее значений за период
СпойлерПоказать
Входные параметры:
  • varname - "объект.свойство" (строка)
  • time - Время точки выбора (метка времени Unix)
  • nerest - Если false - Применяется интерполяция между 2 точками; Если true - Ближайшая точка
Выходные значение: Точка по времени
Пример, Запрос

Код: Выделить всё

$data = getHistoryValue("RainGauge1.value", strtotime("2016-06-01 13:19:00"));
echo print_r($data, true)."<br/>\n";
 
Ответ: 18,00
Время (метка времени Unix) это количество прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT) до текущего времени
Можно задавать следующими способами
  • Через функции strtotime (Подробнее)
  • Отрицательное число. Будет означать сколько секунд от настоящего времени
Также можно не указывать stop_time - по умолчанию это текущее время

Все кто делал до этого запросы истории для модулей, просьба заменить код на эти функции

Re: Добавленны: Функции работы с историей

Добавлено: Пт июн 03, 2016 1:33 pm
Ivan
Для чего это нужно
  • Единый код для вывода графика
  • Аналитика данных по истории
С графиками всё понятно. А вот аналитика даёт очень интересные механизмы.

Например можно добавить Алисе всякие предупреждения:
  • Если минимальная температура за день меньше 5 градусов, то пора сливать воду из системы полива.

    Код: Выделить всё

     if (getHistoryMin("tsrearyard.temp", strtotime("-1 day")) < 5)
       say("Пора сливать воду из системы полива"); 
    
  • Если среднесуточная температура меньше 7 градусов, то пора менять колёса на зимние.

    Код: Выделить всё

     if (getHistoryAvg("tsrearyard.temp", strtotime("-1 day")) < 7)
       say("Пора менять колёса на зимние"); 
    
  • Самое интересное можно взять значение на определённом отрезке времени, даже если выборки попали между запросом (Берутся 2 точки до и после, из них делается интерполяция)

    Код: Выделить всё

     if (getHistoryValue("tsrearyard.temp", strtotime("03:00")) < 0)
       say("Ночью была минусовая температура"); 
    
Понятно что этот только примеры. Но теперь 1 строкой можно делать анализ истории, а на основе его строить сложные алгоритмы.

Предлагаю открыть отдельный раздел где можно будет описать свой вариант добавления мозгов нашей системе

Re: Добавленны: Функции работы с историей

Добавлено: Пт июн 03, 2016 8:20 pm
sega6549
круть)))

Re: Добавленны: Функции работы с историей

Добавлено: Вт июн 21, 2016 12:25 pm
in4m
Как по мне, то не хватает функции возврата предыдущего значения и предыдущего уникального значения
что-нибудь типа getHistoryPrevValue($varname)

например чтобы отловить изменение статуса ИБП при отключении электроэнергии: онлайн -> батарея, батарея ->онлайн

Re: Добавленны: Функции работы с историей

Добавлено: Вт июн 21, 2016 4:35 pm
Ivan
Тут уже аналитика, у каждого своя. Наверно проще считать весь массив и поискать нужное.
Вообще я хотел добавить 1 функцию. Типа было ли значение за данный период.
Например открывалась ли дверь: getHistoryHasVal("backdor.value", 1)
У или превышалась ли температура hetHistoryValUp("outsidetemp.value", 30);

Но потом подумал что таких вариантов может быть слишком много.
Потому до сих пор жду хоть какого то обсуждения.

Re: Добавленны: Функции работы с историей

Добавлено: Ср июн 22, 2016 2:23 pm
Alien
Ivan писал(а):Тут уже аналитика, у каждого своя. Наверно проще считать весь массив и поискать нужное.
Вообще я хотел добавить 1 функцию. Типа было ли значение за данный период.
Например открывалась ли дверь: getHistoryHasVal("backdor.value", 1)
У или превышалась ли температура hetHistoryValUp("outsidetemp.value", 30);

Но потом подумал что таких вариантов может быть слишком много.
Потому до сих пор жду хоть какого то обсуждения.
Только сейчас в ветку заглянул. Спасибо, Иван - зачетно.
С такими функциями удобнее. Я, например, при выключении режима охраны делаю доклад, используя промежуточную переменную.
Нужно попереписывать код, чтоб использовать историю.

Re: Добавленны: Функции работы с историей

Добавлено: Чт июн 23, 2016 10:22 am
Vit
Спасибо Иван за функции...

Возможно, как ты и обозначил стоит выкладывать примеры использования....

вот я например уже давно систему использую....а вот прочитал и до конца не пойму как пользоваться....в общих чертах понято а с примерами где то в методах или еще где не совсем ....

P.S. может просто надо аз попробовать, но система не под рукой..

Re: Добавленны: Функции работы с историей

Добавлено: Чт авг 25, 2016 2:28 am
xor
Вот только нужно иметь в виду, что при проверке на интервале, где нет значений, выдается пустой результат.
У меня сообщалка о дожде построена на анализе признака от датчика дождя (ws.isRain = 1 - дождь, 0 - сухо), но во время несильного дождя значение датчика скачет туда-сюда.
Воспользовался новой функцией, чтобы сообщение появлялось не чаще 15 минут:

Код: Выделить всё

if(gg("ws.isRain")==0&&getHistoryMax("ws.isRain",strtotime("-15 minute"))<1) { //ловим переход из 0 в 1 при том, что 15 минут не было дождя
  say(' пошёл дождь...',1);
}
 
Спустя некоторое время в консоли стал проверять:

Код: Выделить всё

 
Command: gethistorymax("ws.isRain",strtotime("-15 minute"))
Result:
 
(у меня нет данных за этот период)
И даже

Код: Выделить всё

Command: gethistorycount("ws.isRain",strtotime("-15 minute"))
Result:
 
, хотя в последнем случае логичнее, по-моему, видеть 0.

Re: Добавленны: Функции работы с историей

Добавлено: Чт авг 25, 2016 12:15 pm
Ivan
xor писал(а):Вот только нужно иметь в виду, что при проверке на интервале, где нет значений, выдается пустой результат
Вы неправильно используете функцию. Вам нужно с начало проверить на пустой результат.

Код: Выделить всё

$ret = gethistorycount("ws.isRain",strtotime("-15 minute"));
if ($ret === false) $ret = 0;
if ($ret != 0) say(' пошёл дождь...',1);
 
Если нет никаких данных функция возвращает false - а что делать по этому поводу решать вам. Может нужно сказать "Датчик дождя не выдавал значения за этот период"

Re: Добавленны: Функции работы с историей

Добавлено: Пт авг 26, 2016 12:32 pm
xor
Ок, просто этого не было в описании.