ต้องรู้อะไรมาก่อน ???
- JavaScript เบื้องต้น + JSON
- Node-red เบื้องต้น
Function คืออะไร ???
Function เป็น node ประเภท function ใน Node-red สามารถใส่ JavaScript เพื่อเล่นกับ msg Object ได้ function node จะรับค่าเข้ามาเป็น msg Object และส่งค่าออกไปเป็น msg Object หรือ null ได้
msg Object ที่รับเข้าไปจะต้องมี property payload ( สำคัญมาก ) หน้าตาของ msg Object จะเป็น แบบนี้
topic : เราจะเอาไว้กำหนด หัวข้อเพื่อทำ Function ที่มี Output หลายตัว
payload : ข้อมูลที่ใช้ส่งหากัน ภายใจ Node-red
ลาก function node มาวางบน Flow แล้วดับเบิลคลิ๊ก
Name : กำหนดชื่อให้กับ node นี้
Function : ส่วนที่จะใส่ JavaScript ลงไปเพื่อทำอะไรก็ตามแต่ใจนึก
เรามาเจาะลึกในส่วนของ Function กันเนื่องจาก function node จะรับข้อมูลเข้ามาเป็น msg Object เราจะมาอธิบายการใช้งาน JavaScript เพื่อเข้าถึง msg Object
เข้าถึง Payload ใน msg Object
var payload=msg.payload;
เปลี่ยนแปลงค่าของ payload
โดยที่ new_payload เป็นข้อมูลใหม่ที่เราต้องการกำนดเป็นอะไรก็ได้เช่น int, float, char, object
msg.payload=new_payload;
เข้าถึง Topic ใน msg Object
var topic = msg.topic;
เปลี่ยนแปลงค่าของ Topic
โดยที่ new_topicload เป็นข้อมูลใหม่ที่เราต้องการกำนดมักกำหนดเป็น คำหรือตัวอักษร
msg.topic = topic;
เพิ่ม property ใหม่ให้ msg Object ได้
var newvalue;
msg.newproperty = newvalue;
ลองใช้งาน Function กัน
ลาก node ตามในรูปมาวางบน Flow
เปลี่ยนค่าที่ส่งออกมาจาก inject เป็น String คำว่า “Lower case” และ Topic เป็น “Lower Case” ดังนี้
เข้าไปที่ function เราจะให้ function รับ payload และ topic มา หลังจากนั่นให้เปลี่ยนเป็น ตัวใหญ่ก่อนส่งออกไป ด้วย msg Object
เสร็จแล้วกด ที่ inject จากนั่นมาดูผลกันที่ แท็บ debug เราจะเห็นว่า payload กับ topic เปลี่ยนเป็นตัวใหญ่แล้ว
ทำให้ Function มี 2 output
เข้ามาดูในหน้า setting ของ function กันอีกครั้งข้างล่างสุด เราจะเห็นว่ามี สิ่งที่เรียกว่า output และเราสามารถเลือกให้มันมีมากกว่า 1 output ได้
การที่เราจะ มีมากกว่า 1 output ทำได้โดยการที่เรา return ค่าออกไปเป็น Array ที่มี msg Object อยู่ภายใน แบบนี้ ตามโค้ดด้านล่างหมายความว่า output 1 จะได้รับ msg1 และ output2 จะได้รับ msg2
return [msg1,msg2];
ลองทำกันดีกว่าเริ่มจาก ลาก node แบบในรูปลงมาบน Flow
ตั้งค่าให้ inject ตัวแรกส่งข้อมูล Hello test1 และ Topic เป็น test1
ตั้งค่าให้ inject ตัวแรกส่งข้อมูล Hello test2 และ Topic เป็น test2
ต่อมาเข้าไปที่ function และเพิ่มโค้ดตามนี้เข้าไป เพื่อแยก output ออกมาตาม Topic ที่ส่งเข้าไป โดยให้ test1 มี output เป็น msg1 และ test2 มี output เป็น msg2
Function 1 output แต่มี หลาย msg Object
ในการ output หลาย msg Object เราต้องทำให้ function return แบบมาเป็น Array ลักษณะแบบนี้
return [msg_object_array];
ลาก node แบบในรูปมาวางบน Flow
กำหนดให้ inject ส่งข้อมูลมาเป็น String คำว่า Test String และใน function เราจะกำนหนดการทำงานให้ เพิ่มเลขต่อท้าย payload และสร้างเป็น msg Object ใหม่จำนวน 3 Objectตามตัวอย่างด้านล่าง
กดที่ inject และรอดูผลลัพธ์ได้ที่ แท็บ debug จะเห็นแบบนี้
บันทึก Function ไว้ใช้ซ้ำได้ด้วยนะ
เข้ามาใน function node เราจะเห็น ไอคอนรูปหนังสือที่ด้านขวาของ name กดเข้าไปดูเราจะเห็นว่าทำได้ 2 อย่างคือ Open Library และ Save to Library
Open Library : เรียกดูและใช้ function ที่เคยบันทึกไว้
Save to Library : บันทึก Function ปัจจุบันลงใน Library
จบไปแล้วกับการสอนใช้ Function node ถือว่าเป็น node ที่สำคัญมากในการใช้งาน Node-red เพราะมันจะทำให้ตัว Node-red มีการทำงานที่ยึดหยุ่นมากขึ้น ยังไงก็ลองไปใช้กันดูนะครับ