การแจ้งเตือนความเคลื่อนไหวผ่าน Facebook โดยใช้ RaspberryPi 3 และ PIR
การทำระบบแจ้งเตือนมีรูปแบบหลากหลายไม่ว่าจะเป็นทาง SMS, Email, โทรเข้ามือถือ และอื่นๆอีกมากมาย ผมจะขอเสนอการแจ้งเตือนอีกช่องทางหนึ่งคือการแจ้งเตือนผ่านทาง Chat Facebook ทุกคนคงปฎิเสธไม่ได้ว่าไม่รู้จัก Facebook และไม่มี Facebook เป็นของตัวเอง ดังนั้นเราจะใช้เครื่องมือที่มีอยู่สร้างระบบรักษาความปลอดภัยโดยที่ไม่ต้องเสียเวลาสร้าง App ที่ใช้แจ้งเตือน เสียเวลาสร้าง Platform as a Service ที่ทำหน้าที่เป็นตัวกลาง (Broker) โดยสิ่งที่กล่าวมา Facebook มีให้หมดแล้ว
อุปกรณ์ที่ต้องเตรียม
– RaspberryPi 3 ที่ติดตั้ง OS เรียบร้อยแล้ว (ในตัวอย่างนี้ติดตั้ง RASPBIAN JESSIE ) พร้อมแหล่งจ่ายไฟ 1 ชุด
– PIR เซ็นเซอร์ตรวจจับความเคลื่อนไหว จำนวน 1 ตัว
– LED จำนวน 1 ดวง
– ตัวต้านทาน 330 โอห์ม ¼ วัตท์ 1 ตัว
Login Email และ รหัสผ่านเข้า Facebook ที่จะเป็นตัวส่งข้อความ ในตัวอย่างผู้เขียนใช้วิธีการสมัคร Facebook ใหม่ที่มีชื่อว่า Smart Home
การทำงาน
เริ่มจาก RaspberryPi 3 จะอ่านค่าเซ็นเซอร์ตรวจจับความเคลื่อนไหวเมื่อพบความเคลื่อนไหวจะส่งข้อความไปยังผู้ที่ได้ลงทะเบียนไว้ นั้นเปรียบเสมือนว่า RaspberryPi3 เป็นผู้ค่อยส่งข้อความไปหาเราเวลามีความเคลื่อนไหวเกิดขึ้นนั้นเอง
ติดตั้ง NodeJS
NodeJS เป็น JavaScript ที่ทำงานอยู่บนฝั่ง Server จะช่วยให้นักพัฒนาสามารถเขียนโปรแกรมควบคุมการทำงานบนฝั่ง Server ได้สะดวกและมีประสิทธิภาพ เป็นที่นิยมกันอย่างแพร่หลายสำหรับ Web Server ในยุคนี้ และบน Raspberry Pi ก็สามารถใช้งาน NodeJS ได้ด้วยเช่นกัน โดยมีขั้นตอนการติดตั้งดังนี้
*สำหรับ NodeJS จะติดตั้งมาพร้อม OS ที่เป็น RASPBIAN JESSIE อยู่แล้วจะเป็นเวอร์ชั่น v0.10.29 ตรวจสอบโดยใช้คำสั่ง
เนื่องจากเป็นเวอร์ชั่นนี้ไม่สามรถทำงาน Package facebook-chat-api ได้ เราจะติดตั้งเวอร์ชั่นล่าสุดเลยแล้วกัน และไม่สามารถติดตั้งผ่าน apt-get ได้ ดังนั้นจึงต้องดาวน์โหลดไฟล์มาติดตั้งเอง โดยเข้าไปที่หน้าเว็ปดาวน์โหลด NodeJS ก่อนเพื่อเช็คเวอร์ชันล่าสุดและ URL สำหรับดาวน์โหลด https://nodejs.org/en/download/current/
Nodejs จะเป็นเวอร์ชัน v6.2.2
ก่อนจะเริ่มดาวน์โหลดไฟล์ ให้ย้าย Directory ปัจจุบันมาที่ Desktop ก่อน โดยใช้คำสั่ง
cd /home/pi/Desktop
ใช้คำสั่ง wget บน Raspberry Pi เพื่อดาวน์โหลดไฟล์ โดยใช้คำสั่ง
wget https://nodejs.org/dist/v6.2.2/node-v6.2.2-linux-armv7l.tar.gz
Extract File ด้วยคำสั่ง tar -xvf node-v6.2.2-linux-armv7l.tar.gz โดยชื่อไฟล์ node-v6.2.2-linux-armv7l.tar.gz ขึ้นอยู่กับไฟล์ที่ดาวน์โหลดมา
tar -xvf node-v6.2.2-linux-armv7l.tar.gz
เข้าไปใน Directory ของ NodeJS ที่พึ่ง Extract ออกมา ด้วยคำสั่ง
cd node-v6.2.2-linux-armv7l
คัดลอกไฟล์ทั้งหมดไปเก็บไว้ใน Directory ที่อยู่ /usr/local/ ด้วยคำสั่ง
sudo cp -R * /usr/local/
Restart RaspberryPi ด้วยคำสั่ง
sudo reboot
ตรวจสอบเวอร์ชันของ NodeJS หลังจากการติดตั้งด้วยคำสั่ง
node -v
ติดตั้ง Package facebook-chat-api
facebook-chat-api เป็น Package ที่จะช่วยให้ NodeJS สามารถส่งข้อความไปยัง Facebook ปลายทางได้ง่ายขึ้น โดยไม่จำเป็นต้องไปศึกษา API ของ Facebook โดยตรง มีขั้นตอนการติดตั้งดังนี้
ย้าย Directory ปัจจุบันมาที่ Desktop ก่อน โดยใช้คำสั่ง
cd /home/pi/Desktop
จากนั้นสร้างโฟลเดอร์เพื่อเก็บงานของเราโดยใช้ชื่อว่า Project
mkdir Project
ย้าย Directory ปัจจุบันมาที่ Project ก่อน โดยใช้คำสั่ง
cd Project
ติดตั้ง facebook-chat-api ด้วยคำสั่ง
npm install facebook-chat-api
ศึกษาข้อมูลเพิ่มเติมได้ที่ https://github.com/Schmavery/facebook-chat-api
ติดตั้ง Package onoff
onoff เป็น Package ที่จะช่วยให้ใช้ NodeJS ควบคุม GPIO บน Raspberry Pi ได้ง่ายขึ้นโดยมีขั้นตอนการติดตั้งดังนี้
npm install onoff
ศึกษาข้อมูลเพิ่มเติมได้ที่ https://www.npmjs.com/package/onoff
การต่อวงจร
ตัวอย่างโปรแกรม app.js
var login = require("facebook-chat-api"); // เรียกใช้ Package facebook-chat-api var Gpio = require("onoff").Gpio; // เรียกใช้ Package onoff led = new Gpio(17, "out"); //กำหนดขา 17 เป็น output PIR = new Gpio(18, "in"); //กำหนดขา 18 เป็น input var FB_EMAIL="your_email@inex.co.th" // ตัวแปรกำหนด Email ที่ใช้เข้า Facebook var FB_PASSWORD="1234567890" // ตัวแปรกำหนด password ที่ใช้เข้า Facebook var yourGroupID = 0; // ตัวแปรกำหนดหมายเลข ID ที่จะส่งข้อความไปยังปลายทาง // Create simple echo bot // ฟังก์ชันใช้สำหรับ Login เข้า Facebook login({email: FB_EMAIL, password: FB_PASSWORD}, function callback (err, api) { if(err) return console.error(err); api.listen(function callback(err,event) { // ฟังก์ชันที่ใช้กำหนดคำสั่งต่างๆเมื่อเกิดเหตุการสทนาขึ้นมา if(err) return console.error(err); api.markAsRead(event.threadID, function(err) { // เป็นคำสั่งเพื่อบอกว่าอ่านข้อความแล้ว if(err) console.log(err); }); console.log(event); // แสดงรายละเอียดของ event ทั้งหมด switch(event.type) { // ใช้รูปแบบของ event เป็นเงื่อนไข case "message": // จะเข้าเงื่อนไขนี้เมื่อรูปแบบเป็น message if(event.body == 'Hi') { // จะเข้าเงื่อนไขนี้เมื่อข้อความเป็นคำว่า Hi // event.threadID คือ ID ประจำตัวของบุคคลนั้นๆที่ส่งข้อความเข้ามา if (yourGroupID==event.threadID){ // ตรวจสอบว่าเป็นบุคคลที่ลงทะเบียนไว้หรือไม่ api.sendMessage("สวัสดีครับ",event.threadID); // ส่งข้อความว่า "สวัสดีครับ" }else{ //ถ้ายังไม่ลงทะเบียนจะส่งข้อความ "สวัสดีครับคุณยังไม่ได้ลงทะเบียน กรุณาพิมพ์ข้อความลับของคุณเพื่อลงทะเบียน" api.sendMessage("สวัสดีครับคุณยังไม่ได้ลงทะเบียน กรุณาพิมพ์ข้อความลับของคุณเพื่อลงทะเบียน",event.threadID); } } else if (event.body == 'Hi Login'){// จะเข้าเงื่อนไขนี้เมื่อข้อความเป็นคำว่า Hi Login api.sendMessage("เปิดระบบรักษาความปลอดภัย",event.threadID); // ส่งข้อความกลับ yourGroupID=event.threadID; //กำหนดให้ ID นี้ได้รับข้อความแจ้งเตือนเมื่อตรวจจับคาวมเคลื่อนไหว } else if (event.body == 'Hi Logout'){// จะเข้าเงื่อนไขนี้เมื่อข้อความเป็นคำว่า Hi Logout api.sendMessage("ปิดระบบรักษาความปลอดภัย",event.threadID);// ส่งข้อความกลับ yourGroupID=0; //กำหนดให้ ID ที่จะส่งไปเป็น ID หมายเลข 0 } else { api.sendMessage("ผมไม่รู้จักคำสั่งของคุณกรุณาพิมพ์ข้อความว่า Hi",event.threadID); } break; }}); setInterval(function() {//ฟังก์ชันอ่านสถานะขา GPIO var state = led.readSync(); // อ่านสถานะ LED var stPIR = PIR.readSync(); // อ่านสถานะ PIR if(state == 0) { // ถ้าสถานะเป็น 0 led.writeSync(1); // ให้ LED สว่าง console.log("LED On"); } else { // ถ้าสถานะเป็น 1 led.writeSync(0); // ให้ LED ดับ console.log("LED Off"); } if(stPIR == 1) { // ถ้า PIR ตรวจพบความเคลื่อนไหว console.log("PIR"); // ให้ส่งข้อความไปยัง ID ปลายทาง โดยมีตัวแปร yourGroupID เป็นตัวกำหนด api.sendMessage("ตรวจพบความเคลื่อนไหว", yourGroupID); }}, 1000); // กำหนดรอบเวลาในการทำงานทุกๆ 1 วินาที 1000 = 1 วินาที });
สร้างไฟล์ JavaScript
เนื่องจากจะต้องมีการพิมพ์ภาษาไทยด้วยเพื่อความสะดวกผู้เขียนจึงใช้โปรแกรม Notepad++ ในการสร้างไฟล์ JavaScript และกำหนดชื่อไฟล์เป็น app.js จากนั้นส่งไฟล์เข้าไปยัง RaspberryPi 3 โดยผู้ใช้จะต้องติดตั้ง Plugin ที่ชื่อว่า NppFTP ก่อนเพื่อใช้ในการรับ-ส่ง ไฟล์ระหว่าง คอมพิวเตอร์ กับ RaspberryPi ได้สะดวกยิ่งขึ้น
บันทึกไฟล์ app.js ไปที่โฟลเดอร์ Project บน RaspberryPi ตรวจสอบไฟล์ด้วยคำสั่ง ls
การทดสอบ
ต่อวงจรและทำการเชื่อมต่ออินเตอร์เน็ต กับ RaspberryPi ให้เรียบร้อย จากนั้นใช้คำสั่ง sudo node app
LED ก็จะติดดับสลับกันทุกๆ 1 นาทีเป็นอันว่า Script พร้อมทำงาน
ทดสอบบน Facebook
ในขั้นตอนนี้ผู้เขียนขอใช้สมาร์ทโฟนในการทดสอบ เปิด App Message Facebook แล้วค้นหาชื่อผู้ใช้ Facebook ที่ใช้กับ RaspberryPi
1. กดปุ่มถูกใจเพื่อดูผลตอบกลับถ้า Script ทำงานได้ปกติจะส่งข้อความตอบกลับมา
2. พิมพ์ข้อความว่า Hi เพื่อตรวจสอบว่าเรามีสิทธิที่จะได้รับการแจ้งเตือนหรือไม่
A. ถ้ายังไม่ได้ลงทะเบียนจะแสดงข้อความดังรูปหมายเลข 2
B. ถ้าลงทะเบียนแล้วจะแสดงข้อความว่า “สวัสดีครับ”
3. พิมพ์ข้อความที่ใช้ในการลงทะเบียนที่ได้กำหนดไว้ว่า “Hi Login” จะตอบกลับดังรูปหมายเลข 3
4. เมื่อพบการเคลื่อนไหวจะมีข้อความแจ้งเตือนเข้ามายังผู้ที่ได้ลงทะเบียนไว้เท่านั้น
5. ถ้าไม่ต้องการรับการแจ้งเตือนให้พิมพ์ข้อความว่า “Hi Logout”
6. ถ้าพิมพ์ข้อความนอกเหนือจากที่กำหนดไว้ จะแสดงดังรูปหมายเลข 6
ในโครงงานนี้เป็นแค่การแจ้งเตือนผ่านบริการของ Facebook ที่มีเฉพาะข้อความเท่านั้นเพื่อให้ผู้อ่านได้ทำความเข้าใจได้ง่ายครั้งต่อไปจะเป็นการส่งภาพไปพร้อมกับข้อความด้วย เสมือนว่าเรากำลังส่งภาพถ่ายเหตุการณ์นั้นๆไปให้เพื่อนดูว่าเกิดอะไรขึ้นโดยใช้กล้องของ RaspberryPi จับภาพนั้นเอง