Счетчик возврата InfluxDB / Grafana, начиная с нуля - PullRequest
0 голосов
/ 20 июня 2020

Я отслеживаю потребление воды дома, и у меня всегда движется вверх счетчик, который показывает литры воды, использованные с момента перезапуска устройства-источника. Я отображаю это на графике с данными за 1 день, и это дает хорошее представление об использовании воды. Проблема в том, что, когда счетчик достигает нескольких тысяч литров, становится трудно читать график, поскольку он показывает, начиная с 10,123 и заканчивая 10,456. Я хотел бы вычесть 10,123 из каждого значения на графике, чтобы значение начиналось с нуля.

В качестве примера это мой запрос и результаты. Я хотел бы вычесть 417,388698630137 из каждого возвращенного значения. Я был бы рад найти решение в Influx или Grafana. Бонусные баллы, если решение работает после сброса счетчика. : -)

> SELECT mean("waterTotalVolumeMeter") 
FROM "detailed_data"."water" 
WHERE time > now() - 6h 
GROUP BY time(1h) fill(null)

name: water
time                mean
----                ----
1592600400000000000 417.388698630137
1592604000000000000 423.9315642458101
1592607600000000000 432.36805555555554
1592611200000000000 443.77777777777777
1592614800000000000 450.3611111111111
1592618400000000000 504.5763888888889
1592622000000000000 544.8134328358209

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Скорость изменения обычно рассчитывается от счетчика. InfluxDB имеет для этого функцию DERIVATE. Но следует использовать NON_NEGATIVE_DERIVATIVE, потому что счетчик можно перезапустить, а отрицательное значение не имеет смысла для этого варианта использования.

SELECT NON_NEGATIVE_DERIVATIVE("waterTotalVolumeMeter") 
FROM "detailed_data"."water" 
WHERE time > now() - 6h

Do c: https://docs.influxdata.com/influxdb/v1.8/query_language/functions/#non -отрицательная-производная

См. Do c и улучшите пример запроса в соответствии со своими потребностями. Например, вам может потребоваться указать unit в зависимости от используемой группировки времени.

0 голосов
/ 20 июня 2020

Я нашел решение, которое, похоже, работает, я не уверен, что это лучшее решение, но отправляю его, поскольку оно может быть кому-то полезно. Это не всегда возвращает 0 для первого результата, так как в первом интервале могут быть некоторые приращения счетчика, но это делает то, что я хочу. Я вернул исходное значение только для того, чтобы выделить то, что он делает.

РЕДАКТИРОВАТЬ: Я обнаружил, что вам нужно установить fill (previous), чтобы справиться с пробелами в данных, без этого конечный результат будет неточным и график неожиданно подскакивает. Я также обнаружил, что он хорошо справляется со сбросом счетчиков, поэтому нам нужен non_negative_derivative.

SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)), mean("waterTotalVolumeMeter") FROM "detailed_data"."water" WHERE time > now() - 12h GROUP BY time(1h) fill(previous)
name: water
time                cumulative_sum     mean
----                --------------     ----
1592600400000000000 5.993055555555543  416.29008746355686
1592604000000000000 13.93156424581008  423.9315642458101
1592607600000000000 22.368055555555543 432.36805555555554
1592611200000000000 33.77777777777777  443.77777777777777
1592614800000000000 40.361111111111086 450.3611111111111
1592618400000000000 94.57638888888891  504.5763888888889
1592622000000000000 138.69444444444446 548.6944444444445
1592625600000000000 144.27083333333337 554.2708333333334
1592629200000000000 154.91666666666663 564.9166666666666
1592632800000000000 159                569
1592636400000000000 229.09027777777783 639.0902777777778
1592640000000000000 324.88194444444446 734.8819444444445
1592643600000000000 375                785

Я также обнаружил, что это единственный метод, который дает точные результаты для одного показателя. Если мы хотим показать количество чего-то, потребленного за определенный промежуток времени на основе счетчика, то логический метод состоит в том, чтобы вычесть минимальное значение из максимального или использовать функцию распространения. Однако ни один из них не работает для сброса счетчика. Чтобы справиться со сбросом счетчика, единственный вариант - просуммировать все положительные приращения, что и происходит. Я нашел 3 способа использовать его в одной статистике:

  1. Оставьте запрос как есть и позвольте Grafana сделать максимум

SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() -24h GROUP BY time(1h) fill(previous)

Максимальный приток с исходным запросом как подзапросом

SELECT MAX(X) FROM (SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))

Используйте сумму в притоке следующим образом:

SELECT SUM(X) FROM (SELECT non_negative_derivative(mean("waterTotalVolumeMeter"), 1h) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))

...