问题描述
我正在使用 FIWARE 来获取热泵的一些时间序列数据。我使用 Orion 2.5.2 和 Quantumleap 0.7.6。
我的实体有很多批量上报的属性。这些数据批次的每个属性都有单独的时间戳,因此测量的确切时间是已知的(这也很重要)。我使用一个小python工具将这些批次拆分并使用时间戳参数通过http分别发送到iot-agent。
我最终得到了这样的实体:
...
"attrs": {
"temp_outdoor": {
"value": "-6.6","type": "Number","md": {
"TimeInstant": {
"type": "DateTime","value": 1613148707.7509995
}
},"mdNames": [
"TimeInstant"
],"creDate": 1612780352.3855166,"modDate": 1613148716.1449544
},"temp_return_flow": {
"value": "40.8","value": 1613149016.394001
}
},"modDate": 1613149021.5991328
},"TimeInstant": {
"value": 1613149101.1790009,"type": "DateTime","mdNames": [],"modDate": 1613149102.5100079
},...
我并不真正关心 creDate 和 modDate,而是关心每个属性的“md”中的 TimeInstant。另外底部的“TimeInstant”属性只是我认为的最后一个数据点的值?我想使用“md”TimeInstant 在 CrateDB 中创建 time_index。因此,报告的时间必须是自定义元数据时间。我在订阅 Quantumleap 时尝试了一些不同的值,但无法正确使用。 有人能告诉我如何指定 md->TimeInstant 作为 time_index 的值吗?
我发现有关该主题的文档尚无定论,希望有人已经解决了这个谜团,并可能让我参与其中 :)
谢谢!
解决方法
查看您的有效载荷,不清楚使用的是什么 NGSI 模型,这将是帮助您所需的信息。无论如何,正如文档所报告的那样:
时间序列数据库中的一个基本元素是时间索引。您可能想知道……它存储在哪里? QuantumLeap 会将每个通知的时间索引保存在一个名为 time_index 的特殊列中。
用于接收通知的时间索引的值是根据以下策略定义的,该策略从以下有序选项列表中选择第一个存在且有效的时间值。
- 自定义时间索引。 Fiware-TimeIndex-Attribute http 标头的值。请注意,对于包含此类标头的通知,必须使用 httpCustom 块创建相应的订阅,如 NGSI 规范的订阅和自定义通知部分所述。这是您可以指示 QL 使用通知负载的自定义属性作为时间索引指示器的方式。
- 自定义时间索引元数据。在通知的任何属性元数据部分中找到的最新自定义时间索引(Fiware-TimeIndex-Attribute 的值)属性值。有关订阅的详细信息,请参阅上一个选项。
- TimeInstant 属性。如 FIWARE IoT 代理文档中所述。
- TimeInstant 元数据。在通知的任何属性元数据部分中找到的最新 TimeInstant 属性值。 (同样,请参阅 FIWARE IoT 代理文档。)
- 时间戳属性。
- 时间戳元数据。在通知的任何属性元数据部分中找到的最新时间戳属性值。如 FIWARE 数据模型文档中所述。
- dateModified 属性。如果您在 Orion 订阅部分注意过,这是 Orion 通知的“dateModified”值。 日期修改的元数据。在通知的任何属性元数据部分中找到的最新 dateModified 属性值。
最后,如果上述选项均不存在或找到的值均无法实际转换为日期时间,则 QL 将使用当前时间(接收通知的时间)。
这意味着(如果您了解 NGSI 模型,文档就非常清楚),具有以下有效负载
{
"id": "Room1","type": "Room","temperature": {
"value": 24.2,"type": "Number","metadata": {
"myTime": {
"type": "DateTime","value": "2020-12-16T17:13:46.00Z"
}
}
},"pressure": {
"value": 720,"metadata": {
"TimeInstant": {
"type": "DateTime","dateObserved": "2021-02-02T00:00:00.00Z","dateCreated": "2019-09-24T12:49:02.00Z","dateModified": "2021-02-02T23:00:50.00Z","TimeInstant": {
"type": "DateTime","value": "2020-12-16T17:13:46.00Z"
}
}
如果您在通知中设置了自定义标题 Fiware-TimeIndex-Attribute=dateObserved
,则 time_index 将是 dateObserved 的值。如果您设置 Fiware-TimeIndex-Attribute=myTime
,它将是链接到温度的 myTime 属性元数据。如果未传递 Fiware-TimeIndex-Attribute
标头,则将选择元数据属性 TimeInstant
的最新值。假设删除上述有效负载中的元数据属性 TimeInstant
,则将选择属性 TimeInstant
。如果 TimeInstant
属性也被删除,则将选择 dateModified
值。如果也没有收到该属性,则使用当前时间。