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

Я начал регистрировать данные со своего 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:

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

Там вы можете видеть, что я использовал стоимость (или, скорее, цену) 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 ответ

Решение

Вы можете добавить дополнительные поля (цена_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 *
Другие вопросы по тегам