「智慧家居」智慧家居自動化平臺nodered基礎教程

在nodered中預設節點大概分為:共通節點、功能節點、網路節點、序列節點、解析節點、儲存節點、輸入節點。

「智慧家居」智慧家居自動化平臺nodered基礎教程

仔細觀察各個節點,你會發現:有些節點只有輸入,有些節點只有輸出,有一些節點既有輸入也有輸出,還有一些節點既沒有輸入也沒有輸出。

PS:每一個節點的配置區域底部都有一個有效單選,可以將該節點設定為失效或有效。

我們簡單的過一遍,先從共通類別開始,該模組共有8個節點分別是

inject 手動或定期地將訊息注入流中;

debug 列印流中的資料;

complete 當另一個節點完成對訊息的處理時觸發流;

catch 捕獲在同一個流中的所有或指定節點引發的錯誤;

status 獲取在同一流所有節點或指定節點的狀態訊息;

link in 在流之間建立虛擬連線;

link out 在流之間建立虛擬連線;

comment 可用於向流添加註釋的節點。

「智慧家居」智慧家居自動化平臺nodered基礎教程

我們深入瞭解下各節點的使用方法:

Inject:

該節點的作用是手動或定期得將訊息注入流中,可以是文字,變數,表示式,時間戳等。該節點前面沒有可以流入的節點,訊息體只能往後流。

「智慧家居」智慧家居自動化平臺nodered基礎教程

PS:點選節點的前部分可以觸發該節點,也可以設定該節點為迴圈觸發。該節點單獨使用沒有任何意義,我可以和debug節點放到一起來進行演示。編寫一個inject節點和debug節點,將它們連線在首尾相連。inject在前,debug在後,部署之後,點選inject節點的頭部,就能在除錯面板裡看到被注入到訊息體的內容了

「智慧家居」智慧家居自動化平臺nodered基礎教程

debug

:該節點用於除錯流中的訊息體,只能用於列印,無法看到真正的堆疊,使用方法是,將該節點連線到一個可輸出的節點後,配置要列印的引數,以msg開頭,預設列印msg。payload。也可以列印訊息體的全部內容,只需要在配置該節點時選擇,與除錯輸入相同。此外還要注意要勾選控制檯選項,只有這樣才能在除錯面板打印出訊息體。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Complete

:當另一個節點完成對訊息的處理時會觸發該節點。可以配置用於監控那些節點。沒有輸入,只需要將該節點拖拽到流中即可,不需要與現有流中的其他節點連線。比如我們要在傳送完郵件後觸發一些邏輯,就可以使用這個節點來監聽傳送郵件的節點。並不是所有的節點都可以被監聽。如下圖我們配置complete監聽inject節點的完成,觸發後在debug節點列印由complete觸發的除錯流程。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Catch:

是為了處理流中報錯的節點,有時程式並不像我們想的那樣健壯,也會有很多意外情況發生,這時候我們就可以使用catch節點來監聽這些節點的錯誤資訊,進行上報,或者給出友好提示。可以配置捕獲那些節點的錯誤資訊。 輸出的資訊為

error物件

型別

描述

error。message

字串

錯誤訊息。

error。source。id

字串

引發錯誤的節點的ID。

error。source。type

字串

引發錯誤的節點的型別。

error。source。name

字串

引發錯誤的節點的名稱。(如果已設定)

「智慧家居」智慧家居自動化平臺nodered基礎教程

Status:

是用於監控某些節點的狀態變化,比如http節點,tcp,udp節點,只有節點存在狀態的改變,被status節點監聽之後才會被觸發,而想inject,debug節點是不存在狀態改變的,所以即使被status監聽了也不會被觸發。

「智慧家居」智慧家居自動化平臺nodered基礎教程

「智慧家居」智慧家居自動化平臺nodered基礎教程

該節點的輸出資訊為

status訊息體

型別

描述

status。text

字串

狀態文字。

status。source。type

字串

報告狀態的節點的型別。

status。source。id

字串

報告狀態的節點的ID。

status。source。name

字串

報告狀態的節點的名稱(如果已設定)。

link in:

是用於在流之間建立連線,是為了實現將另一個流流入當前的流中,即設定當前流的上游。如果一個流存在link in節點,那麼該流會被流入,對擁有link out的流可見,也可以配置包含link out節點的流link in與link out必須搭配使用,後者為前者的上級。

link out:

將當前流流出,能夠配置下一級的流,或節點。只能配置含有link in的節點作為下一級或下游。用於二個流之間的通訊。

「智慧家居」智慧家居自動化平臺nodered基礎教程

「智慧家居」智慧家居自動化平臺nodered基礎教程

Commont:

用於備註當前流。相當於程式碼中的註釋。不會被執行。沒有輸入也沒有輸出。

函式類別大概有function、switch、change、range、template、delay、trigger、exec、rbe等等節點。

Function:

可以用於操作訊息體。可以透過該節點,修改或驗證訊息體中的資料,在編寫函式中,msg物件是函式體中可以直接操作的資料, 你可以這樣msg。name=‘fizz’將name屬性定義為fizz,如果之前已經有了name屬性,這句話則會變成修改。最後將msg返回到下一節點return msg。

「智慧家居」智慧家居自動化平臺nodered基礎教程

PS:一個函式節點可以設定輸出次數,在節點編輯區域的底部可以設定,如果設定n次,則該節點的出口則會有n個。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Switch:

是用於處理邏輯分支,比如判斷一個變數,小於x,走第一條線,等於x走第二條線,大於x走第三條線,使用此節點首先要有一個變數用於判斷,可以是訊息體中的變數,也可以是流中的變數,也可以是環境變數。也可以是一個表示式 而邏輯關係也有很多種,等於、大於、小於、包含、為真、為假……

「智慧家居」智慧家居自動化平臺nodered基礎教程

PS:舉例說明,判斷年齡age,如果大於0小於18則列印青少年,如果大於18小於30則列印青年,大於30小於60則列印中年

switch配置

「智慧家居」智慧家居自動化平臺nodered基礎教程

流配置

「智慧家居」智慧家居自動化平臺nodered基礎教程

該流的json配置為

[{“id”: “adbf762d。d91148”,“type”: “tab”,“label”: “流程 1”,“disabled”: false,“info”: “”},{“id”: “77961796。2ab1a8”,“type”: “switch”,“z”: “adbf762d。d91148”,“name”: “age邏輯分支”,“property”: “age”,“propertyType”: “msg”,“rules”: [{“t”: “btwn”,“v”: “0”,“vt”: “num”,“v2”: “17”,“v2t”: “num”},{“t”: “btwn”,“v”: “18”,“vt”: “num”,“v2”: “30”,“v2t”: “num”},{“t”: “btwn”,“v”: “31”,“vt”: “num”,“v2”: “59”,“v2t”: “num”}],“checkall”: “false”,“repair”: false,“outputs”: 3,“x”: 610,“y”: 340,“wires”: [[“e93cd13a。4fc8e”],[“def579e4。e9feb8”],[“ae7e827b。fbc1b”]]},{“id”: “8dcde4d8。9befa8”,“type”: “inject”,“z”: “adbf762d。d91148”,“name”: “注入年齡”,“props”: [{“p”: “age”,“v”: “15”,“vt”: “num”}],“repeat”: “”,“crontab”: “”,“once”: false,“onceDelay”: 0。1,“topic”: “”,“x”: 160,“y”: 340,“wires”: [[“c68b2fe。99a75d”]]},{“id”: “c68b2fe。99a75d”,“type”: “function”,“z”: “adbf762d。d91148”,“name”: “改變年齡”,“func”: “msg。age = 37\nreturn msg;”,“outputs”: 1,“noerr”: 0,“initialize”: “”,“finalize”: “”,“x”: 360,“y”: 340,“wires”: [[“77961796。2ab1a8”]]},{“id”: “ae855879。0d1968”,“type”: “debug”,“z”: “adbf762d。d91148”,“name”: “”,“active”: true,“tosidebar”: true,“console”: true,“tostatus”: false,“complete”: “ageRange”,“targetType”: “msg”,“statusVal”: “”,“statusType”: “auto”,“x”: 1150,“y”: 340,“wires”: []},{“id”: “e93cd13a。4fc8e”,“type”: “function”,“z”: “adbf762d。d91148”,“name”: “青少年”,“func”: “msg。ageRange = ‘青少年’\nreturn msg;”,“outputs”: 1,“noerr”: 0,“initialize”: “”,“finalize”: “”,“x”: 890,“y”: 200,“wires”: [[“ae855879。0d1968”]]},{“id”: “def579e4。e9feb8”,“type”: “function”,“z”: “adbf762d。d91148”,“name”: “青年”,“func”: “msg。ageRange = ‘青年’\nreturn msg;”,“outputs”: 1,“noerr”: 0,“initialize”: “”,“finalize”: “”,“x”: 890,“y”: 340,“wires”: [[“ae855879。0d1968”]]},{“id”: “ae7e827b。fbc1b”,“type”: “function”,“z”: “adbf762d。d91148”,“name”: “中年”,“func”: “msg。ageRange = ‘中年’\nreturn msg;”,“outputs”: 1,“noerr”: 0,“initialize”: “”,“finalize”: “”,“x”: 890,“y”: 480,“wires”: [[“ae855879。0d1968”]]}]

PS:如果要使用該流的話,可以點選右上角的選單按鈕,選擇匯入,將json內容複製到剪貼簿中,點選匯入。

Change:

是用於操作訊息體中某些變數,比如講msg。payload的值修改為Mizz,搜尋msg。payload的值將其中的z替換為x 也可以刪除一個值,或者新增一個值。

如下面

「智慧家居」智慧家居自動化平臺nodered基礎教程

Range:

可以將一個原有的屬性透過一種線性演算法映射出新的值,如規定,原有的值區域在0-10,對映後的區域是0-100,那麼就是講原有的值乘以10,其實就是設計一個線性的函式,只不過不是直接寫,而是規定二個定義域來展示。

來看下官方的解釋 該節點將線性縮放所接收到的數值。在預設情況下,結果不限於節點中定義的範圍。

縮放並限制到目標範圍表示結果永遠不會超出目標範圍內指定的範圍。

在目標範圍內縮放並摺疊表示結果將會被限制(摺疊)在目標範圍內。

例如,輸入0-10對映到0-100。

模式

輸入

輸出

scale

12

120

limit

12

100

wrap

12

20

示例,將0-5 對映成0-100,

「智慧家居」智慧家居自動化平臺nodered基礎教程

Template:

可用於將一個或多個變數填充到一個文字中,首先是設定好一個模板,在模板中不確定的文字使用一個變數作為佔位符,如 ${name}同學的成績是${scoce}分。

PS:我們使用inject,template,debug三個節點來演示一下首先在inject節點注入msg。payload = { “name”: “Fizz”, “score”: 90},然後在template節點,使用mustache語法,將msg。payload的值對映成模板{{payload。name}}同學的分數為{{payload。score}}!最後我們再列印msg物件

最後演示結果是

「智慧家居」智慧家居自動化平臺nodered基礎教程

流的json資料是

[{“id”: “36273aee。b79d06”,“type”: “tab”,“label”: “流程 6”,“disabled”: false,“info”: “”},{“id”: “282daeb。736bb52”,“type”: “template”,“z”: “36273aee。b79d06”,“name”: “同學分數模板”,“field”: “payload”,“fieldType”: “msg”,“format”: “handlebars”,“syntax”: “mustache”,“template”: “\n{{payload。name}}同學的分數為{{payload。score}}!”,“output”: “str”,“x”: 480,“y”: 420,“wires”: [[“be5d4acc。2292f8”]]},{“id”: “c49cfc3。76723”,“type”: “inject”,“z”: “36273aee。b79d06”,“name”: “學生成績”,“props”: [{“p”: “payload”}],“repeat”: “”,“crontab”: “”,“once”: false,“onceDelay”: 0。1,“topic”: “”,“payload”: “{\”name\“:\”小明\“,\”score\“:90}”,“payloadType”: “json”,“x”: 230,“y”: 420,“wires”: [[“282daeb。736bb52”]]},{“id”: “be5d4acc。2292f8”,“type”: “debug”,“z”: “36273aee。b79d06”,“name”: “”,“active”: true,“tosidebar”: true,“console”: true,“tostatus”: false,“complete”: “true”,“targetType”: “full”,“statusVal”: “”,“statusType”: “auto”,“x”: 740,“y”: 420,“wires”: []}]

Delay:

可以對節點的訊息進行延遲傳送或限制。應用場景是,如果併發量大的話,伺服器處理不過來,就可以使用該節點來限制一定時間內 透過允許透過多少條,你也可以在流中重置延遲的時間,可以很好低動態調整訊息的處理權重,有了這個節點可以很容易就復現一些耗時任務的中間狀態的變化。 延遲有二種一種是延遲每一條訊息,第二種是限制資訊的速率。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Trigger:

觸發後,將會發送一條訊息。如果被拓展或重置,則可以選擇傳送第二條訊息。

該節點可用於在流中建立一個超時。 預設情況下,當它收到一條訊息時,它將傳送一條帶有1的有效荷載的訊息。然後它將等待250毫秒,再發送第二條訊息,其有效荷載為0。這可以用於使連線到Raspberry Pi GPIO引腳的LED閃爍等例子上。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Exec:

執行系統命令並返回其輸出。

可以將節點配置為等待命令完成,或者在命令生成時傳送其輸出。

執行的命令可以在節點中配置,也可以由收到的訊息提供。

輸入

payload 字串 如果這樣配置,則將被附加到執行命令中。

kill 字串 指定傳送到現有的exec節點程序的kill訊號型別。

pid 數值|字串 要殺死的現有exec節點程序的程序ID

輸出

payload字串 命令的標準輸出。

rcobject (僅執行模式)一個返回程式碼物件的副本(在埠3上也可用 )

rbe:

一個提供異常報告(RBE)和死區功能的節點。除非傳入值發生更改-RBE模式,或更改幅度超過一定量(絕對值或百分比)-帶隙模式,否則該節點將阻塞。僅在資料已更改的情況下傳遞資料。

這在每個msg。topic基礎上起作用。這意味著單個rbe節點可以同時處理多個主題。

序列類別有以下4個節點:split、joib、sort、batch,讓下邊來一個個瞭解。

Split:

可以將一msg。payload基於一個字串進行分割,比如有一個字串msg。payload = ‘1;2;3;4;5’呼叫split節點後,使用;來分割msg。payload,那麼split的下一級節點將會被觸發5次

「智慧家居」智慧家居自動化平臺nodered基礎教程

此節點也可以用於處理二進位制,使用長度分割。

關於這個節點詳細的解釋

輸入

payload

節點的行為由msg。payload的型別決定:

字串/buffer - 使用指定的字元(預設值:\n),緩衝區序列或固定長度將訊息拆分。

陣列 - 訊息被拆分為單個數組元素或固定長度的陣列。

object - 將為物件的每個鍵/值對傳送一條訊息。

輸出 partsobject 此屬性包含有關如何將訊息與原始訊息分開的資訊。如果傳遞給join節點,則可以將序列重組為單個訊息。該屬性具有以下屬性:

id - 一組訊息的識別符號

index - 組中的位置

count - 如果已知組中的郵件總數。請參閱下面的“流媒體模式”

type - 訊息的型別-字串/陣列/物件/buffer

ch - 對於字串或buffer,用於將訊息拆分為字串或位元組陣列的資料

key - 對於物件,建立此訊息的屬性的鍵。可以將節點配置為也將此值複製到另一個訊息屬性,例如msg。topic

len - 使用固定長度值拆分訊息時,每段子訊息的長度

在使用join節點將序列重新組合為單個訊息之前,推薦使用此節點來輕鬆地建立跨訊息序列,執行通用操作的流。 它使用msg。parts屬性跟蹤序列的各個部分。

流媒體模式

該節點還可以用於重排訊息流。例如,傳送換行符終止命令的序列裝置可能會傳遞一條訊息,並在其末尾帶有部分命令。 在“流模式”下,此節點將拆分一條訊息併發送每個完整的段。如果末尾有部分片段,則該節點將保留該片段,並將其新增到收到的下一條訊息之前。

在此模式下執行時,該節點將不會設定msg。parts。count屬性,因為流中期望的訊息數還是未知的。這意味著它不能在自動模式下與join節點一起使用。

Join:

將訊息序列合併為一條訊息。。此模式假定此節點與split相連, 或者接收到的訊息有正確配置的msg。parts屬性。共有三種模式:

自動模式 與split節點配對時,它將自動將已被拆分的訊息進行合併。

手動模式 手動地以各種方式合併訊息序列。

列聚合模式 對訊息列中的所有訊息應用表示式以將其簡化為單個訊息。

輸入 parts 使用自動模式時,所有的訊息都應包含此屬性。split節點會生成此屬性,但也可以手動進行設定。該屬性具有以下屬性:

id - 訊息組的識別符號

index - 組中的位置

count - 如果已知組中的郵件總數。請參閱下面的“流媒體模式”

type - 訊息的型別-字串/陣列/物件/buffer

ch - 對於字串或buffer,用於將訊息拆分為字串或位元組陣列的資料

key - 對於物件,建立此訊息的屬性的鍵。可以將節點配置為也將此值複製到另一個訊息屬性,例如msg。topic/li>

len - 使用固定長度值拆分訊息時,每段子訊息的長度

complete 如果設定,則節點將以其當前狀態傳送其輸出訊息

詳細

自動模式 自動模式使用傳入訊息的parts屬性來確定應如何連線序列。這使它可以自動逆轉split節點的操作。

手動模式 設定為以手動模式時,該節點能以各種不同的方法來處理訊息:

「智慧家居」智慧家居自動化平臺nodered基礎教程

字串或緩衝區-透過將每條訊息的選定屬性與指定的連線字元或緩衝區連線起來。 陣列 - 透過將每個選定的屬性或整個訊息新增到輸出陣列 鍵/值物件 - 透過使用每個訊息的屬性來確定儲存所需值的鍵。 merged object - 透過將每個訊息的屬性合併到一個物件下。 輸出訊息的其他屬性都取自發送結果前的最後一條訊息。

可以用計數來確定應接收多少條訊息來進行合併。對於物件輸出,可以設定為達到此計數後的每條後續訊息都發送一條輸出。

可以用超時來設定傳送新訊息之前的等待時間。

如果收到設定了msg。complete屬性的訊息時傳送輸出訊息並重置訊息列數。

如果收到設定了msg。reset屬性的訊息,則部分收到的訊息將被刪除而不傳送,同時重置訊息列數。

列聚合模式 選擇列聚合模式時,將表示式應用於組成訊息列的每條訊息,並使用聚合值組成一條訊息。

Sort:

對訊息屬性或訊息序列進行排序的函式。

當配置為對訊息屬性進行排序時,節點將對指定訊息屬性所指向的陣列資料進行排序。

當配置為對訊息序列排序時,它將對訊息重新排序。

排序順序可以是:

升序

降序 對於數字,可以透過複選框指定數字順序。

排序鍵可以是元素值,也可以是JSONata表示式來對屬性值進行排序,還可以是message屬性或JSONata表示式來對訊息序列進行排序。

在對訊息序列進行排序時,排序節點依賴於接收到的訊息來設定msg。parts。拆分節點將生成此屬性,但也可以手動建立。它具有以下屬性:

id - 訊息組的識別符號

index - 組中的位置

count - 群組中的郵件總數 注意:在此節點的處理中,訊息在內部儲存。透過指定要累積的最大訊息數,可以防止意外的高記憶體使用。預設設定是不限制訊息數量。

nodeMessageBufferMaxLength屬性在

settings.js

中設定。

「智慧家居」智慧家居自動化平臺nodered基礎教程

Batch:

根據各種規則建立訊息序列。詳細有三種建立訊息序列的模式:

訊息數 將訊息分組為給定長度的序列。 overlap(重疊)選項指定在一個序列的末尾應重複多少訊息。

時間間隔 對在指定時間間隔內到達的郵件進行分組。如果在該時間間隔內沒有訊息到達,則該節點可以選擇傳送空訊息。

串聯序列 透過串聯輸入序列來建立訊息序列。每條訊息必須具有msg。topic屬性和標識其序列的msg。parts屬性。該節點配置有topic值列表,以標識所連線的順序序列。儲存訊息該節點將在內部緩衝訊息,以便跨序列工作。執行時設定nodeMessageBufferMaxLength可用於限制節點將快取多少訊息。

PS:nodered的基礎教程太長了,後邊慢慢講了。

—— —— —— —— —— —— END —— —— —— —— —— ——

我是小白,智慧家居愛好者、一卡通行業從業者、曾經的建築智慧化從業者。致力為開源智慧家居平臺添磚加瓦。