LINE Bot—สร้าง Bot รายงานดัชนีคุณภาพอากาศทุกเช้าแบบง่ายๆ (AQI LINE Bot)

Photo by Arran Smith on Unsplash

เนื่องจากข่าวเรื่องฝุ่น PM2.5 ที่ทำให้ทุกคนหันมาสนใจเรื่องคุณภาพอากาศกันมากขึ้น ผมก็เป็นคนหนึ่งที่อาศัยอยู่ในพื้นที่เมืองหลวงที่คุณภาพอากาศแย่ติดอันดับต้นๆ ของโลก เลยอยากรู้ว่าทุกๆ เช้าคุณภาพอากาศเป็นอย่างไรในแต่ละวัน ผมจะได้เตรียมใส่หน้ากากกันฝุ่นออกไปด้วยเลย จึงมีแนวคิดว่าน่าจะมี LINE Bot ไว้รายงานดัชนีคุณภาพอากาศทุกเช้าโดยใช้ LINE official Account, LINE Message API, Cloud Functions for Firebase และข้อมูลจาก AirVisual ในการพัฒนาไว้ใช้งานเพื่อรับข้อมูลดัชนีคุณภาพอากาศ วันนี้เลยอยากจะมานำเสนอวิธีการทำ AQI LINE Bot แบบง่ายๆ ไว้ใช้งานกันครับ

ก่อนอื่นอยากให้ใครที่ยังไม่รู้จัก LINE Bot อยากให้ไปอ่านบทความนี้ก่อนครับ ปฐมบทการสร้าง LINE Bot และใครที่ยังไม่รู้จัก Cloud Functions for Firebase ก็จงไปทำความรู้จัก และติดตั้งให้พร้อมกับการพัฒนากันก่อนที่บทความนี้ครับ รู้จัก Cloud Functions for Firebase ตั้งแต่ Zero จนเป็น Hero


1. สมัครเพื่อรับข้อมูลจาก AirVisual

—ในการติดตามดัชนีคุณภาพอากาศสามารถเข้าไปติดตามได้ที่ https://www.airvisual.com/ ได้เลยครับ โดยทาง AirVisual ใจดีได้มี API ให้เราไว้ใช้รับข้อมูลมาใช้งานได้ฟรีโดยเริ่มจากลงทะเบียนกับทาง AirVisual ก่อนแล้วให้ทำการ Login เข้าระบบแล้วไปที่ API ก่อนครับเพื่อสร้าง Key ไว้รับข้อมูล และอ่าน Document เพื่อดูว่ามีอะไรบ้างที่เราจะต้องใช้ในการ Request ข้อมูลคุณภาพอากาศ

—หลังจากเข้ามาให้เราสร้าง key ขึ้นมาก่อนโดยจิ้มที่ New Key ได้เลย และซ้ายมือก็จะบอกว่าเราเป็นแบบใช้งานฟรีน่ะ (แค่ฟรีผมคิดว่าก็พอแล้วครับ สำหรับการสร้างไว้ใช้งานส่วนตัว)


2. ระบุพื้นที่ที่ต้องการเพื่อส่ง Request และดูข้อมูลที่ส่งกลับมา

—จากนั้นให้ไปที่ Documentation เพื่อดูว่าต้องใช้ข้อมูลอะไรบ้างในการ Request ข้อมูล และจะมี Response มาแบบไหนเพื่อที่จะได้จัดการข้อมูลในฟังก์ชั่นต่อไปได้ครับ ผมเลือกใช้โดยจะกำหนดพื้นที่ที่ผมอาศัยอยู่ในการขอข้อมูลน่ะครับ โดย Parameter ที่ต้องกำหนดในการ Request ก็จะมี

  • city —> {{CITY_NAME}}
  • state —> {{STATE_NAME}}
  • country —> {{COUNTRY_NAME}}
  • key —> {{YOUR_API_KEY}}

key ได้แล้วในข้อที่ 1

country ดูได้จากตัวอย่างใน Document ซึ่งก็คือ “country”: “Thailand”

ยิง Request ขอ state ด้วย link : api.airvisual.com/v2/states?country={{COUNTRY_NAME}}&key={{YOUR_API_KEY}} อย่าลืมกรอกข้อมูล parameter ด้วยน่ะครับ แล้ว Response ก็จะได้รายชื่อ state กลับมาครับ

ยิง Request ขอ city ด้วย link : api.airvisual.com/v2/cities?state={{STATE_NAME}}&country={{COUNTRY_NAME}}&key={{YOUR_API_KEY}} อย่าลืมกรอกข้อมูล parameter ด้วยน่ะครับ แล้ว Response ก็จะได้รายชื่อ city กลับมาเช่นกัน

หลังจากนั้นก็จะได้ Parameter ที่ต้องการมาครบทั้งหมดแล้วครับ ให้เอาไป Request ดูว่ามีข้อมูลอะไรบ้างส่งกลับมา ตัวอย่างของผมกำหนดที่อำเภอเมืองนนทบุรี จังหวัดนนทบุรี ก็จะได้ link : https://api.airvisual.com/v2/city?city=Mueang Nonthaburi&state=Nonthaburi&country=Thailand&key={{YOUR_API_KEY}}

Response ข้อมูล JSON ที่ได้มามีอะไรบ้างมาดูกันครับ และที่ผมสนใจให้ LINE Bot รายงานมีอยู่ 3 ค่า คือ

  • city
  • tp = temperature in Celsius
  • aqius = AQI value based on US EPA standard
{
    "status": "success",
    "data": {
        "city": "Mueang Nonthaburi",
        "state": "Nonthaburi",
        "country": "Thailand",
        "location": {
            "type": "Point",
            "coordinates": [
                100.51477,
                13.86075
            ]
        },
        "current": {
            "weather": {
                "ts": "2019-11-09T11:00:00.000Z",
                "tp": 28,  //temperature in Celsius
                "pr": 1011,
                "hu": 58,
                "ws": 2.1,
                "wd": 100,
                "ic": "02n"
            },
            "pollution": {
                "ts": "2019-11-09T13:00:00.000Z",
                "aqius": 120,  //AQI value based on US EPA standard
                "mainus": "p2",
                "aqicn": 61,
                "maincn": "p2"
            }
        }
    }
}

3. สร้าง LINE Bot ด้วย Cloud Functions for Firebase

ก่อนอื่นอยากให้เพื่อนๆ อ่านบทความนี้ก่อนครับ สร้าง Cron Job ด้วย Cloud Functions for Firebase ง่ายนิดเดียว ซึ่งจะมีตัวอย่าง Code ให้มาด้วยครับ

ในส่วนของ Code ที่ผมทำก็จะเพิ่มเงื่อนไขให้รายงานระดับความรุนแรงมาด้วยตามค่า AQI ที่ได้รับมาครับ มาดูหน้าตา Code กันเลยดีกว่า

Update 16 ธันวาคม 2562

ถ้าสร้างโปรเจคแล้วทำการ Deploy functions ไม่ผ่านแล้วพบ Error แบบนี้

Error: Cloud resource location is not set for this project but scheduled functions requires it. Please see this documentation for more details: https://firebase.google.com/docs/projects/locations

ซึ่งเมื่อได้อ่าน Firebase Document : https://firebase.google.com/docs/projects/locations จะพบว่าหากเราต้องการ Run Scheduled functions จะต้องตั้งค่า Google Cloud Platform (GCP) resource location ให้กับโปรเจคเราก่อนถึงจะยอมให้ Deploy ผ่าน เพื่อนๆ สามารถไปตั้งค่าได้ที่ รูปฟันเฟือง —> Project settings —> General ซึ่งจะตั้งค่าได้แค่ครั้งเดียวแล้วจะแก้ไขไม่ได้น่ะครับ หลังจากตั้งค่าแล้วให้ทำการ Deploy ใหม่อีกครั้งครับ


4. ได้ AQI LINE Bot มาแล้ว

ทุกเช้าเวลา 08.00 น. ผมก็จะได้ข้อมูลดัชนีคุณภาพอากาศมาเพื่อเตือนตัวเองในทุกเช้าก่อนออกไปทำงานให้หยิบหน้ากากติดไปด้วย แต่จากที่ผ่านมาดัชนีคุณภาพอากาศแย่ทุกวัน 😷

Update 11 พฤศจิกายน 2562 แก้ไขข้อความให้เป็นแบบ Flex Message โดยใช้ Flex Message Simulator ไปดูตัวอย่าง JSON ไฟล์ได้เลย

ทำความรู้จักกับ Flex Message ได้ที่ 2 บทความนี้เลยครับ

Update 12 พฤศจิกายน 2562 สร้างฟังก์ชันให้รับข้อมูลตำแหน่งของผู้ใช้งานเพื่อตอบกลับค่าดัชนีคุณภาพอากาศ ณ พื้นที่ที่ต้องการซึ่ง AirVisual จะเอาค่าจากจุดวัดที่ใกล้เคียงกับตำแหน่งของผู้ใช้ส่งมาให้โดยให้ผู้ใช้งานกดแชร์ Location ให้ Bot เหมือนกับการแชร์ให้เพื่อนได้เลยครับ ใครสนใจก็ไปดูตัวอย่าง Code แบบ Noob Noob ได้ครับ


ท้ายสุด บทความนี้ก็ไม่ได้ลงในรายละเอียดมากน่ะครับ เพราะเห็นว่าหลายๆ บทความที่อ้างถึงนั้นเขียนได้ดีและมีรายละเอียดที่ครบถ้วนมากๆ แล้วครับ หากต้องการความถูกต้องแม่นยำอาจจะต้องพิจารณา API ของผู้ให้บริการอื่นๆ ดูครับส่วน AQI LINE Bot นี้ก็คงต้องพัฒนาต่อในเรื่อง Flex Message เพื่อให้ข้อความดูสวยและน่าสนใจมากขึ้น รวมทั้งพัฒนาในส่วนที่ต้องรับข้อมูลตำแหน่งของผู้ใช้งานเพื่อดูค่าดัชนีคุณภาพอากาศ ณ พื้นที่ที่ต้องการได้เลยครับ หวังว่าคงจะเป็นแนวทางให้กับเพื่อนๆ ในการทำงานได้น่ะครับ…Happy Coding! 😀


โปรโมชั่น คูปองส่วนลด และดีล ที่ดีที่สุดของร้านค้าออนไลน์กว่า 300 แบรนด์พร้อมรับเงินคืนจาก ShopBack
🔗 https://bit.ly/3c4tlmV

Ruk-Com จดโดเมน-เช่าโฮสต์ ราคาประหยัด พร้อมให้บริการใน 1 นาที
🔗 http://bit.ly/36q8A12