在 ThingsBoard 中實現 自定義動作(Custom Action)的 JavaScript 編程,主要通過“Custom action (with HTML template)”方式完成,適用于創建彈窗、編輯實體、控制設備等交互行為。
實現步驟(以添加設備或資產為例)
1、進入部件編輯模式 → 點擊“+”添加動作。
2、選擇動作來源(如:Widget header button 或 Action cell button)。
3、動作類型選擇:Custom action (with HTML template)
4、配置四個標簽頁:
Resources:引入外部 JS/CSS(可選);
CSS:自定義樣式;
HTML:彈窗或交互界面結構;
JavaScript:核心邏輯代碼。
?5、JavaScript 示例:添加設備/資產彈窗邏輯(精簡版)
var targetStateId = '';// 防止 entityLabel 為 nullif (entityLabel) { //entityLabel 是否包含“用電保護器” if (entityLabel.includes('用電保護器')) {targetStateId = 'state_air'; // 用電保護器} else if (entityLabel.includes('數字量')) {targetStateId = 'state_output'; // 數字量輸入輸出}else if (entityLabel.includes('DTU')) {targetStateId = 'state_dtu'; // DTU}}/* 2. 可選:額外參數,隨狀態一起帶過去 */const params = {entityId: entityId.id,entityName: entityName,entityLabel: entityLabel};/* 3. 獲取儀表盤所有已定義的狀態列表 *///const states = widgetContext.dashboardCtrl.dashboard.configuration.states || {};//alert(JSON.stringify(states, null, 2));if (targetStateId) {widgetContext.stateController.openState(targetStateId, params, true);} else {widgetContext.showErrorToast('狀態 "' + targetStateId + '" 未定義。');}
“自定義動作(Custom Action)” 的 JS 編程不是“炫技”,而是解決實際業務痛點的關鍵手段。它的好處和解決的問題可以總結為:
? 1.?解決“標準動作”無法滿足的業務需求
-
痛點:ThingsBoard 自帶的動作(如“打開儀表盤”、“打開詳情”)只能做固定的事情,無法處理復雜業務邏輯。
-
例子:
-
點擊按鈕后需要彈窗輸入設備參數(如 SIM 卡號、固件版本)再保存;
-
點擊“報警確認”按鈕時,需要調用外部 API(釘釘/微信)通知運維人員;
-
點擊“重啟設備”按鈕時,需要先彈窗確認,再下發 RPC 命令并記錄日志。
-
? 2.?解決“多步驟交互”問題
-
痛點:標準動作是“一步完成”,而實際業務需要“多步交互”(如表單驗證、異步加載數據)。
-
例子:
-
添加設備時,先選擇設備類型 → 動態加載對應的屬性模板 → 再填寫參數 → 最后保存;
-
點擊“批量下發配置”時,先選擇配置模板 → 再選擇目標設備 → 最后確認執行。
-
? 3.?解決“跨系統集成”問題
-
痛點:ThingsBoard 無法直接調用外部系統(如 ERP、CRM、工單系統)。
-
例子:
-
點擊“創建工單”按鈕時,調用 Jira/ServiceNow API 創建問題單;
-
點擊“同步庫存”按鈕時,調用 ERP 接口獲取最新庫存數據并更新 ThingsBoard 屬性。
-
? 4.?解決“用戶體驗差”問題
-
痛點:標準動作的彈窗樣式固定,無法根據品牌或業務需求定制。
-
例子:
-
自定義彈窗的標題、按鈕顏色、布局,使其符合公司 UI 規范;
-
在彈窗中嵌入圖表(如歷史數據趨勢)輔助用戶決策。
-
? 5.?解決“重復勞動”問題
-
痛點:多個儀表盤需要相同的“添加/編輯”功能,但標準動作無法復用。
-
例子:
-
封裝一個“通用設備添加彈窗”,所有儀表盤只需引用,無需重復造輪子;
-
將復雜邏輯(如設備注冊流程)封裝成可復用的自定義動作模板。
-
? 6.?解決“權限控制”問題
-
痛點:標準動作無法根據用戶角色動態控制按鈕顯隱。
-
例子:
-
只有“管理員”角色才能看到“刪除設備”按鈕;
-
只有“維修工程師”角色才能看到“遠程調試”按鈕。
-