完全披露:我还发布了此问题的变体here。
我有一个嵌入式设备作为加热系统的一部分,每隔5秒通过一个mosquitto MQTT代理发布两个温度值,每个温度值为一个单独的MQTT主题。 " mydevice在/传感器1"是预热温度," mydevice / sensor2"是后加热温度。这些值几乎同时发布,因此两条消息之间的延迟时间通常不会超过半秒 - 但它们并未完全同步。
Telegraf订阅了同一个经纪人,并乐于将这些测量结果放入名为" telegraf.autogen"的InfluxDB数据库中。这些测量结果都出现在一个名为" mqtt_consumer"用一个名为" value"的字段。在InfluxDB中,我可以通过过滤"主题"来区分主题标记值。标记:
SELECT mean("value") AS "mean_value" FROM "telegraf"."autogen"."mqtt_consumer" WHERE time > now() - 1m AND "topic"='mydevice/sensor1' GROUP BY time(5s)
这一切似乎都正常。
我想要做的是为每对输入值计算这两个主题值之间的差异,以便计算温差并最终计算加热系统传输的能量(流速恒定且已知)。我试图用Grafana中的InfluxDB查询做到这一点,但这似乎很难(我失败了),所以我想我会尝试使用TICKscript将我的过程分解成小步骤。
我一直在根据这个例子整理一个TICKscript来计算差异:
https://docs.influxdata.com/kapacitor/v1.3/guides/join_backfill/#stream-method
然而在我的情况下,我没有两个单独的测量。相反,我从单个" mqtt_consumer"创建了两个独立的流。测量,使用主题标签作为过滤器。然后我尝试以1s容差加入这些(值总是在时间上足够接近地发布)。我使用httpOut
生成一个用于调试的视图(旁白:这只会每10秒更新一次,缺少每秒的值,即使我的流以5秒的间隔运行 - 为什么会这样?我可以看到这些值都存在的新数据库。)
一旦我加入它们,我会评估值的差异,并将其存储在名为" diff"的测量中的新数据库中。
到目前为止,这是我的剧本:
var sensor1 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor1')
.groupBy(*)
|httpOut('sensor1')
var sensor2 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor2')
.groupBy(*)
|httpOut('sensor2')
sensor1
|join(sensor2)
.as('value1', 'value2')
.tolerance(1s)
|httpOut('join')
|eval(lambda: "sensor1.value1" - "sensor1.value2")
.as('diff')
|httpOut('diff')
|influxDBOut()
.create()
.database('mydb')
.retentionPolicy('myrp')
.measurement('diff')
不幸的是,我的脚本无法通过join
节点传递任何项目。在kapacitor show
中,我可以看到httpOut
节点都将项目传递给join
节点,但它没有通过任何节点。 kapacitor日志也没有显示任何明显的东西。 httpOut('join')
的HTTP GET返回:
{"series":null}
我有两个问题:
join
节点不产生任何输出?我该怎么做才能进一步调试呢?答案 0 :(得分:0)
尝试在两个传感器中添加| mean node,以计算字段的平均值:
var sensor1 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor1')
.groupBy(*)
|mean('field1')
|httpOut('sensor1')
在连接之后,您应该使用新分配的流名称或原始名称:
sensor1
|join(sensor2)
.as('value1', 'value2')
.tolerance(1s)
|httpOut('join')
|eval(lambda: "value1.field1" - "value2.field2")
.as('diff')
|httpOut('diff')
|influxDBOut()
.create()
.database('mydb')
.retentionPolicy('myrp')
.measurement('diff')
其中,平均字段是根据我之前的评论计算的字段。试试吧!
另外,为了进一步调试,请尝试添加日志节点,以便放眼。
希望这有帮助!此致