การแจ้งเตือนความเคลื่อนไหวผ่าน Facebook โดยใช้ RaspberryPi 3 และ PIR

การแจ้งเตือนความเคลื่อนไหวผ่าน 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 ตัว

Facebook

            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 ตรวจสอบโดยใช้คำสั่ง

node –v

            เนื่องจากเป็นเวอร์ชั่นนี้ไม่สามรถทำงาน 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 จับภาพนั้นเอง

 

Facebook Comments Box