Оптимизация истории значений

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Оптимизация истории значений

Сообщение sergejey » Ср май 25, 2016 2:45 pm

Всем привет,

Хочу посоветываться. При сохранении данных в свойста, у которых выставлен признак хранения истории, происходит автоматическа оптимизация. Она работает следующим образом -- если новое значение совпадает с двумя предыдущими, то вместо трёх показаний в истории остаётся только два -- первый и последний из повторяющейся последовательности. Средний как бы выбрасывается, как ни на что не влияющий. Всё бы ничего, но вскрылась проблема -- в некоторых случаях надо считать сумму показаний за период, где имеет значение каждый экземпляр показаний. В итоге мы пришли к вариантам -- либо отключать оптимизацию на этапе сохранения истории, либо оставлять всё как есть и думать как обрабатывать исключительный случай вот таких вот показаний (добавлять галочку "не оптимизировать на этапе сохранения истории" -- вариант, но чем меньше галочек, тем лучше). Отключение оптимизации плохо только тем, что при неоптимальной организации кода или сбора данных может очень быстро расти база из-за повторяющихся одинаковых значений. Последнее лечится установкой и настройкой модуля Оптимизатора, но тоже так себе вариант, потому что не все сообразят, что нужно делать, а система к тому времени уже будет неповоротливой.

Короче, делитесь соображениям :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Оптимизация истории значений

Сообщение Ivan » Ср май 25, 2016 3:21 pm

Проблема вскрылась у меня с датчиком осадков. Он раз в минуту присылает количество срабатываний (потом умножается на коэффициент и получаем мм осадков).
Как решу проблема опишу данный датчик в топике MySensors

В итоге хотелось получать историю за период. 1 час, 12 часов, 24 часа - мм осадков. Но оптимизатор по сохранению данных оптимизирует значения.

Чтобы не было разногласий: Большая база против верные данные предлагаю сделать настройку типа оптимизации в свойстве объекта, рядом с пунктом "Хранить историю (дней):"
По сути можно вынести правила оптимизатора в этот пункт.
  • Показательные (как сейчас). Добавляет если 2 последних неравны (Если равны меняет дату изменения у последнего). При оптимизации заменяет период на среднее
  • Без оптимизации. Добавляет всю историю. Не оптимизирует оптимизатором
  • Нарастающий. Если равен последнему изменяет дату, если не равен добавляет новый. Оптимизирует за период - максимальным значением
  • Вес. Добавляет в историю всегда. Оптимизирует - сумма значений
Новый флаг немного будет пугать новых пользователей. Зато будет не портить и держать оптимизированными истории свойств.
За это сообщение автора Ivan поблагодарили (всего 2):
Amarok (Ср май 25, 2016 3:23 pm) • cabat (Ср май 25, 2016 3:31 pm)
Рейтинг: 2.33%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: Оптимизация истории значений

Сообщение cabat » Ср май 25, 2016 3:35 pm

Я этот кусок кода по сохранению истории значений постоянно правлю (есть мысли анализировать скорость изменения некоторых параметров,
для этого в течении последних нескольких часов нужны все показания, например по температуре/влажности - четко видно, когда открыли окно).
Поддерживаю предложение Ивана - эти варианты настроек закроют большинство потребностей.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Оптимизация истории значений

Сообщение Ivan » Ср май 25, 2016 3:47 pm

cabat писал(а):Я этот кусок кода по сохранению истории значений постоянно правлю (есть мысли анализировать скорость изменения некоторых параметров,
для этого в течении последних нескольких часов нужны все показания, например по температуре/влажности - четко видно, когда открыли окно).
Поддерживаю предложение Ивана - эти варианты настроек закроют большинство потребностей.
Поделитесь алгоритмом
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
NightRider
Сообщения: 70
Зарегистрирован: Пт авг 21, 2015 2:27 pm
Благодарил (а): 8 раз
Поблагодарили: 4 раза

Re: Оптимизация истории значений

Сообщение NightRider » Ср май 25, 2016 7:12 pm

Изложу здесь в более сжатом виде то о чем писал в группе скайпа.

Если я правильно понял, то одновременно преследуется две цели: оптимизировать количество записей в БД и иметь возможность при этом корректно подсчитывать такие показания как объем воды или эл.энергии за день.
Как для меня - так если у тебя слабое железо и тормозит система, ты задумываешься что с этим делать и в любом случае натыкаешься на модуль оптимизации. А на показания в течение дня мощности как никак должно хватать. Соответственно я предлагаю при сохранении свойства отключить любую оптимизацию.
При таком подходе цели вроде как достигнуты. Но есть предложение как это можно сделать немного по-другому. Ну это что называется если есть желание и ресурсы.

Сделать как описано выше и дополнительно предрасчетные таблицы остатков и оборотов (аля 1с). В интерфейсе рядом с числовым свойством добавить две галочки: Обороты, Остатки.
У оборотов есть понятие периодичность, например день/неделя/месяц. Соответственно должно быть некое задание, которое бы периодически вызывалось и подсчитывало агрегатные функции для текущего периода: Сумма, Макс, Мин, Сред... А дальше на диаграмме выбираем Объект - Эл.Счетчик, Свойство - Значение, ВидАгрегата - Оборот, Период - День, Функция - Сумма. Диаграмма получает данные уже из предварительно посчитанной таблицы. Таким образом показания верные, быстро выводится, хранится более-менее компактно, для конечного пользователя без программирования.
У остатков суть та же, только подсчитываются соответственно остатки на окончания определенных периодов - день, неделя, месяц. Если вывести в диаграмму - покажет какие были показания на каждый конкретный день (или месяц). Я думаю не очень актуально, но вдруг...
За это сообщение автора NightRider поблагодарил:
lanket (Чт май 26, 2016 8:35 am)
Рейтинг: 1.16%
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Оптимизация истории значений

Сообщение ErmolenkoM » Ср май 25, 2016 8:49 pm

sergejey писал(а):добавлять галочку "не оптимизировать на этапе сохранения истории"
Единственный приемлемый вариант.
Описанная задача (каждое показание важно) очень редка. В большинстве случаев решается инкрементным счетчиком, который накапливает в себя периодические значения.
Замечу, что желательно что бы МОДУЛЬ оптимизатора тоже смотрел на галку.

По поводу количества галок. Настройку системы можно делать только 2-я способами: формулы или галки. В первом случае меняются сами формулы (скрипты) во втором - коэффициенты, условия в IF. Чем ближе система к "коробочному варианту" , тем больше мест с галками и меньше формул. Можно думать над местом расположения той или иной галки, но сама суть настройки остается.

Пользуясь случаем: в системе много контекстной помощи, но вся она ведет на заглушки и пустышки. Это очень усложняет работу, освоение нового. Думаю, что Сергей просто не предает значения отсутствию helpa, так как ему он не нужен. Подсказки нужны. Они ОЧЕНЬ облегчают вход в проект. И подсказка должна вести на статическую страницу в ВиКи, и только от туда на форум.
За это сообщение автора ErmolenkoM поблагодарил:
lanket (Чт май 26, 2016 8:34 am)
Рейтинг: 1.16%
aka msh555
Cubian на Cubietruck, Connect
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Оптимизация истории значений

Сообщение ErmolenkoM » Ср май 25, 2016 8:54 pm

NightRider писал(а): дополнительно предрасчетные таблицы остатков и оборотов (аля 1с). В интерфейсе рядом с числовым свойством добавить две галочки: Обороты, Остатки.
У оборотов есть понятие периодичность, например день/неделя/месяц. Соответственно должно быть некое задание, которое бы периодически вызывалось и подсчитывало агрегатные функции для текущего периода: Сумма, Макс, Мин, Сред...
Все это делается скриптами, запускаемыми по расписанию и/или событию. Код очень простой - суммирование или агрегация. Не стоит это тащить в ядро системы.
aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Оптимизация истории значений

Сообщение sergejey » Чт май 26, 2016 9:17 am

ErmolenkoM писал(а):Пользуясь случаем: в системе много контекстной помощи, но вся она ведет на заглушки и пустышки. Это очень усложняет работу, освоение нового. Думаю, что Сергей просто не предает значения отсутствию helpa, так как ему он не нужен. Подсказки нужны. Они ОЧЕНЬ облегчают вход в проект. И подсказка должна вести на статическую страницу в ВиКи, и только от туда на форум.
Пользуясь случаем, отмечу, что любой участник форума может изменить текст подсказки в wiki -- нужно просто нажать на редактирование страницы и войти в wiki, используя логин/пароль от форума. Очень надеюсь на помощь в заполнении подсказок :)
За это сообщение автора sergejey поблагодарил:
Ivan (Чт май 26, 2016 10:00 am)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: Оптимизация истории значений

Сообщение cabat » Пт май 27, 2016 11:27 am

Ivan писал(а):..Поделитесь алгоритмом
Алгоритмов пока никаких нет, так мысли..
Пришлось вспоминать школьный курс математики - расчет производных и т.п.
Хочется вычислять направление изменения показателя и скорость изменения - тогда можно это как то использовать при управлении..
Но это так - мысли на будущее, времени мало, дело движется медленно, пока только несколько датчиков и один модуль индикации на дисплее 1602..
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Оптимизация истории значений

Сообщение Ivan » Пт май 27, 2016 5:24 pm

В последнем обновлении добавили флаг HISTORY_NO_OPTIMIZE
Чтобы отключить оптимизацию в config.php нужно добавить строку

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

 Define('HISTORY_NO_OPTIMIZE', 1); 
*** Сообщение запрещено. Сообщение похоже на спам. ***
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ответить