Join Kapacitor:通过连接计算两个流之间的差异

Join Kapacitor:通过连接计算两个流之间的差异,join,difference,influxdb,telegraf,kapacitor,Join,Difference,Influxdb,Telegraf,Kapacitor,完全披露:我还发表了这个问题的一个变体 我有一个嵌入式设备作为加热系统的一部分,该系统每5秒通过Mosquito MQTT代理发布两个温度值,每个温度值发布到一个单独的MQTT主题。“mydevice/sensor1”是预热温度,“mydevice/sensor2”是后加热温度。这些值几乎是在同一时间发布的,因此两条消息之间的延迟通常不会超过半秒,但它们并不完全同步 Telegraf订阅了同一个代理,并很高兴地将这些测量结果放入名为“Telegraf.autogen”的XDB数据库中。这两个测量

完全披露:我还发表了这个问题的一个变体

我有一个嵌入式设备作为加热系统的一部分,该系统每5秒通过Mosquito MQTT代理发布两个温度值,每个温度值发布到一个单独的MQTT主题。“mydevice/sensor1”是预热温度,“mydevice/sensor2”是后加热温度。这些值几乎是在同一时间发布的,因此两条消息之间的延迟通常不会超过半秒,但它们并不完全同步

Telegraf订阅了同一个代理,并很高兴地将这些测量结果放入名为“Telegraf.autogen”的XDB数据库中。这两个测量值都显示在一个名为“mqtt_consumer”的测量值下,该测量值带有一个名为“value”的字段。在XDB中,我可以通过使用“topic”标记进行过滤来区分主题标记的值:

这一切似乎都运转正常

我想做的是计算这两个主题值之间的差异,对于每对输入值,以计算温差,并最终计算加热系统传递的能量(流速恒定且已知)。我尝试在Grafana中使用InfluxDB查询来实现这一点,但这似乎相当困难(我失败了),所以我想我应该尝试使用TICKscript将我的过程分解为几个小步骤

我一直在编写一个脚本,根据以下示例计算差异:

然而,在我的情况下,我没有两个单独的测量。相反,我使用topic标记作为过滤器,从单个“mqtt_使用者”度量创建两个独立的流。然后我尝试用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}
我有两个问题:

  • 使用Kapacitor和TICKscript根据单个测量中两个值之间的差值计算能量的方法有效吗?或者有没有更好/更简单的方法
  • 为什么
    join
    节点不产生任何输出?我可以做些什么来进一步调试它

  • 尝试在两个传感器中添加|平均节点,以计算场的平均值:

    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')
    
    其中平均字段是根据我之前的评论计算的字段。试试看

    此外,为了进一步调试,请尝试将日志节点添加到您希望查看的位置


    希望这有帮助!关于

    尝试在两个传感器中添加|平均节点,以计算场的平均值:

    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')
    
    其中平均字段是根据我之前的评论计算的字段。试试看

    此外,为了进一步调试,请尝试将日志节点添加到您希望查看的位置


    希望这有帮助!关于

    您的问题解决了吗?因为我想我有一个类似的,不生产(或接收任何输出)。不,不是真的。我最终使用了另一种方法,在发送到Telegraf之前,我计算了所需的值。您解决了问题吗?因为我想我有一个类似的,不生产(或接收任何输出)。不,不是真的。我最终使用了另一种方法,在发送到Telegraf之前,我计算了所需的值。