Kapacitor:通过加入

时间:2017-08-25 00:20:28

标签: join difference influxdb telegraf kapacitor

完全披露:我还发布了此问题的变体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}

我有两个问题:

  1. 是这种方法,使用Kapacitor和TICKscript根据单个测量中两个值之间的差异来计算能量,是否有效?或者有更好/更简单的方法吗?
  2. 为什么join节点不产生任何输出?我该怎么做才能进一步调试呢?

1 个答案:

答案 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')

其中,平均字段是根据我之前的评论计算的字段。试试吧!

另外,为了进一步调试,请尝试添加日志节点,以便放眼。

希望这有帮助!此致