IoT Weekend: ควบคุมการเปิด/ปิดหลอดไฟด้วย LINE Bot ผ่าน Messaging API และ MQTT Protocol [ver. 2018] Part 2

Krisada Vivek
LINE Developers Thailand
5 min readAug 3, 2018

สืบเนื่องจากบทความที่แล้ว ที่ได้นำทุกท่านเข้ามาสู่โลกของ IoT หรือ Internet of Things โดยมีการนำ Messaging API ของทาง LINE เข้ามาประยุกต์ร่วมด้วย ในบทความนี้จะครับ โมจะพูดถึงการสร้าง LINE ChatBot จากการเรียกใช้ Messaging API ที่ทาง LINE ได้จัดเตรียมไว้ให้ โดยจะพัฒนาด้วยภาษา Ruby และใช้ Heroku การ Deploy เพื่อนำไปควบคุม เปิด/ปิดหลอดไฟ และสามารถแนวคิดนำไปต่อยอดได้สร้างสรรค์สิ่งใหม่ๆ

KeyWording จะได้พูดถึงในบทความ(ทั้ง 3 Part)นี้

MQTT, Broker, Pub-Sub, Ruby, Sinatra, ChatBot, Gem

สิ่งที่ใช้ในการทำครั้งนี้นะครับ

  1. Heroku Account
    - มี server 2 ตัว อันนึงเอาไว้วาง เจ้า LINE Bot กับ อีกอันเอาไว้ วาง MQTT Broker (Part 1+2)
  2. LINE Developer Account สำหรับสร้าง DevTrial BoT (Part 2)
  3. IoT Device
    - ซึ่งในที่นี้โมใช้ ESP32 กับ LED สีแดง 1 ดวง (Part 3)

ซึ่งใน Part 1 โมได้นำทุกท่าน ลองตั้ง MQTT Broker เอาไว้ให้ได้ทดลองการทำงานของ MQTT Protocol ครั้งนี้จะใช้ LINE Messagin API เป็น Publisher เอาไว้ให้เป็นคนส่งข้อมูล (Text Messaage) เข้าไปยัง MQTT Broker

สิ่งที่จำเป็นสำหรับในการพัฒนานะครับ
- Ruby โดย เวอร์ชั่นที่ใช้เขียน 2.3.3
- Git
- MQTT Broker จากบทควาทที่แล้ว
- Your Own Choice of Code Editor ซึ่งซึ่ในบทความนี้โมใช้ VSCode

ต่อไปจะมาลงรายละเอียดการสร้าง Bot แบบ Step-by-step กัน Let’s Go!!!!

ขั้นตอนแรกคือเตรียม Channel ใน LINE Developers Console ขึ้นมาก่อน ให้ทำการสร้างบัญชีผู้ใช้งานได้ที่ https://developers.line.me

พอได้บัญชีผู้ใช้แล้ว ก็เข้าไปที่ https://developers.line.me/console/register/provider / เพื่อสร้าง Provider ขึ้นมา

เมื่อเราสร้าง Provider เป็นเรียบร้อยแล้วให้เลือก Messaging API เพื่อสร้าง Channel ที่จะมารองรับการเรียกใช้

ทำการตั้งชื่อ Channel

สำหรับ Developer Trial Plan จะอนุญาตให้เพิ่มเพื่อนได้ 50 คนเท่านั้น

ใส่ข้อมูลและรายละเอียดของ Channel ให้ครบ

เมื่อทำการกรอกข้อมูลเสร็จเรียบร้อยแล้ว ถัดมาจะเป็นการตั้งค่า Channel ในส่วนที่จำเป็นเพื่อให้เราเขียนแอพเพื่อทำการติดต่อได้ โดยสิ่งที่จำเป็นต้องใช้คือ Channel Access Token และ Webhook URL

กด Issue เพื่อสร้าง Channel Access Token สำหรับการ Authorize Request ไว้ใช้งาน

โดยเจ้า Access Token นี้จะหมดอายุก็ต่อเมื่อมีการสร้าง Access Token ใหม่ขึ้นมา ซึ่งเราสามารถกำหนดได้ว่าหลังจากสร้าง Access Token ใหม่แล้วจะให้ของเก่าใช้งานได้อีกกี่ชั่วโมงจึงจะหมดอายุ เมื่อกด Issue เราจะได้ Access Token พร้อมใช้งาน ให้เรา Copy เก็บไว้ เพื่อจะได้เอาไปใช้ตอนเขียนแอพ

ให้ปิด Auto-reply messages และ Greeting Message ด้วยเพราะเราจะเขียนให้ Bot เป็นผู้ที่ตอบเอง

ถัดมาเป็น Webhook URL ซึ่งเป็น URL ที่เราจะใช้ไว้รับ Request เมื่อเกิด Event ขึ้นมาจะมีการเรียก URL ดังกล่าวทันที ซึ่ง URL ที่ว่านี้เราจะได้จาก Heroku เมื่อเรานำ แอพตัวที่กำลังจะพาทุกท่านเขียน ขึ้นไป Deploy สามารถสมัครใช้งาน Heroku ได้ที่นี่

เริ่มสร้าง App โดย Log in แล้วเข้าไปที่ https://dashboard.heroku.com/apps

เลือก New -> Create new app ใส่ app-name ตามต้องการ เมื่อเสร็จแล้ว เราก็จะได้ Domain ของ app เราเป็น https://{ app-name}.herokuapp.com ยกตัวอย่าง https://app-name.herokuapp.com

กลับมาที่ LINE Developer Console ตรง Use webhooks ให้กดเป็น Enabled และใส่ Webhook URL ลงไปตามที่เราตั้งชื่อไว้ใน Heroku ตามด้วย Path ที่เราต้องการจะให้ API วิ่งกลับไปหา ไม่ว่าจะเป็น /webhook, /callback และลองกด Verify ดู แต่จะสังเกตุเห็นว่าพอกด Verify แล้ว จะขึ้นตัวอักษรสีแดง แสดงว่ายังไม่ผ่านการ Verify เนื่องจากเรายังไม่ได้ทำการ Deploy ตัว Bot ไปอยู่บน Heroku เพื่อทำการส่ง Response ให้กับ Request ที่จะถูกส่งมายัง URL นี้ ดังนั้นเราจะมาเขียน Bot ด้วยภาษา Ruby และ Deploy ลงบน Heroku เพื่อให้ Verify ผ่านกัน

ขั้นตอนการเขียน Code เพื่อสร้าง Bot

ในที่นี้โมเลือกใช้ Sinatra เพราะด้วยความที่ โครงสร้างของแอพที่เราต้องการจะสร้างนั้นไม่ซับซ้อนอะไรมาก แต่ถ้าไม่ชอบ ก็สามารถใช้ Rails (RubyonRaills) ซึ่งเป็น WebFramework ที่เขียนด้วยภาษา Ruby ได้เหมือนกัน

Setting Up A Sinatra App

เรามาเริ่มต้นกันด้วยการติดตั้ง Sinatra ซึ่ง มาใน Package ว่า Gem ลงไปที่เครื่องของเรา

gem install sinatra

พอติดตั้งเสร็จแล้ว จากนั้นสร้าง Folder โปรเจคเราขึ้นมา สร้างไฟล์ app.rb และ Config.ru ซึ่งตัว Config.ru จะเป็นไฟล์ที่ใช้ในการบอก Heroku ว่าเป็นคำสั่งที่จะถูกเรียกใช้หลัง Deploy เพื่อสั่งให้แอพเริ่มต้นทำงาน โดยใน Config.ru ให้ใส่ดังนี้

require "./app"
run App

จากนั้นเปิด File app.rb, ข้างบนสุดของ File ใส่ require 'sinatra' เพื่อให้เราสารมาเรียกใช้ เจ้า sinatra gem

# app.rb

เรียกใช้ Sinatra ไว้ บนสุดของไฟล์

require 'sinatra'

ลองสร้าง Path ง่ายๆขึ้นมาอันนึง ให้ปริ้น “Hello World” ออกมาที่หน้าจอ

get '/' do
'Hello world!'
end

จากนั้นเปิด Terminal , เพื่อทดสอบว่าแอพทำงานได้หรือไม่ ให้พิมพ์ ruby app.rb ไชโย!!! แอพขอเราก็จะปรากฤขึ้นใน Browser ที่ localhost:4567.

ขั้นตอนต่อไป เราจะมาทำการลง library ตัวอื่นๆ โดยสร้างไพล์ที่ชื่อว่า Gemfile ขึ้นมา เจ้า Gemfile เนี่ย ถ้าในฝั่ง Nodejs เปรียบเสมือน package.json เป็น file เอาไว้ลง library ตัวอื่นๆ ที่จะมาใช้กับในเฉพาะแอพของเรา (แบบ local)

nano Gemfile

พอสร้าง Gemfile ขึ้นมาแล้ว ให้ลง gem ดังต่อไปนี้

source 'https://rubygems.org' #บอกเอาไว้ว่าให้ไปอ้างอิง Gem จากเว็บนี้gem 'dotenv’ #เอาไว้ใช้ เรียก Environment Variable จากไพล์ .envgem 'line-bot-api' #เอาไว้ใช้ เรียก LINE Bot APIgem 'mqtt' #library ตัว MQTTgem 'sinatra' #ลง sinatra ไว้ตรงนี้เพื่อจะได้ เรียกในกรณีที่เครื่องที่เราจะไป    Deploy ไม่มี sinatra ติดตั้งอยู่ในเครื่องมาก่อนruby '2.3.3' #ประกาศว่าเราใช้ Ruby version ไหน

จากนั้นเปิด Terminal , เพื่อติดตั้ง dependencies ที่เหลือให้พิมพ์ bundle install เพียงเท่านี้ สิง่ที่จะถูกสร้างเพิ่มขึ้นมาคือ Gemfile.lock เพียงเท่านี้เราก็พร้อมสำหรับการเขียน bot แล้ว

bundle install

พอลง dependecies เรียบร้อยให้เรากลับไปที่ app.rb เพื่อทำการเขียน Code

โดยจะเริ่มจาก ประกาศเรียกใช้ gem ที่เราพึ่งลงไป

ถัดมา ให้เพิ่ม Code ดังนี้

โดยเจ้า Code ชุดนี้ จะเป็นการประกาศเรียกใช้ LINE Bot API เพื่อสร้าง Client ขึ้นมา โดยให้นำ Channel Secret และ Token ที่ได้จากตอนสร้าง Channel มาใส่ใน File .env ประกาศเรียกใช้ตัวแปรดังรูป

ถัดมา ให้เพิ่ม Code ดังนี้ ต่อจาก get method ที่เราสร้างไว้ตอนแรก

โดยประกาศ Path ให้ตรงกับที่เราเขียนไว้ใน Developer Console ตรงในส่วนของ Webhook เพื่อจะได้ verify ผ่าน

จากนั้นเตรียม Deploy แอพเราลง Heroku ผ่าน Heroku CLI (Command line Interface) หรือจะ Deploy ผ่าน GitHub ก็ได้เช่นกัน แต่ในบทความนี้จะขอพูดถึงเฉพาะผ่าน Heroku CLI ครับ เพราะง่ายกว่าเยอะ อิๆ เขียนเสร็จก็ push ลูกเดียว อิๆ

เรามาลง Heroku CLI กันก่อน

brew install heroku/brew/heroku

เมื่อลงเรียบร้อยแล้วให้ Login และใส่ Email และ Password ที่ใช้ในการ Login เข้าบัญชี Heroku ของเรา

heroku login

สร้าง Git Repository และ Attach กับ Heroku App ที่ได้สร้างไว้

git init
heroku git:remote -a {app-name}

Push ขึ้น Heroku เพื่อทำการ Deploy

git add .
git commit -m "Initial Commit"
git push heroku master

ตรวจสอบในหน้า Dashboard ของ App เราใน Heroku ว่า Deploy สำเร็จหรือไม่ หากสำเร็จให้ใช้คำสั่งด้านล่างเพื่อทำให้แน่ใจว่ามีอย่างน้อย 1 instance ที่กำลังรันแอพของเรา

heroku ps:scale web=1

ถ้าเราอยากรู้ว่า เมื่อเรา Deploy เรียบร้อยแล้ว แล้วใช้งานได้หรือไม่ ให้เข้าไปที่ Channel ที่เราสร้างไว้ Add Friend แล้วทักแชทไปซักคำ เพียงแค่นี้เราก็ได้ Chat (Echo) Bot ง่ายๆ ขึ้นมาตัว //ตรบมือ

ทีนี้เรามาเพิ่มความสามารถให้เจ้า LINE Chatbot ที่เราสร้างขึ้นมาดีกว่า โดยโมจะเอาไปใช้ทำการควบคุม เปิด/ปิดหลอดไฟ เพียงพิมพ์คำสั่งให้เปิดหรือปิด ผ่านหน้า Chat LINE นี้

โดยแนวคิดคือเรามี MQTT Broker ที่โมได้นำทุกท่านสร้างเมื่อบทความที่แล้ว โดยจะให้เจ้า LINE ChatBot ของเราเนี่ยทำหน้าที่เป็น Publisher ส่งข้อความเข้าไปที่ Broker แล้วให้เจ้า IoT Device ที่จะสร้างขึ้นมาใน Part ต่อไป ให้ไปรอฟังคำสั่ง Subsciber แล้วเปิดปิดตามข้อความที่เราส่งเข้าไป

โดย Implement Code ดังนี้

เรียกใช้ gem mqtt และ uri ต่อจากที่เราประกาศอันอื่นๆ

ในส่วนนี้เป็นการเรียกใช้ MQTT โดยเราจะประกาศว่าจะเชื่อมต่อไปที่ server ไหน ด้วย Port อะไร username และ password อะไร

โดย ใช้ข้อมูลได้ตามนี้ จาก MQTT ฺฺBroker ที่เราสร้างไว้ครั้งที่แล้ว

Pattern ของ URI คือ

mqtt://{username}:{password}@{server}:{port}/{topic}

ส่วน Topic นั้น ให้ประกาศดังนี้ ข้อระวัง ควรประกาศ topic ให้ตรง มิฉะนั้นเราจะไม่ได้ข้อความที่ส่งไป

หลังที่เราได้นำค่าจาก MQTT Broker มาใส่แล้ว

มาถึงหัวใจหลักสำคัญ นั่นก็คือการให้ เจ้า chat Bot ของเราส่งข้อความที่เราพิมพ์เข้ามา ไปยัง MQTT Broker

โดยใช้คำสั่งดังนี้

และอย่าลืมส่ง conn_opts ที่เราประกาศไว้ก่อนหน้านี้เข้าไปด้วย

ต่อมาเนี่ย เราไม่อยากให้พิมพ์อะไรเข้าไปมั่วๆ งั้นก็ตั้ง Logic เอาไว้นิดนึง ให้รับคำสั่งเฉพาะ แล้ว Replay Message กลับไป เพื่อให้เรารู้ว่า Server ได้รับคำสั่งของเราเป็นที่เรียบร้อยแล้วนะ

จากนั้นก็ Deploy แอพเราไปที่ Heroku แล้วทดสอบกันได้

ไป เซ็คที่ MQTT Broker ของเราว่ามีข้อความวิ่งเข้ามาไหม

โอ้วโหวววววว!!!! แค่นี้เราก็ได้ Publisher ของข้อความที่สามารถคุยคิดต่อกับ MQTT Broker ได้แล้ว #simpleIoT #IoTiseasy

Code ทั้งหมด นะครับ

GitHub ขอตามมาทีหลังนะครับ

ถ้าท่านใดไม่ถนัดภาษา Ruby โมกำลังทำวิธี Implement LINE Bot บนภาษาอื่นๆ เช้า Go, Nodejs, Python จะพยายาม Published ภายในเร็วนี้นะครับ

ยังไม่จบเพียงเท่านี้นะค้าบ

ย้อนกลับไปดู Part 1 ผมนำพาทุกท่านมาสร้าง MQTT Broker

โปรดติดตาม Part 3 ผมจะนำพาทุกท่านมาสร้าง IoT Device

โปรดติดตามตอนต่อไป!!! つづく

References:
- LINE Messaging API
- API Reference
- Heroku Reference

--

--