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

Новые релизы, обновления и т.п.

Модератор: immortal

Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Пт июн 03, 2016 1:32 pm

В последнем обновлении 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 - по умолчанию это текущее время

Все кто делал до этого запросы истории для модулей, просьба заменить код на эти функции
За это сообщение автора Ivan поблагодарили (всего 14):
ErmolenkoM (Пт июн 03, 2016 2:06 pm) • skysilver (Пт июн 03, 2016 4:08 pm) • Otto (Пт июн 03, 2016 4:55 pm) • Amarok (Сб июн 04, 2016 11:33 am) • Colp (Сб июн 04, 2016 7:04 pm) • Alien (Ср июн 22, 2016 2:15 pm) • Silowar (Чт авг 25, 2016 9:27 am) • olehs (Вт сен 13, 2016 12:19 am) • Pacific (Пн окт 31, 2016 7:38 pm) • Bagir (Чт фев 09, 2017 5:09 pm) и ещё 4
Рейтинг: 16.28%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Пт июн 03, 2016 1:33 pm

Для чего это нужно
  • Единый код для вывода графика
  • Аналитика данных по истории
С графиками всё понятно. А вот аналитика даёт очень интересные механизмы.

Например можно добавить Алисе всякие предупреждения:
  • Если минимальная температура за день меньше 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 строкой можно делать анализ истории, а на основе его строить сложные алгоритмы.

Предлагаю открыть отдельный раздел где можно будет описать свой вариант добавления мозгов нашей системе
За это сообщение автора Ivan поблагодарили (всего 9):
Otto (Пт июн 03, 2016 4:57 pm) • Zaezd2008 (Пт июн 03, 2016 9:51 pm) • Amarok (Сб июн 04, 2016 11:33 am) • Vit (Сб июн 04, 2016 3:14 pm) • devoff (Вс июн 05, 2016 12:54 am) • zelevova (Вт июн 07, 2016 1:16 pm) • olehs (Вт сен 13, 2016 12:19 am) • craber (Вс ноя 06, 2016 9:12 pm) • dioxin (Пн ноя 20, 2017 5:36 pm)
Рейтинг: 10.47%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
sega6549
Сообщения: 530
Зарегистрирован: Чт авг 20, 2015 11:32 am
Откуда: Ярославль
Благодарил (а): 61 раз
Поблагодарили: 75 раз
Контактная информация:

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

Сообщение sega6549 » Пт июн 03, 2016 8:20 pm

круть)))
Тут можно задать вопрос по MajorDoMo VK
Канал по MajorDoMo youtube
in4m
Сообщения: 15
Зарегистрирован: Сб июл 26, 2014 12:01 am
Благодарил (а): 0
Поблагодарили: 2 раза

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

Сообщение in4m » Вт июн 21, 2016 12:25 pm

Как по мне, то не хватает функции возврата предыдущего значения и предыдущего уникального значения
что-нибудь типа getHistoryPrevValue($varname)

например чтобы отловить изменение статуса ИБП при отключении электроэнергии: онлайн -> батарея, батарея ->онлайн
За это сообщение автора in4m поблагодарил:
lanket (Вт июн 21, 2016 2:25 pm)
Рейтинг: 1.16%
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Вт июн 21, 2016 4:35 pm

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

Но потом подумал что таких вариантов может быть слишком много.
Потому до сих пор жду хоть какого то обсуждения.
За это сообщение автора Ivan поблагодарил:
vitosmaxim80sad145 (Чт ноя 30, 2023 9:24 pm)
Рейтинг: 1.16%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Alien
Сообщения: 191
Зарегистрирован: Пт дек 20, 2013 4:46 pm
Благодарил (а): 72 раза
Поблагодарили: 38 раз

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

Сообщение Alien » Ср июн 22, 2016 2:23 pm

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

Но потом подумал что таких вариантов может быть слишком много.
Потому до сих пор жду хоть какого то обсуждения.
Только сейчас в ветку заглянул. Спасибо, Иван - зачетно.
С такими функциями удобнее. Я, например, при выключении режима охраны делаю доклад, используя промежуточную переменную.
Нужно попереписывать код, чтоб использовать историю.
Ubuntu на Banana pi M2U Connect
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

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

Сообщение Vit » Чт июн 23, 2016 10:22 am

Спасибо Иван за функции...

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

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

P.S. может просто надо аз попробовать, но система не под рукой..
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт авг 25, 2016 2:28 am

Вот только нужно иметь в виду, что при проверке на интервале, где нет значений, выдается пустой результат.
У меня сообщалка о дожде построена на анализе признака от датчика дождя (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.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Чт авг 25, 2016 12:15 pm

xor писал(а):Вот только нужно иметь в виду, что при проверке на интервале, где нет значений, выдается пустой результат
Вы неправильно используете функцию. Вам нужно с начало проверить на пустой результат.

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

$ret = gethistorycount("ws.isRain",strtotime("-15 minute"));
if ($ret === false) $ret = 0;
if ($ret != 0) say(' пошёл дождь...',1);
 
Если нет никаких данных функция возвращает false - а что делать по этому поводу решать вам. Может нужно сказать "Датчик дождя не выдавал значения за этот период"
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Пт авг 26, 2016 12:32 pm

Ок, просто этого не было в описании.
Ответить