วันศุกร์ที่ 4 กันยายน พ.ศ. 2558

Node-RED – มี IoT Cloud ในบ้าน ก็สะดวกดี


เปิดตัว Node-Red Siam มาได้ไม่กี่วัน (เปิดตัววันที่ 3 ก.ย.)  ก็ได้มีการแลกเปลี่ยนกัน ส่วนใหญ่จะถามหา node widget ของอุปกรณ์แต่ละตัว ตอนที่ลงเรื่องเชื่อมต่อกับ tweeter ก็ถามว่ามี facebook ด้วยหรือป่าว
สำหรับด้าน hardware ผมได้โพสต์ในเรื่องการเชื่อมต่อ NodeRED กับ Arduino ไปแล้ว ลองย้อนไปอ่านดูได้ครับ แต่ด้วยระยะนี้ ESP8266 กำลังมาแรง ก็มีถามหา node widget ของตัวนี้มาด้วยเช่นกัน
สำหรับ ESP8266 โดยความเห็นส่วนตัวแล้ว จะมีใครเห็นด้วยหรือไม่ก็แลกเปลี่ยนกันได้ครับ สิ่งที่ผมมอง ESP8266 ก็คือ IoT devices ตัวหนึ่ง ที่อาจจะเอาไว้ทำหน้าที่เป็น input หรือ output หรือแสดงค่าหรือปรับเปลี่ยนค่าทาง analog เช่น อุณหภูมิ ความชื้น ความสว่าง การที่จะให้มันทำงานทุกอย่างในตัวเดียว อาจจะให้มันแบกภาระเกินตัว คือให้มันเป็นทั้ง server เป็นทั้ง IO เผลอๆให้มันเป็น datalogger ไปด้วย
การที่ให้ ESP8266 ทำงานทุกอย่างทั้งหมด ทำได้แน่นอน สิ่งที่ตามมาก็คือ ขาดความยืดหยุ่น จำเป็นต้องเรียนรู้ทุกอย่างถึงแกนของตัวมัน เพื่อให้มันสามารถที่จะทำงานให้เราได้และมีความน่าเชื่อถือ (ความเสถียร) สำหรับผู้พัฒนาเองจะติดหนึบอยู่กับการทำ programming ชิ้นงานที่ออกมาจะใช้ได้เฉพาะงานนั้น การปรับให้ทำงานอิ่นก็จะต้องลงมือแก้ไขโปรแกรมกัน ทำให้การส่งชิ้นงานออกตลาดอาจช้ากว่าความต้องการ
ถ้าเราทำการแยกผลิตภัณฑ์ออกเป็นหมวดหมู่ แล้วสร้างอุปกรณ์ในแต่ละหมวดมู่ โดยอุปกรณ์แต่ละตัวจะเป็น generic devices สามารถปรับตั้งค่ามันได้ง่ายๆ ด้วยการเชื่อมต่อตัวมันกับเครื่องมือปรับตั้งค่า เมื่อจบกระบวนการ generic devices ตัวนั้นก็จะกลายเป็น specific devices ไปทำหน้าที่อย่างที่เราต้องการให้มันเป็น ไปเป็นหมอ เป็นทหาร เป็นตำรวจ อะไรก็ว่ากันไป นึกไปแล้วก็เหมือนกับหนังเรื่อง iRobot ที่หุ่นแต่ละตัวมีหน้าตาเหมือนกันหมด แต่บทบาทหรือหน้าที่ต่างกัน
หลายคนคงคิดว่า ผมกำลังพูดอะไร คือผมกำลังพูดถึงแนวคิดหรือ concept ของ IoT ที่จะไม่ผูกติดอะไรเอาไว้ในจุดๆเดียว สอดคล้องกับที่ทั่วโลกกำลังทำ utility หรือ service ต่างๆ ให้เราได้ใช้ ยกตัวอย่างการทำงานกับเอกสารหรือข้อมูล ยุคนี้เราไม่จำเป็นต้องเอาโน๊ตบุ๊กที่ใช้งานในออฟฟิสติดตัวเราไปทุกที่ เพราะเราสามารถใช้คอมพิวเตอร์ที่ไหนก็ได้ เปิด web application (word, excel) จากนั้นก็ล๊อกอินเพื่อเปิดฐานข้อมูลของเราที่ฝากไว้กับ cloud data server ก็สามารถทำงานได้แล้วจากทุกๆที่
ทีนี้ลองย้อนมาดูในส่วนของ ESP8266 ถ้าเราต้องการให้มันเป็น generic devices เราก็ควรจะต้องทำอะไรบ้าง เพื่อให้มันทำงานได้ หลังจากถูกแปลงร่างเป็น specific devices
จากประสบการณ์ที่ได้ติดตามอ่านโพสต์ต่างๆในเฟสบุ๊กของหลายกลุ่ม จะติดปัญหาในเรื่องของหมายเลข IP เพราะตัวเลขนี้ถ้าตั้งเป็น static ก็อาจจะไม่เกิดความยืดหยุ่น แต่ถ้ารับค่าจาก DHCP server ก็จะไม่รู้ว่าตัวเองได้รับหมายเลขอะไรมา ก็เลยมีการต่อจอ OLED มาเพื่อให้แสดงหมายเลข IP หรือต้องไปกำหนดค่าใน WiFi server เพื่อล๊อกค่า IP ให้กับ MAC address ของ ESP8266 ตัวนั้น ถ้ามีตัวเดียว หรือสองตัวก็คงไม่ยากนัก แต่ถ้าเป็น Home automation อย่างน้อยก็คงเป็นสิบตัวขึ้นไป ตัวบอร์ดขนาดเล็กๆของ ESP8266 ก็เลยต้องอ้วนขึ้น เพราะมีจอ OLED มาต่อด้วย เนื่องจากไม่ต่อก็ไม่รู้จะสั่งงานไปที่ IP ไหน
สมมุติว่าเรามี generic devices แบบหนึ่ง อยู่ในหมวด input แล้วเราตั้งชื่อให้มันว่า IN และเสริม Dip switch ปรับตั้งหมายเลขตั้งแต่ 0-15 ต้องการให้ตัวนี้ชื่อ IN3 ก็บิด dip switch ไปที่เลข 3 รีเซทอุปกรณ์ 1 ครั้ง ตอนนี้มันก็จะรู้ว่ามันชื่อ IN3 ถามว่าแล้วการจะส่งข้อมูลหละ IN3 ก็จะเริ่มทำงานแล้วส่งข้อมูลไปที่ cloud data server ตามคาบเวลาที่กำหนด ในนามของ IN3 สำหรับในส่วนของ dashboard ที่เชื่อมต่อกับ cloud data server ก็จะทำการอ่านข้อมูลของ IN3 แล้วทำการแสดงผล
จะเห็นได้ว่าเราไม่จำเป็นต้องรู้ว่า IN3 มีหมายเลข IP เป็นอะไร รู้แต่ว่าอุปกรณ์ตัวนั้นชื่ออะไร เราก็สามารถบริหารข้อมูลของอุปกรณ์ตัวนั้นได้แล้ว
ทีนี้การจะตั้งชื่อให้กี่ตัวก็แค่เพียงบิด dip switch ไปที่ตำแหน่งนั้น ซึ่งทำได้ถึง 16 ตัว เป็น output devices ได้อีก 16 ตัว บ้านขนาดกลางๆ 1 หลังก็น่าจะเพียงพอ
การทำผลิตภัณฑ์ในรูปแบบนี้จะลดความยุ่งยากไปได้มาก ได้เวลาไปพัฒนาผลิตภัณฑ์อืนๆ อีกมากโข
มาถึงจุดนี้ น่าจะมองเห็นภาพที่ฉายไปได้พอสมควร คำถามต่อไปก็คือ แล้ว cloud data server หละ ในโพสต์ก่อนหน้า ได้แนะนำไป เช่น บริการของ Thingspeak หรือตัวที่ผมนิยมคือ Dweet.io ก็ยังมีของ Sparkfun ในโครงการ Phant
การใช้ server ภายนอกที่น่าเชื่อถือ ก็ยังมีโอกาสที่ server ล่ม เราคงต้องพบปัญหาเปิดไฟ ปิดไฟไม่ได้ ซึ่งก็เป็นจริงตามนั้น แม้ server ไม่ล่ม หรือไม่บริการ ADSL มีปัญหา ถ้าเราจำเป็นต้องพึ่ง cloud data server ภายนอก คงวุ่นวายน่าดู ครับเป็นอย่างที่คุณคิดนั่นแหละ ถึงจุดนี้เราต้องมี cloud data server ของเราเองจะดีเป็นแน่ อยากจะเรียกให้หรูว่าเป็น In house cloud data server
In house cloud data server อันนี้แหละเป้นเนื่อหาที่ผมขอนำมาเสนอในโพสต์นี้ มาแนะนำการติดตั้ง cloud data server กัน บอกได้เลยว่าง่ายมากๆ
ความเป็นมาของโพสต์นี้ก็คือ ผมได้โต้ตอบกับคำถามเรื่องของ ESP8266 node widget ที่จะมาใช้งานกับ NodeRED ซึ่งผมก็ได้ออกความคิดเห็นในลักษณะที่ได้เขียนไว้ด้านบน แต่อาจจะอธิบายความไม่ได้มากนัก จึงเก็บเรื่องนั้นมาโพสต์ต่อในบล๊อก ในโพสต์นั้นได้มีสมาชิกท่านหนึ่งได้แนะนำ cloud data server ที่สามารถนำมาติดตั้งไว้บน PC เพื่อการบริหารข้อมูล มีเครื่องไม้เครื่องมือให้ใช้ครบ ชื่อเรียกคือ phant เป็นโครงการของ Sparkfun ที่ได้พัฒนาขึ้นและทำการแจกจ่ายแบบไม่คิดเงิน ให้สามารถนำมาติดตั้งบน PC ที่รัน Node.js อยู่ ได้ใช้งานกัน
ผมได้ทำการติดตั้ง phant เป็นที่เรียบร้อย ด้วยคำสั่งที่คุ้นเคย
npm install phant –g
ขอเน้นในเรื่อง –g เนื่องจากมันจะถูกใช้ในลักษณะ global คือทุกแอปสามารถเรียกใช้งานได้ ถ้าไม่มี –g อาจทำให้เกิดปัญหาในการใช้งานกับแอปอื่นๆ
ติดตั้งเรียบร้อยแล้วก็เรียกใช้งานด้วยคำสั่ง phant ใน Command prompt console แนะนำให้เรียก console เป็นแบบ Administrator ครับ
ถ้าการติดตั้งสมบูรณ์ก็จะมีข้อความแสดงบน console ตามนี้
phant http server running on port 8080
phant telnet server running on port 8081

แล้วก็จะค้างอยู่แบบนั้น แสดงว่าการทำงานเริ่มขึ้นแล้ว
แต่หนทางไม่ได้โรยด้วยกลีบกุหลาบ ผมประสบปัญหาตอนเรียกใช้งาน ตามภาพที่แสดงเลยครับ
image
ทดลองกี่ครั้งก็ไม่ได้ อันนี้ขอบอกว่าของท่านอื่น ติดตั้งแล้วอาจไม่พบปัญหานี้ก็เป็นไปได้
เนื้อหาของข้อผิดพลาดก็ไม่ได้บอกอะไรมาก ตอนนี้ก็ต้องเดาเหตุการณ์เอา ซึ่งเป็นโชคดีที่ผมเดาถูก สิ่งที่ผมคิดก็คือ หมายเลขพอร์ทน่าจะชนกับ server ตัวอื่น เพราะหมายเลข 8080 เป็นที่นิยมใช้กันมากสำหรับ http server คิดได้อย่างนั้นก็เลยต้องหาว่า แล้วจะเปลี่ยนหมายเลขพอร์ทได้ที่ไหน ค้นไปสักพักก็ไปพบกับไฟล์ชื่อ serve อยู่ในโฟลเดอร์ที่ติดตั้ง phant
ในรูป console ด้านบนจะเห็นชื่อโฟลเดอร์ยาวๆ ให้เข้าไปที่ตำแหน่งนั้น แต่แทนที่จะไปที่ lib ให้เข้าไปที่ _bin แทน จะพบกับไฟล์ชื่อ serve ให้เปิดไฟล์ด้วย text editor แล้วหาบรรทัดที่มีข้อความ
http_port = process.env.PHANT_PORT || 8080,
telnet_port = process.env.PHANT_TELNET_PORT || 8081;
จัดการเปลี่ยนหมายเลข 8080 เป็นหมายเลขอื่น ของผมใช้ 8090 และ 8091 สำหรับ telnet บันทึก แล้วทดสอบ ถ้าไม่ได้ก็เปลี่ยน จนสามารถเปิดใช้งานได้
สองบรรทัดที่นำมาแสดงจะเห็นว่ามีการใช้ process.env.PHANT_PORT และ process.env.PHANT_TELNET_PORT ซึ่งถ้าเป็นผู้เชี่ยวชาญเรื่อง OS ก็จะสามารถไปปรับตั้งค่าได้ แต่ผมแนะนำให้ใช้วิธีนี้
เริ่มต้นใช้งาน PHANT
ก่อนจะดำเนินเรื่องต่อไป มีเกร็ดเล็กๆของชื่อ PHANT ที่ Sparkfun บอกว่ามาจากคำว่า Elephant ที่แปลว่า ช้าง ซึ่งเป็นสัตว์ที่มีความจำดี ก็เลยนำเอาชื่อมาใช้ในการเก็บข้อมูล สัญญลักษณ์ของโครงการก็เป็นรูปคล้ายๆช้าง
เอาหละมาเริ่มใช้งาน
ให้เปิด browser พิมพ์ http://127.0.0.1:8080 ตัวเลข 8080 จะเป็นเลขอื่นตามที่เราได้แก้ไข จะแสดงหน้าจอ
image
Phant พร้อมทำงานแล้ว ลองอ่านคำอธิบายกันสักหน่อย ด้านท้าย จะเห็น
image
การใช้งานหลักๆ มีอยู่สองส่วนคือ
image      image
CREATE สำหรับการสร้าง data และ EXPLORE สำหรับค้าหา data
ทำการสร้าง data
ให้กดที่ CREATE หน้าจอแสดงฟอร์ม ให้ป้อนข้อมูลที่จำเป็น ได้แก่
Title, Description, Show in Public Stream List และ fields ในช่อง fields ให้ใส่ชื่อฟิลด์ต่างๆ โดยคัั่นด้วย comma
ตัวอย่าง ตั้งชื่อ คำอธิบาย และ ฟิลด์ led relay และ servo
image
ส่วนของ Tags และ Location สามารถป้อนและเรียกดูได้ ใส่ไว้ก็ดีหรือไม่ใส่ก็ได้ สำหรับ Stream alias แนะนำให้ใส่ตั้งชื่อไว้ เพื่อให้สามารถเรียกดู data stream โดยอ้างชื่อนี้ได้ ผมใส่คำว่า NodeRedStream เอาไว้ จากนั้นทำการบันทึก
Phant จะสร้าง data stream ให้ และแสดงข้อมูลที่สำคัญ ในหน้าถัดไป จำเป็นต้องบันทึกค่าเหล่านี้ไว้ ส่วนที่สำคัญที่สุดคือ Private key เพราะจะต้องใช้ในการแก้ไขการตั้งค่า บันทึกหน้าจอไว้ก็จะดีครับ ส่วนของด้านล่างแสดงวิธีการเขียนลงในโค๊ด เพื่อการบันทึก เรียกดู หรือลบ data stream จะแสดงวิธีการใช้โค๊ดตอนเราใช้งานใน NodeRED editor
ทบทวนกันนะครับ ตอนนี้เราสร้าง data stream บน Phant ประกอบด้ว 3 ฟิลด์คือ led, relay และ servo
วิธีการบันทึกข้อมูล
รูปแบบ
http://127.0.0.1:8090/input/PUBLIC_KEY?private_key=PRIVATE_KEY&FIELD1=VALUE1&=FIELD2=VALUE2
ให้แทนที่ PUBLIC_KEY, PRIVATE_KEY ด้วยค่าที่เราบันทึกไว้ และใส่ชื่อ FIELD1, FIELD2 และ FIELD3 ตามที่เราตั้งไว้ สำหรับที่ผมทำจะเป็นตามนี้
http://localhost:8090/input/W8zJbQ8bPjcX8WlYpvEEt2xVlO9?private_key=0w60z7wzyQfLMA5wZXPPFAze628&led=5.44&relay=12.03&servo=28.37
หมายเลข PUBLIC KEY และ PRIVATE KEY จะแตกต่างจากด้านบนนะครับ ของใครของมัน
ทีนี้มาดูการเรียกดูค่าที่เราป้อนเข้าไป มี 2 รูปแบบ
ถ้าในไปใช้ในโค๊ด จะเป็นรูปแบบนี้
http://localhost:8090/streams/W8zJbQ8bPjcX8WlYpvEEt2xVlO9
รหัสต่อท้ายเป็น PUBLIC KEY
หรือดูบน browser ก็
http://localhost:8090/noderedpoint
noderedpoint คือ Stream alias ที่เราตั้งชื่อ
ทั้งสองรูปแบบจะแสดงผลเป็นลักษณะนี้
image
จะแสดงค่าที่เราเพิ่งส่งเข้าไป สังเกตุที่มุมบนขวาจะมีปุ่ม Manage เพื่อเข้าไปแก้ไขการตั้งค่า จะเข้าได้ต้องป้อน Private key
image
จะเห็นได้ว่า Private key สำคัญมากๆ ต้องใช้ในหลายส่วน
การปรับค่าก็จะเป็นหน้าเดียวกับการสร้าง แก้ไขแล้วก็ทำการบันทึก
สำหรับการใช้งานกับ NodeRED ขอยกไปโพสต์ต่อไป โพสต์จะได้ไม่ยาวเกินไป

ไม่มีความคิดเห็น:

แสดงความคิดเห็น