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

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

Добавлено: Чт мар 01, 2018 9:52 am
Misko
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"))
Спасибо заработало :)

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

Добавлено: Ср мар 21, 2018 9:09 pm
Bagir
Случайно нашел в objects.class.php эти функции. Был удивлен, что раньше их не видел. А вот оно что, это новое дополнение. Очень хороший плюс!
Я довольно много пропустил. Скажите, есть ли функция типа GetGlobal(), но для получения не только значения но и времени. Сейчас просто SQL запросом беру колонку ADDED из таблицы pvalues. Возможно появились штатные средства.

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

Добавлено: Чт мар 22, 2018 6:08 am
nick7zmail
Bagir писал(а):Случайно нашел в objects.class.php эти функции. Был удивлен, что раньше их не видел. А вот оно что, это новое дополнение. Очень хороший плюс!
Я довольно много пропустил. Скажите, есть ли функция типа GetGlobal(), но для получения не только значения но и времени. Сейчас просто SQL запросом беру колонку ADDED из таблицы pvalues. Возможно появились штатные средства.
На сколько я знаю - не появилось. В простых устройствах по идее регается время обновления переменной в свойство, можно этим воспользоваться))

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

Добавлено: Чт мар 22, 2018 9:07 am
Bagir
Сегодня делал расчет средней температуры и влажности по дому. У объектов класса 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. Это таблица со значениями разных свойств. Если нужна история свойства, то таблица будет другая.
Мне не раз уже требовалось получать не только значение, но и время свойства. Обращение к базе данных всегда выручает, но если есть штатные функции, то я конечно же предпочитаю использовать их.

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

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


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

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

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


Отправлено с моего Redmi 4X через Tapatalk

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

Добавлено: Чт мар 22, 2018 1:03 pm
Bagir
Да, мы уже в предыдущем разговоре упомянули про эту функцию. Надо будет изучить ее код основательно. Она может хорошо помочь в разных ситуациях.
Оффтоп конечно, но вот такая ситуация. Не раз уже размышлял, что было бы более правильным. Более оптимизированные под конкретную ситуацию SQL запросы, или штатные функции с некоторым количеством php кода для допиливания результата. У обоих вариантов есть как плюсы так и минусы.

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

Добавлено: Чт мар 22, 2018 4:21 pm
xor
Штатная функция, можно сказать, всегда неоптимальна, она лишь позволяет быстрее и компактнее написать код, имхо.
Ну, и при смене концепции/версии/платформы вы правите код только в ней.


Отправлено с моего Redmi 4X через Tapatalk

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

Добавлено: Чт июл 26, 2018 2:05 am
xor
Замечание:
При отсутствии нормально распределенных данных по времени (без дубликатов) штатная историческая функция среднего getHistoryAvg, полагаю, будет работать не верно, она берет значения за период, складывает их и делит на их количество.
При отсутствии дубликатов это будет выдавать чушь - 10 часов температура 0 градусов, 1 час 20 градусов (0+20)/2, ну или /3, если начало-конец пушутся. При таком способе нужно усреднять взвешенные по интервалу начала-конца величины, а не использовать AVG

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

Добавлено: Ср окт 03, 2018 4:00 pm
m_andrey
Столкнулся с некорректной работой функции 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";

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

Добавлено: Чт окт 04, 2018 11:27 pm
xor
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"))
или я что-то не понял?