InfluxDB: Как засыпать метки измерений, которые ранее не измерялись (если вообще возможно)? - PullRequest
1 голос
/ 08 апреля 2019

Я начал регистрировать данные со своего Smart Meter с помощью Node-RED около месяца назад, это выглядело как данные json (полезная нагрузка - важный бит):

{
  "topic":"stat/smartmeter/all",
  "payload":"{
    \"kwh_low_tarrif\":866.696,
    \"kwh_high_tarrif\":902.156,
    \"current_tarrif\":1,
    \"current_watt_draw\":485,
    \"gas_timestamp\":1554675307000,
    \"gas_total\":326.509,
    \"kwh_combined\":1768.852
  }",
  "qos":0,
  "retain":false,
  "_topic":"stat/smartmeter/all",
  "_msgid":"db4ebc0.72b9a48"
}

Проблема с этими данными заключается в том, что я провел расчеты затрат на электричество и газ на панели инструментов Grafana:

grafana smartmeter dashboard

Я жестко запрограммировал затраты на приборной панели, используя математическую функцию в выборе данных InfluxDB:

grafana data query for InfluxDB (the math statement is the important bit)

Там вы можете видеть, что я использовал значение (или, скорее, цену) 0,230662 евро за кВтч использованной электроэнергии. Теперь, глупо, я никогда не думал о желании иметь возможность проводить расчеты в течение нескольких лет, когда эта цена будет колебаться, поэтому, как только я обнаружил публичную конечную точку API моего поставщика электроэнергии, где я мог считывать цены для моего конкретного плана, я добавил его к измерениям теперь данные json выглядят так:

{
  "topic":"stat/smartmeter/all",
  "payload":"{
    \"kwh_low_tarrif\":866.696,
    \"kwh_high_tarrif\":902.156,
    \"kwh_low_price\":0.230662,
    \"kwh_high_price\":0.230662,
    \"current_tarrif\":1,
    \"current_watt_draw\":485,
    \"current_kwh_price\":0.230662,
    \"gas_timestamp\":1554675307000,
    \"gas_total\":326.509,
    \"gas_price\":0.804565,
    \"kwh_combined\":1768.852
  }",
  "qos":0,
  "retain":false,
  "_topic":"stat/smartmeter/all",
  "_msgid":"db4ebc0.72b9a48"
}

Единственная проблема (и мои основные вопросы с ней) сейчас заключается в том, что:

1) Как мне написать запрос, который использует это значение в расчете цены? Используемый сейчас запрос (из скриншота выше):

SELECT distinct("kwh_combined")  * 0.230662 FROM "smartmeter" WHERE $timeFilter GROUP BY time($__interval) fill(linear)

2) Как мне засыпать данные? (записать эти цены на электричество и газ в базу данных с начала моей регистрации, добавив их к измерениям, которые я тогда делал)

Я бы предпочел, чтобы значения, которые я ранее жестко запрограммировал на своей панели, были включены в измерения, которые я уже выполнил, вместо того, чтобы писать исключение для случаев, когда измерения отсутствуют или 'нулевые' .. Я имею в виду, данные сам по себе настолько статичен, насколько это возможно, поскольку цены не изменились, так что это не может быть ТАК сложно, не так ли? Даже если для этого потребуется перестроить данные, могу ли я просто вставить его в новый сбор данных и сам добавить поля?

Пожалуйста, скажите мне, что это возможно для InfluxDB ...

Я имею в виду, что в MySQL это будет простой оператор ALTER TABLE с, возможно, простой вставкой записей, которые имеют нулевые значения.

.. или для меня неоправданно просить систему регистрации временных рядов изменить свою структуру данных уже зарегистрированных данных, и я слишком много спрашиваю об InfluxDB?

1 Ответ

2 голосов
/ 08 апреля 2019

Вы можете добавить дополнительные поля (цена_1, цена_2, ...) к существующему измерению.Вставьте их с точно такими же временными метками и значениями тегов, чтобы расширить существующие записи данных с помощью этих новых столбцов цен, готовых для использования в графане:

INSERT smartmeter,tagA=tagAvalue,tagB=tagBvalue,... price1=1234,price2=4321 1549983966469023105
...

Другим способом будет экспорт существующих данных, добавление дополнительных столбцов цен иимпорт назад.

Ни один из способов не выглядит простым.Использование синтаксиса select ... into кажется более простым в исполнении (у меня не получалось без этого безобразного 0*last() + ... хака):

    SELECT 
       last(kwh_combined) as kwh_combined,
       last(other_field) as other_field,
        ...add other fields here...
       0 * last(kwh_combined) + 1234 as price1,
       0 * last(kwh_combined) + 4321 as price2 
       INTO new_smartmeter
    FROM smartmeter GROUP BY *
...