ควบคุมทีวี ด้วย LINE Chat bot ,Dialogflow และ Flask -Part1

Eddie eddie
5 min readMay 29, 2018

--

วันก่อนที่บริษัทผมให้พนักงานใช้เวลาว่างหลังเลิกงานลองทำโปรเจกกันเล่นๆอะไรก็ได้ เรียกว่าเป็น mini hackathon ในบริษัท พอดีว่าช่วงนี้ตัวผมเองเริ่มสนใจ IoT เลยลองจัด Raspberry Pi มาหมาดๆ แต่ยังคิดไม่ออกว่าจะทำอะไรดี เคยลองเข้าไปไล่ดูตัวอย่างคนอื่นๆเขาทำในเว็บ hackster.io แล้วแต่ละอย่างมันช่างยากเหลือ เกินความรู้ของเรา บังเอิญว่าเคยเห็นเพื่อนผม คุณ Kittinan เค้าทำโปรเจกเล่นๆเปิดปิดทีวีที่บ้าน ผมกับเพื่อนๆ Jitrapon Tiachunpun Weera Wu Lemon Bread เลยอยากจะลองเอามาทำบ้าง ถือว่าลอกและเรียนรู้ไปในตัวเลยละกัน อิอิ

ควบคุมทีวี ด้วย LINE Chat bot ,Dialogflow และ Flask -Part2
ควบคุมทีวี ด้วย LINE Chat bot ,Dialogflow และ Flask -Part3

สิ่งที่ต้องใช้ฝั่ง Hardware:

หน้าตาอุปกรณ์ Broadlink RM mini3

Broadlink RM mini3 — หาซื้อง่ายๆ มีทั้งใน AliExpress และ Lazada

Raspberry Pi 3 model B — จริงๆจะเป็นคอมพิวเตอร์ทั่วไปก็ได้ ขอแค่ต่ออินเตอร์เน็ตแล้วก็รัน Python ได้ก็พอ

รีโมททีวี — เราจำเป็นต้องใช้รีโมททีวีของเราจริงๆเพื่อทำการเก็บคำสั่งที่รีโมททีวีเรายิงไปให้ทีวี

USB Cable และ Adapter — พอดีไอ้เจ้า Remote ของ Broadlink รุ่นนี้มันไม่มี Battery ในตัวเพราะฉะนั้นก็ต้องเสียบชาร์ตเอาไว้เสมอ

Service ที่ต้องเตรียม:

LINE Message API — อันนี้ต้องมีเตรียมพร้อมเอาไว้สำหรับส่งคำสั่งที่เราจะให้เจ้าบอทเราทำงาน

Dialogflow — เจ้าตัวนี้เป็นเครื่องมือของกูเกิ้ลให้เราสามารถสร้าง Chatbot โดยเบื้องหลังยังมี AI มาช่วยเรียนรู้บทสนทนาของเราที่พิมพ์เข้าไป แถมยังรองรับ Chat app เต็มไปหมด หนึ่งในนั้นก็คือ LINE ด้วยนี่เอง

ส่วนสำหรับ code Python:

Flask — อันนี้ผมเอาไว้ทำให้เจ้า Raspberry Pi การเป็น Server ที่บ้าน

Python-broadlink — Library ไว้สำหรับติดต่อระหว่างคอมเรา (Raspberry Pi) กับเจ้า Broadlink RM mini3

ในบทความนี้ผมจะยกตัวอย่างเฉพาะการเปิดปิดทีวีที่บ้านผมเท่านั้นนะครับ ถ้าใครอยากจะลองใช้เจ้าตัว Broadlink ความคุมอุปกรณ์ IR อย่างอื่น เชื่อว่า สามารถนำขั้นตอนไปประยุกต์ได้ไม่ยาก โดยขั้นตอนการ setup จะแบ่งเป็น 3 ส่วนนะครับโดยขั้นตอนทั้งหมดจริงๆจะมีดังนี้

  1. สร้าง LINE Chat message provider
  2. สร้าง Dialogflow
  3. Integrate LINE chat กับ Dialogflow
  4. สร้าง Dialogflow Agent
  5. สร้าง Dialogflow Intent
  6. จัดการกับ Message ที่ Bot ไม่เข้าใจ
  7. เรียนรู้คำสั่งบน Remote ด้วย Python-Broadlink
  8. ติดตั้ง Flask บน Raspberry Pi
  9. ติดตั้ง ngrok บน Raspberry Pi
  10. Run server ที่เขียนด้วย Flask
  11. ใช้งาน ngrok เพื่อให้สามารถเข้าถึง server เราจากภายนอกได้
  12. ยิงคำสั่งจาก LINE Chat bot ให้ เปิดปิดทีวี

มาเริ่มกันเลยดีกว่า!!!

สร้าง LINE Chat message Provider

จริงๆ Document ของ LINE เขียนเอาไว้แล้วค่อนข้างดีอยู่แล้ว แต่ผมจะเขียนอีกทีนึงแต่ถ้าใครกลัวว่าที่ผมเขียนจะอ่านไม่รู้เรื่อง สามารถเข้าไปอ่านขั้นตอนเริ่มต้นได้ที่เว็บหลักเค้าตามนี้เลย

ขั้นตอนแรกให้เข้ามาที่ https://developers.line.me/en/ จะเจอหน้าตาประมาณนี้

กด Start using Messaging API จะขึ้นหน้าให้ Login เราก็ใส่ Email, Password ของเราไป

ใส่ Email และ Password ของ LINE เรา

ถ้ายังไม่เคยสมัคร LINE Developer มาก่อน เค้าจะให้ใส่ข้อมูลชื่อ และ Email เราอีกทีหน้าตาแบบนี้

กรณีไม่เคยสมัคร LINE Developer เค้าจะถาม email และ ชื่อเราอีกครั้ง

หลังจากนั้นให้เรากดปุ่ม Create new Provider ก้อใส่ชื่อ provider ที่เราต้องการลงไปและกด confirm เลย

เราสามารถใส่ชื่อและรูปภาพให้เจ้า Chatbot ของเราได้

จากรูปข้างบนนี้ จะมีสองอย่างที่เราต้องใช้ในการเชื่อมต่อกับ Dialogflow คือ Channel ID, Channel secret ผมขอแปะเอาไว้ก่อนนะ

Scroll ลงมาล่างๆหน่อย เราจะเจอ section ที่เขียนว่า Message settings ตรงนี้ให้เราไปตั้งค่า Use webhooks ให้เป็น Enabled และกดปุ่ม Issue ตรง Channel access toekn เพื่อให้ LINE Chatbot สร้าง token ไว้ให้เราเอาไปใช้กับ dialogflow

สร้าง Dialogflow Account

เข้าไปที่ https://dialogflow.com/ กด Sign up ให้เรียบร้อย หน้าเว็บจะพาเรามาที่หน้า Dialogflow console จากนั้นเลือก เมนู Integrations ทางฝั่งซ้ายมือ

Dialogflow มีช่องทางให้เราเอามันไป integrate กับหลากหลายแอพหลากหลายบริการ LINEChatbot ก็เปนหนึ่งในนั้น ให้เราเลือก Enable LINE

บริการที่ Dialogflow รองรับ

จะมีหน้าต่างให้เราใส่ Channel ID, Channel Secret, Channel Access Token และ และแสดง WebHook URL ของ Dialogflow เองแบบนี้

ให้เรากลับมาที่ LINE provider ที่เราส้รางไว้ copy ค่า Channel ID และ Channel secret มาใส่ก่อนจาก ส่วนที่เป็น Basic infomation

เลื่อนลงมาตรงส่วน Messaging settings กด Issue ตรง Channel access token เพื่อสร้าง Token จากนั้นทำไปใส่ใน dialogflow

ทำการ Enable webhooks

copy webhooks URL จาก Dialogflow แล้วใส่ตรงช่อง Webhook URL

Integration เสร็จเรียบร้อย!

สร้าง Dialogflow Agent

กำหนดชื่อของ Agent ของเรา เลือกภาษา และเวลาให้ถูกต้อง นอกจากนี้เรายังสามารถเลือกเชื่อมต่อ agent ของเรากับ Google Project ได้ด้วย

พอเราได้ Dialogflow Agent มาแล้วทีนี้ก็ต้องมาเริ่มสร้าง Intent ของมันกัน

สร้าง Dialogflow Intents

Dialogflow intent ถ้าแปลตรงตัวก็เหมือนกับความตั้งใจ เหมือนเป็นการ Set การทำงานหลังจากได้รับ “คำสั่ง” ที่อยู่ในหรือใกล้เคียงกับชุดคำสั่งสำหรับการเรียนรู้ (Training phase) ที่เราเตรียมไว้ โดยเราสามารถสร้าง Intents ได้หลายตัวเช่น Intent สำหรับเปิดทีวี,Intent สำหรับเปลี่ยนช่องทีวี, Intent สำหรับเปิดแอร์ ฯลฯ

ผมจะลองสร้าง Intent ขึ้นมาใหม่ตัวนึง สำหรับเปิดทีวีโดยเฉพาะละกัน

เริ่มต้นก็ใส่ชื่อ Intent ให้เรียบร้อย

ชื่อ Intent สำหรับเปิดทีวี

ทีนี้อยากให้ focus ที่ส่วนสองส่วนนี้ก่อน คือ เจ้า Training phase และ Response

แต่ละ Intent เราสามารถใส่ประโยคที่เรียกว่า Training Phase เอาไว้ได้ เป็นเหมือนข้อความที่คาดว่า Users จะพิมพ์เข้ามา รวมถึงมีความสามารถที่จะเรียนรู้คำสั่งใหม่ๆจาก Training Phase เดิมที่เราเตรียมไว้ เนื่องจาก Dialogflow นั้นมี Machine learning ทำงานเรียนรู้คำสั่งอยู่เบื้องหลัง

ผมจะลองใส่ Training Phase สำหรับเปิดทีวีดูนะครับ

ทีนี้เราก็ต้องให้เจ้า Bot ของเรารู้จักวิธีการตอบกลับด้วย ซึ่งแน่นอน การตอบกลับก็จะต้องอยู่ในส่วน Response นั่นเอง

ลองใส่ข้อความที่จะให้ Bot ตอบกลับลงไป

หลังจากนั้นกดปุ่ม Save และ Done ตรงมุมขวาบน

ตรงด้านขวามือ Dialogflow จะมีหน้าต่างให้เราสามารถทดสอบ response ของ Intent นั้นๆ ได้เลย โดยไม่ต้องไปเปิด Chat App ที่เรา Integrate ไว้ แบบนี้ก็ลองกันหน่อย

ลองกับเจ้าบอทใน LINE ดู

เนื่องจากเจ้า Dialogflow มี Machine learning ทำงานอยู่เบื้องหลัง โดยความสามารถของมันคือรู้ว่าข้อความที่พิมพ์เข้ามาใหม่ควรจะเข้าไป map กับ Intent ไหน

ผมจะลองพิมพ์ข้อความที่ไม่มีใน Training Phase แล้วดูว่าบอทจะเข้าใจมั้ย

ประโยค “เบื่อจังทีวีมีอะไรให้ดูมั่งนะ” นี้ไม่มีใน Traning Phase ที่ผมสร้างไว้ แต่ dialogflow เรียนรู้จากข้อความแล้วฉลาดพอที่จะไป map กับ Intent นี้ให้

คำถามคือแล้วถ้ามันไม่รู้จริงๆล่ะ ว่าข้อความที่พิมพ์มาจะไปตกที่ Intent ไหนจะทำไง?

ง่ายๆคือ Fallback Intent

โดยเริ่มต้นหลังจากที่เราสร้าง Dialogflow Agent แล้ว จะมี Intents ที่ถูกสร้างมาให้แล้วอัตโนมัติสองตัว คือ Default fallback Intent และ Default Welcome Intent

ตัวที่ผมอยากให้ Focus คือ Default fallback Intent เนื่องจากว่า ในหลายๆครั้งเราอาจจะสั่งคำสั่งที่นอกเหนือจากชุด Training Phase ที่เราเตรียมไว้ แล้วตัว Dialogflow ไม่เข้าใจ สิ่งที่มันจะทำคือ มันจะ map คำสั่งนั้นกลับมาที่ Fallback Intent ทันที หน้าที่ของเราคือเข้ามารีวิวสิ่งที่ Dialogflow ไม่เข้าใจ แล้ว re-map มันใหม่กับ Intent ที่ควรจะเป็นได้ เจ๋งมั้ยล่ะ!!

อันนี้คือหน้าตาของ Fallback Intent ที่ผมสร้างไว้โดยผมเลือกใส่แค่เฉพาะ Response อย่างเดียว

ผมลองพิมพ์คำว่า “ดูโททัด” แต่ดูเหมือนเจ้าบอทของผมมันจะไม่เข้าใจ แน่นอนมันก็จะไปตกที่ Fallback Intent โดยอัตโนมัติ

จัดการกับ Message ที่ Bot ไม่เข้าใจ

ใน dialogflow console ให้เราเข้ามาที่เมนู Training ข้างซ้าย

จะมีข้อความเก่าที่เข้ามาอยู่ โดยเรียงลำดับตามวันที่และเวลา

คลิกที่ข้อความที่ตก Fallback จากนั้นคลิกปุ่ม Assign

เราสามารถกำหนด Intent ใหม่ให้กับคำสั่งนั้นได้เลย ในเคสนี้ผมทำการ map คำสั่งนี้กับ Intent สำหรับเปิดทีวี (อย่างลืมกดปุ่ม Approve ล่ะ)

เอาล่ะ มาลองใหม่ โดยพิมพ์คำว่า “ดูโททัด” เข้าไป

งานหลักๆของเราน่าจะเป็นการเข้ามาดูว่ามี message ไหนเข้าไปตกที่ Fallback Intent บ้างหรือตกผิด Intent บ้าง เราคงต้องคอยจัดการ re-map มันเรื่อยๆเพื่อให้ Bot เราฉลาดขึ้นเรื่อยๆ

ไปต่อ Part 2 กันเลย

--

--