database - InfluxDB:如何回填以前未测量的测量标签(如果可能的话)?

标签 database iot grafana influxdb sensors

我大约一个月前开始使用 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 欧元的值(value)(或价格)。现在愚蠢的我从来没有想过想要能够在这个价格会波动的多年内运行计算,所以一旦我发现了我的电力供应商的公共(public) 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 要求太多?

最佳答案

您可以向现有测量添加额外字段(price_1、price_2、...)。使用完全相同的时间戳和标签值插入它们,以使用这些新的价格列扩展现有数据记录,以备在 grafana 中使用:

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

另一种方法是导出现有数据,添加额外的价格列,然后再导入回来。

这两种方式看起来都不简单。 使用 select ... into 语法似乎更容易运行(没有这个丑陋的 0*last() + ... hack 对我不起作用):

    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 *

关于database - InfluxDB:如何回填以前未测量的测量标签(如果可能的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55563915/

相关文章:

php - 如何在php mysql中添加数据库导入路径

spring-boot - SpringBoot - *_max *_count *_sum 指标的可观察性

oauth - 当grafana位于应用程序负载均衡器后面时,如何配置grafana以使用Oauth2?

php - 如何使用php函数对特殊字符进行编码

PHP 使用 session 登录

iot - 如何在 Fiware 中管理多个物联网代理

c++ - Azure IoT Edge C++ 模块未将设备发送到云遥测

kubernetes - Prometheus没有收集Pod指标

c# - 我应该使用哪种数据类型来处理九位帐号,为什么?

php - 如果数据库中有更新,则在网页中显示并自动更新 MySQL 数据库的值