Skip to content

利用Thingsboard规则引擎(或Kafka流计算),根据电表上报的累计总电量,生成每天的耗电量统计

codeHui edited this page Mar 7, 2024 · 5 revisions

需求场景

IoT中的电表(水表等一样,就是单调增加的累计数据),会持续上报累计总耗电量,如何能展示每天的耗电量?

方案0: Kafka流计算

如有類似時間窗+統計的這類需求,大家可以尝试基于Kafka的流计算实现,官方有個demo https://thingsboard.io/docs/paas/samples/analytics/kafka-streams/#configure-kafka-integration

方案一(PE专业版):Thingsboard 规则引擎(rule engine)的实现方案

Thingsboard PE收费版本提供了封装好的统计节点 (如果大家用社区版就没这个节点) image

1,下图为第一个节点,代表了每天会将最大的值存为energyMax

image

2,下图为第二个节点,代表了每天会用今天的energyMax减去昨天的energyMax,其结果其实就是今天的耗电量

image

效果

image

扩展:展示每层,每栋楼的总耗电量

可以参考官方教程:https://thingsboard.io/docs/user-guide/rule-engine-2-0/tutorials/aggregate-incoming-data-stream/

配置(需要配置设备属于哪一层的关系)

image image

效果

image

方案二(PE专业版):方案一的后续优化方案

上面方案不可以实时显示当日的统计,下面新方案可以实时显示所有电表及其所属的楼层与建筑,当日和当月的实时统计 image image

image

方案三(免费社区版):基于自定义extension的方案

如果用社区版,可能没那么方便用我上面的方案。
其实可以基于extension(
https://thingsboard.io/docs/user-guide/contribution/rule-node-development
)去实现。因为extension允许我们自己写代码,所以利用extension可以实现很多不同我们高度自定义的需求

比如可以创建两个tenant,
设备数据上报到第一tenant,该tenant在extension去做自定义的统计,比如把昨天的最大值放到数据库,今天实时数据减去昨天最大数据,就是今天的实时统计数据,历史数据自己都可以利用extension去存储
然后第一个tenant把处理好的数据通过http(http(s)://$THINGSBOARD_HOST_NAME/api/v1/$ACCESS_TOKEN/telemetry )发给第二个tenant(分两个tenant的好处是分层思想,比如容易debug)
这个extension方案我就暂时不详细写了(时间关系),如果有人需要的话,可以留言,我可能就单独弄一遍文章详细说下

并发问题

如果一个building每次同时上报10个电表的数据,无疑需要考虑如何处理并发问题,用Thingsboard rule node,可以用SequentialQueue解决 image