2023年10月27日 星期五

Node-Red dashboard

 Node-Red dashboard

安裝dashboard

開啟設定,選擇控制面板, 點選安裝tab,輸入 dashboard關鍵詞,
找到 node-red-dashboard 的庫。點選安裝。

使用template

template的節點

節點的頭部有一個 類似html標籤的符合</>。表示這個節點可以寫自定義的html,也可以寫一些javascipt。

將節點拖放到編輯區域,雙擊節點進行編輯屬性。

在編輯之前我先給大家詳細介紹一下這個節點能做什麼。
改節點就像一個angular的元件一樣,你可以定義樣式style,也可以寫js,當然也可以寫html。 另外重要的一點是,改元件已經自動將payload注入其中了。你可以直接使用,此外它還提供了一個send方法,將頁面的變數傳送到flow中。
這就是為什麼 template節點擁有入口 和 出口。因為它接受入參,輸出結果。

需要注意的一點是,元件的內容必須要以angular的格式來寫。
如果你還不太熟悉angular。也沒關係。找到官方檔案看一遍就可以寫了。

顯示flow中的資料

template的作用大致就是上面說的那些,下面我們來真實地操作一些案例。

需求:現有一個溫度計,每2秒傳送一次檔案。要求在頁面上顯示出這個值。

針對這個需求我們使用三個節點來完成。
inject+function+template

  • inject節點來定時迴圈注入,
  • function節點用於生產亂數。
  • template 節點用於顯示payload中的資料。

template中的設定很簡單。
只有一句話
<div ng-bind-html="msg.payload"></div>

寫好後看一下效果

在看一個稍微複雜一點的例子

<div layout="row" layout-align="space-between">
  <p>The number is</p>
  <font color="{{((msg.payload || 0) % 2 === 0) ? 'green' : 'red'}}">
    {{(msg.payload || 0) % 2 === 0 ? 'even' : 'odd'}}
  </font>
</div>

使用 msg.payload 來控制字型顏色,並表明是偶數還是奇數

這裡寫的案例都是一些直接顯示msg中資料的例子。

看一個使用scope來監聽msg的例子

<div id="{{'my_'+$id}}" style="{{'color:'+theme.base_color}}">Some text</div>
<script>
(function(scope) {
  scope.$watch('msg', function(msg) {
    if (msg) {
      // Do something when msg arrives
      $("#my_"+scope.$id).html(msg.payload);
    }
  });
})(scope);
</script>

使用scope.$watch來監聽msg的改變, 改變後觸發回撥函數 將msg.payload填寫到頁面上。

到這裡講的就是使用template顯示msg中的資料的所有例子。

提交資料到flow中

有這樣一個需求,我們需要在頁面做一個表單,這個表單有點特殊。有自己的排版,樣式,和邏輯,用自帶的form節點無法實現。

於是我們就需要使用template來客製化一個表單。

比如我們要查詢一個裝置的用電量和記憶體使用情況。

這個複雜的例子晚點講,我們先來看一下,如何使用template將變數傳入到flow中

看下面這個例子

<script>
var value = "hello world";
// or overwrite value in your callback function ...
this.scope.action = function() { return value; }
</script>
<md-button ng-click="send({payload:action()})">
    Click me to send a hello world
</md-button>

頁面有一個按鈕,點選後觸發send函數。這個函數是沒有被定義的,其實這是該節點的內建函數。 該函數接受一個物件。 會將該物件傳送到flow中。

讓我們來測試一下。
節點的完整設定資料如下

[
    {
        "id": "db8e4c3f.dbfbc",
        "type": "tab",
        "label": "流程 1",
        "disabled": false,
        "info": ""
    },
    {
        "id": "368ada2b.e3eaa6",
        "type": "ui_template",
        "z": "db8e4c3f.dbfbc",
        "group": "b87ab62e.53b358",
        "name": "",
        "order": 1,
        "width": 0,
        "height": 0,
        "format": "<script>\nvar value = \"hello world\";\n// or overwrite value in your callback function ...\nthis.scope.action = function() { return value; }\n</script>\n<md-button ng-click=\"send({payload:action()})\">\n    Click me to send a hello world\n</md-button>",
        "storeOutMessages": true,
        "fwdInMessages": true,
        "resendOnRefresh": true,
        "templateScope": "local",
        "x": 680,
        "y": 620,
        "wires": [
            [
                "c268ee84.e5d9e"
            ]
        ]
    },
    {
        "id": "4423dbcc.dbfcd4",
        "type": "inject",
        "z": "db8e4c3f.dbfbc",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "2",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "num",
        "x": 230,
        "y": 620,
        "wires": [
            [
                "a9b78dc0.d4e02"
            ]
        ]
    },
    {
        "id": "a9b78dc0.d4e02",
        "type": "function",
        "z": "db8e4c3f.dbfbc",
        "name": "",
        "func": "msg.payload = Math.floor(Math.random()*100)\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 460,
        "y": 620,
        "wires": [
            [
                "368ada2b.e3eaa6"
            ]
        ]
    },
    {
        "id": "c268ee84.e5d9e",
        "type": "debug",
        "z": "db8e4c3f.dbfbc",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 920,
        "y": 620,
        "wires": []
    },
    {
        "id": "b87ab62e.53b358",
        "type": "ui_group",
        "name": "Default1",
        "tab": "245d6810.4fdae8",
        "order": 1,
        "disp": true,
        "width": 20,
        "collapse": false
    },
    {
        "id": "245d6810.4fdae8",
        "type": "ui_tab",
        "name": "Tab 2",
        "icon": "dashboard",
        "order": 2,
        "disabled": false,
        "hidden": false
    }
]

開啟dashboard的頁面 看到只有一個按鈕

點選它

可以看到已經有值被注入到msg中了


沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...