我在一个月前开始使用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?
您可以向现有测量添加额外字段(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 *