物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

Thingsboard 仪表板的数据源筛选器,目前不支持复杂的数值计算或者多层嵌套筛选逻辑 ,只支持简单判断。为了使用复杂的计算逻辑, 我们有2种解决方案,

方案1:修改源码

这个比较复杂, 还要涉及编译源码等,暂不讨论。

方案2:写个外挂,修改Dashboard的Json文件,回传Json文件来实现。本篇就来讨论和实现这个方案。

我们用实例来说明, 譬如有一堆设备约百万级别的,在不停的发告警,我们需要实现的是,把最近1小时内的告警给筛选出来,放在仪表板内展示。

步骤1:规则链节点,记录告警生成的时间

在规则链中,在告警生成后,往设备的服务器属性中增加一个haveAlarm的属性,记录告警生成时间。

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

Script节点代码:

// 产生告警标识,写入服务器属性,为仪表板筛选出最近n小时内告警用
var Alarmed = Date.now();
return {
    msg: {
        haveAlarm: Alarmed
    },
    metadata: metadata,
    msgType: 'POST_ATTRIBUTES_REQUEST'
};
物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现
物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

步骤2:仪表板,建立筛选器做简单比较

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

数据源,创建一个筛选器

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

步骤3:筛选器选择简单比较

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

步骤4:导出仪表板Json文件

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

打开Json文件,应该是下面这个位置要修改

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现

修改为当前时间的1小时之前的UNIX时间戳。

步骤5:写一个Python,定时处理仪表板的Json文件,并回传系统

import json
import time
from datetime import datetime, timedelta
import requests

# ========= 配置项 ==========
TB_URL = 'http://your-thingsboard-url'  # 不带末尾斜杠
USERNAME = 'your_username'
PASSWORD = 'your_password'
DASHBOARD_ID = 'your_dashboard_id'  # 仪表盘 ID(可从 URL 或 API 查)
DASHBOARD_FILE = 'Alarm1h.json'
FILTER_ID = '3087e59a-54d4-dbde-de86-edf8a3b1ece3'
UPDATE_INTERVAL_SECONDS = 60
# ===========================

def get_token():
    url = f"{TB_URL}/api/auth/login"
    resp = requests.post(url, json={"username": USERNAME, "password": PASSWORD})
    if resp.status_code == 200:
        return resp.json()['token']
    else:
        raise Exception(f"获取 token 失败: {resp.text}")

def update_dashboard_json(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)

    # 计算当前时间前1小时(单位:毫秒)
    one_hour_ago_ms = int((datetime.utcnow() - timedelta(hours=1)).timestamp() * 1000)

    try:
        data['configuration']['filters'][FILTER_ID]['keyFilters'][0]['predicates'][0]['keyFilterPredicate']['value']['defaultValue'] = one_hour_ago_ms
        print(f"[{datetime.now().isoformat()}] 更新 defaultValue 为:{one_hour_ago_ms}")
    except KeyError:
        print("❌ 无法找到筛选器路径,请检查 JSON 结构")
        return None

    return data

def put_dashboard(token, dashboard_data):
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json'
    }

    # 确保带上 dashboard ID
    if 'id' not in dashboard_data:
        dashboard_data['id'] = {'id': DASHBOARD_ID, 'entityType': 'DASHBOARD'}

    url = f"{TB_URL}/api/dashboard"
    resp = requests.put(url, headers=headers, json=dashboard_data)
    if resp.status_code == 200:
        print("✅ Dashboard 更新成功")
    else:
        print(f"❌ 更新失败: {resp.status_code} - {resp.text}")

def loop_update():
    token = get_token()
    while True:
        dashboard_data = update_dashboard_json(DASHBOARD_FILE)
        if dashboard_data:
            put_dashboard(token, dashboard_data)
        time.sleep(UPDATE_INTERVAL_SECONDS)

if __name__ == '__main__':
    loop_update()

以上就完成了一个比较复杂的计算任务。剩余的问题是:

这个仪表板,只在打开时筛选出打开时1小时内的告警,并不会刷新,需要你手动刷新仪表板。(因为Dashboard在打开时已经加载,刷新需要重新加载)。

当然,您也可以用Java写个定时任务完成上述工作。

系列文章

物联网开源平台开发系列001 – 开源平台Thingsboard 介绍

物联网开源平台开发系列002 – Thingsboard 用户系统分析

物联网开源平台开发系列003 – Thingsboard OAuth2 – Google身份验证登陆

物联网开源平台开发系列004 – Thingsboard的实体、资产、设备一般说明及数据存储 – 陈皮王五de杂记

物联网开源平台开发系列005 – Thingsboard的API简述 – 陈皮王五de杂记

物联网开源平台开发系列006 – 在Thingsboard内创建一个设备 – 陈皮王五de杂记

物联网开源平台开发系列007 – Thingsboard的批量导入设备 – 陈皮王五de杂记

物联网开源平台开发系列008 – 浅谈物联网传输协议 – 陈皮王五de杂记

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮王五de杂记

物联网开源平台开发系列010 – Thingsboard规则引擎简介 – 陈皮王五de杂记

物联网开源平台开发系列011 – Thingsboard规则节点Originator Telemetry – 陈皮王五de杂记

物联网开源平台开发系列012 – Thingsboard 设备离线Alarm设置 – 陈皮王五de杂记

物联网开源平台开发系列013 – Thingsboard 遥测产生告警Alarm – 陈皮王五de杂记

物联网开源平台开发系列014 – Thingsboard遥测时序数据存储结构及分区策略 – 陈皮王五de杂记

物联网开源平台开发系列015 – Thingsboard postgresql数据库基本配置 – 陈皮王五de杂记

物联网开源平台开发系列016 – 再谈Thingsboard的设备注册 – 陈皮王五de杂记

物联网开源平台开发系列017 – Thingsboard的设备联动场景 – 陈皮王五de杂记

物联网开源平台开发系列018 – Thingsboard获取和处理天气信息 – 陈皮王五de杂记

物联网开源平台开发系列019 – Thingsboard设备数据传播给资产 – 陈皮王五de杂记

物联网开源平台开发系列020 – Thingsboard的实体视图Entity View – 陈皮王五de杂记

物联网开源平台开发系列021 – Thingsboard的网关gateway – 陈皮王五de杂记

物联网开源平台开发系列022 – 通过Thingsboard网关gateway动态创建设备 – 陈皮王五de杂记

物联网开源平台开发系列023 – Thingsboard设备列表仪表盘 – 陈皮王五de杂记

物联网开源平台开发系列024 – Thingsboard接入摄像头方案 – 陈皮王五de杂记

物联网开源平台开发系列025 – Thingsboard规则链节点的JS代码调试 – 陈皮王五de杂记

物联网开源平台开发系列026 – Thingsboard 仪表板Entities table 降序排序 – 陈皮王五de杂记

物联网开源平台开发系列027 – Thingsboard 仪表板数据筛选复杂的数值计算或者多层嵌套筛选逻辑实现 – 陈皮王五de杂记

物联网开源平台开发系列028 – Thingsboard 仪表板数据键的数据后处理功能处理复杂Json对象 – 陈皮王五de杂记

原创文章,作者:Gary,如若转载,请注明出处:https://www.cpw5.top/1508.html

淘宝小店:陈皮王五工作室

(0)
GaryGary
上一篇 2025-04-15 下午12:56
下一篇 2025-04-17 下午1:34

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(12条)