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

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

Модератор: immortal

Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

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

Сообщение Misko » Чт мар 01, 2018 9:52 am

xor писал(а):из описания
getHistoryMin($varname, $start_time, $stop_time) Возвращает минимальное значение за период
getHistoryMax($varname, $start_time, $stop_time) Возвращает максимальное значение за период
Также можно не указывать stop_time - по умолчанию это текущее время

У вас date("d.m.Y H.i.s", strtotime("Monday")) возвращает 05.03.2018 00.00.00 - это старт в будущем, а стоп - сегодня.

Taste date("d.m.Y H.i.s", strtotime("last Monday"))
Спасибо заработало :)
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Ср мар 21, 2018 9:09 pm

Случайно нашел в objects.class.php эти функции. Был удивлен, что раньше их не видел. А вот оно что, это новое дополнение. Очень хороший плюс!
Я довольно много пропустил. Скажите, есть ли функция типа GetGlobal(), но для получения не только значения но и времени. Сейчас просто SQL запросом беру колонку ADDED из таблицы pvalues. Возможно появились штатные средства.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Чт мар 22, 2018 6:08 am

Bagir писал(а):Случайно нашел в objects.class.php эти функции. Был удивлен, что раньше их не видел. А вот оно что, это новое дополнение. Очень хороший плюс!
Я довольно много пропустил. Скажите, есть ли функция типа GetGlobal(), но для получения не только значения но и времени. Сейчас просто SQL запросом беру колонку ADDED из таблицы pvalues. Возможно появились штатные средства.
На сколько я знаю - не появилось. В простых устройствах по идее регается время обновления переменной в свойство, можно этим воспользоваться))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Чт мар 22, 2018 9:07 am

Сегодня делал расчет средней температуры и влажности по дому. У объектов класса Rooms я веду только свойства со значениями разных показателей. Температура, влажность, освещенность и т.д. Отдельно получить время возможности нет. А оно нужно для расчета чтобы не брать во внимания комнаты, данные в которых устарели по какой либо причине.
Время получить не сложно из базы данных:

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

 $prop_id=getValueIdByName('Livingroom', 'Temperature');
 $arr_s = SQLSelectOne("SELECT UNIX_TIMESTAMP(UPDATED) as UPDATED, VALUE FROM pvalues WHERE ID=".$prop_id);
при этом $arr_s[VALUE] будет значение свойства аналогично работе функции gg(), а в $arr_s[UPDATED] будет время изменения этого свойства. Время в формате UNIX. Если нужно в человеческом, то нужно немного изменить SQL запрос. Следует обратить внимание, что запрос идет из таблицы pvalues. Это таблица со значениями разных свойств. Если нужна история свойства, то таблица будет другая.
Мне не раз уже требовалось получать не только значение, но и время свойства. Обращение к базе данных всегда выручает, но если есть штатные функции, то я конечно же предпочитаю использовать их.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт мар 22, 2018 12:40 pm

Ну, ещё, наверное, пропустили
getObjectsByProperty($property_name,$condition=,$condition_value=); -- возвращает массив названий объектов, имеющих свойство $property_name. опционально можно задать условие, под которое попадает значение. Условия могут быть == (или =), >=, >, <=, <, <> (или !=)


Удобно отбирать, например, только живые объекты.
getObjectsByProperty("alive",">",0)

Если есть свойство lastUpdated, можно и время обновления отфильтровать.

Но это не для вашего случая.
Это, так сказать, новости.


Отправлено с моего Redmi 4X через Tapatalk
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

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

Сообщение Bagir » Чт мар 22, 2018 1:03 pm

Да, мы уже в предыдущем разговоре упомянули про эту функцию. Надо будет изучить ее код основательно. Она может хорошо помочь в разных ситуациях.
Оффтоп конечно, но вот такая ситуация. Не раз уже размышлял, что было бы более правильным. Более оптимизированные под конкретную ситуацию SQL запросы, или штатные функции с некоторым количеством php кода для допиливания результата. У обоих вариантов есть как плюсы так и минусы.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт мар 22, 2018 4:21 pm

Штатная функция, можно сказать, всегда неоптимальна, она лишь позволяет быстрее и компактнее написать код, имхо.
Ну, и при смене концепции/версии/платформы вы правите код только в ней.


Отправлено с моего Redmi 4X через Tapatalk
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт июл 26, 2018 2:05 am

Замечание:
При отсутствии нормально распределенных данных по времени (без дубликатов) штатная историческая функция среднего getHistoryAvg, полагаю, будет работать не верно, она берет значения за период, складывает их и делит на их количество.
При отсутствии дубликатов это будет выдавать чушь - 10 часов температура 0 градусов, 1 час 20 градусов (0+20)/2, ну или /3, если начало-конец пушутся. При таком способе нужно усреднять взвешенные по интервалу начала-конца величины, а не использовать AVG
m_andrey
Сообщения: 13
Зарегистрирован: Чт мар 08, 2018 9:54 am
Благодарил (а): 3 раза
Поблагодарили: 4 раза

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

Сообщение m_andrey » Ср окт 03, 2018 4:00 pm

Столкнулся с некорректной работой функции getHistoryMin(); Мне нужно вычислить количество потребленной электроэнергии со счетчика, но DateTime('first day of this month') возвращает первый день месяца с текущем на момент вызова временем а не с нуля часов, после вызова $date->setTime(0,0,0); время обновляется. Так вот в случае вызова getHistoryMin("Mercuriy200_2.tariff1",$date); возвращается самый первый элемент истории (так как показания электросчетчика постоянно растут), а во втором случае все верно но возвращается минимальное показание на первый день месяца но с текущем временем (например запускаю сегодня в 09:43 - значение из истории будет на 2018-10-01 09:43 а не на 2018-10-01 00:00).
Проще говоря нужно получить ближайшее значение на 00:00:00 первого числа текущего месяца.

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

$date = new DateTime('first day of this month');
$date->setTime(0,0,0);
$rez = getHistoryMin("Mercuriy200_2.tariff1",$date);
echo $rez.'  ';
$rez = getHistoryMin("Mercuriy200_2.tariff1",strtotime('first day of this month'));
echo $rez.'  ';
echo $date->format('Y-m-d H:i:s') . "\n";
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт окт 04, 2018 11:27 pm

m_andrey писал(а):
Ср окт 03, 2018 4:00 pm
Столкнулся с некорректной работой функции getHistoryMin(); Мне нужно вычислить количество потребленной электроэнергии со счетчика, но DateTime('first day of this month') возвращает первый день месяца с текущем на момент вызова временем а не с нуля часов, после вызова $date->setTime(0,0,0); время обновляется. Так вот в случае вызова getHistoryMin("Mercuriy200_2.tariff1",$date); возвращается самый первый элемент истории (так как показания электросчетчика постоянно растут), а во втором случае все верно но возвращается минимальное показание на первый день месяца но с текущем временем (например запускаю сегодня в 09:43 - значение из истории будет на 2018-10-01 09:43 а не на 2018-10-01 00:00).
Проще говоря нужно получить ближайшее значение на 00:00:00 первого числа текущего месяца.

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

$date = new DateTime('first day of this month');
$date->setTime(0,0,0);
$rez = getHistoryMin("Mercuriy200_2.tariff1",$date);
echo $rez.'  ';
$rez = getHistoryMin("Mercuriy200_2.tariff1",strtotime('first day of this month'));
echo $rez.'  ';
echo $date->format('Y-m-d H:i:s') . "\n";
ну, так сделайте дату на 1-е число с нулевым временем

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

 mktime(0, 0, 0, date("m") , 1, date("Y"))
или я что-то не понял?
Ответить