Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> อีเมล

สร้างไฟแจ้งเตือน Gmail ด้วย Raspberry Pi

ในโปรเจกต์ Raspberry Pi ไว้นี้ คุณจะเรียนรู้สร้างไฟแจ้งเตือนอีเมล Gmail หากมีอีเมลยังไม่อ่าน Python script จะเปิด LED โปรเจกต์ต้องการชิ้นส่วนน้อย เสร็จภายใน 1 ชั่วโมง! คุณตกแต่ง LED ได้อย่างไรก็ได้ เช่น Minecraft Redstone Block หรือวัตถุ 3D Print พลาสติกใส นี่คือผลลัพธ์:

สิ่งที่ต้องการ

  • 1 x Raspberry Pi
  • 1 x Breadboard
  • 1 x ตัวต้านทาน 220 ohm
  • 1 x LED 5mm
  • 1 x บัญชี Gmail
  • สาย Male-to-female jumper wires

Raspberry Pi รุ่นไหนก็ทำงานได้ — แม้ Pi Zero! ใช้ GPIO pin เพียง 1 pin ไม่หนัก CPU หากมี Pi Starter Kit ก็มีชิ้นส่วนพอ

แผนการสร้าง

โปรเจกต์ง่ายมาก LED ต่อกับ GPIO Pin บน Pi Python script เรียบง่าย จะรันทุกช่วงเวลา ตรวจสอบอีเมลยังไม่อ่าน เปิด/ปิด LED ตามผลลัพธ์

ฮาร์ดแวร์

ต่อ Positive Anode (ขายาว) ของ LED กับตัวต้านทาน แล้วต่อ GPIO Pin 14 ใช้ GPIO pin ไหนก็ได้ แต่ดู Pinout ก่อน เพราะแตกต่างเล็กน้อยระหว่างรุ่น Negative Cathode (ขาสั้นมีขอบแบน) ต่อ Ground

Pi Setup

ถ้า Pi มี OS ติดตั้งแล้ว ไม่ต้อง Setup มาก (ไม่แน่ใจต้องการอะไร? เรียนรู้ติดตั้ง OS ได้ที่นี่) เปิด Terminal ใหม่ (Top left > Menu > Accessories > Terminal) บน Pi สร้างโฟลเดอร์ใหม่เก็บ Python script ใส่คำสั่ง:

pwd

ย่อมาจาก "Print Working Directory" แสดงโฟลเดอร์ปัจจุบัน (ค่าเริ่มต้น "/home/pi") เข้าโฟลเดอร์ Documents สร้าง Directory ใหม่ชื่อ "gmail_python":

cd Documents/
sudo mkdir gmail_python

คำสั่ง "mkdir" = "Make Directory" ต่อจากนี้คือชื่อ Directory ควรเห็น Directory แล้ว:

ls

หากผิด ลบ Directory ได้ง่าย:

sudo rm -r gmail_python

เข้า Directory ใหม่:

cd gmail_python/

สร้าง Python script ใหม่:

sudo nano check_messages.py

จะสร้างไฟล์และเปิดแก้ไขใน Nano ใช้โปรแกรมอื่นได้ เช่น Vim แต่ Tweet นี้สรุปความรู้สึกของผม:

ขอเล่นๆ ดู Comparison ระหว่างทั้งสองได้ที่นี่

กด CTRL + X ออกจาก Nano กลับ Terminal

Python Setup

Pi Setup เสร็จ ถึงขั้นเขียนโค้ด โปรเจกต์ต้องการ Gmail Python Library โดย Charlie Guo ดาวน์โหลดจาก Github แตกไฟล์ ภายในมีโฟลเดอร์ "gmail" คัดลอกโฟลเดอร์ทั้งหมดไป "/home/pi/Documents/gmail_python"

กลับ Command line เปิด Script อีกครั้ง (กด Up key ดูคำสั่งก่อนหน้า):

sudo nano check_messages.py

สังเกตคำสั่งเหมือนตอนสร้างไฟล์ — ถ้าไฟล์มีอยู่จะเปิด ไม่มีจะสร้าง นี่คือ Python:

import gmail, RPi.GPIO as GPIO, time # import modules
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
g = gmail.login('YOUREMAIL@gmail.com', 'YOUR PASSWORD')
unread_messages = g.inbox().mail(unread=True)
total_messages = 0
for message in unread_messages:
 total_messages += 1
if total_messages > 0:
 # there are unread emails, turn light on
 GPIO.output(14, True)
else:
 # there are no unread emails, turn light off
 GPIO.output(14, False)

คุณต้องใส่ Username และ Password เพื่อให้ทำงาน หากไม่สะดวก (หรือใช้ Two-factor Authentication) ต้องเชื่อม Gmail ด้วย OAuth2 ค่อนข้างซับซ้อนสำหรับ Tutorial นี้ แต่ Google มี Getting Started Guide ดีเยี่ยม

มาแยกโค้ด: Import modules ก่อน Modules ใน Python คือโค้ดชิ้นเล็กๆ สำหรับวัตถุประสงค์เฉพาะ (คล้าย Libraries ใน Arduino IDE) RPi.GPIO เป็น Module เฉพาะ Pi เข้าถึง GPIO, gmail คือ module ที่โหลดมา, time เป็น module built-in ให้ฟังก์ชันเวลา "GPIO.setmode" และ "GPIO.setup" บอก Pi ว่า Pin 14 เป็น Output และใช้ "Broadcom Pin Numbering" (BCM)

บรรทัดนี้เชื่อมบัญชี Gmail สร้าง Object ชื่อ "g" เรียก login method ของ gmail module ที่ import ไว้ อย่าลืมใส่อีเมลและรหัสผ่าน Gmail

g = gmail.login('YOUREMAIL@gmail.com', 'YOUR PASSWORD')

ดึงข้อความยังไม่อ่านทั้งหมด เก็บในตัวแปร "unread_messages":

unread_messages = g.inbox().mail(unread=True)

สังเกต "unread=True" ส่งเป็น Parameter เปลี่ยนได้เพื่อดึงข้อความตามเงื่อนไขอื่น เช่น Sender หรือ Subject ดู API Documentation เพิ่มเติม

For loop วนลูปทุกข้อความ:

for message in unread_messages:
 total_messages += 1

For loop มีประโยชน์มาก ทำซ้ำบล็อกโค้ดหลายครั้ง มักมีค่าแตกต่างเล็กน้อยทีละรอบ ลูปนี้วนทุกข้อความใน unread_messages เพิ่มตัวแปร "total_messages"

สุดท้าย If statements เรียบง่าย: ถ้ามีอีเมลยังไม่อ่าน เปิด LED มิฉะนั้น ปิด

จำไว้ Python Case-sensitive และใช้ White spacing หากรันโค้ดไม่ได้ ลองเว็บนี้ วาง Python กด "validate above python code" จะบอก Error (ถ้ามี)

สลับไป Terminal รัน Script:

python check_messages.py

คำสั่งนี้รัน Script ลองเปลี่ยนอีเมลใน Inbox เป็น Unread แล้วรันอีกครั้ง — ควรเห็น LED ติด/ดับตาม Inbox

Cron Setup

Script ทำงานแล้ว ถึงขั้นทำให้อัตโนมัติ วิธีง่ายที่สุด: Cron Job ใช้จัดตารางงาน/Script เช่น Automated Backups เปิด Crontab (รายการ Scheduled Tasks):

crontab -e

หากยังไม่มี Scheduled Tasks ไฟล์จะว่าง (อาจมี Documentation/Comments นำหน้าด้วย "#") หากมีรายการอยู่ ใส่คำสั่งใหม่บรรทัดใหม่:

* * * * * python ~/pi/Documents/gmail_python/check_messages.py

5 ดาว ("* * * * *") ระบุความถี่รันงาน (ปรับละเอียดได้ เช่น ทุกวันพุธที่ 2 สัปดาห์ละครั้ง 2.00) 5 ดาวนี้ = รันทุกนาที ช่วงเล็กสุดที่อนุญาต (เรียนรู้ Cronjob Scheduling เพิ่ม) "python" บอก Scheduler รัน Script เป็น Python file สุดท้าย "~/pi/Documents/gmail_python/check_messages.py" คือ Absolute File Path ไปยัง Script — Relative Path ไม่ได้

ตอนนี้คุณมี Gmail Notification Light ของตัวเองแล้ว! ปรับเปลี่ยนให้ค้นหาข้อความตามเงื่อนไข/ตัวกรองอื่นได้ง่าย (เรียนรู้ Filters ที่นี่) หรือรันโค้ดอื่น — เช่น สร้าง Twitter Bot โพสต์จากอีเมล (เรียนรู้สร้าง Pi Twitter Bot เพิ่ม)

ไม่ว่าคุณจะเขียน Notification Box อย่างไร ผมอยากรู้ว่าเป็นอย่างไรในความคิดเห็น!