隨著物聯網的蓬勃發展,整合網路服務與實體裝置的需求日益增長。本文示範如何利用 IFTTT 和 Dweet 服務,將 Twitter 的訊息通知轉化為 Raspberry Pi 的控制指令,達成更即時且有效率的裝置互動。透過 Python 程式監聽 Dweet 服務,並結合 GPIO 控制,即可根據 Twitter 上的特定 hashtag 或提及來觸發 Raspberry Pi 的動作,例如控制 LED 燈的開關。此方法避免了傳統輪詢方式的資源浪費,更能即時反應 Twitter 上的訊息變化。此外,文章也深入探討如何使用 Mosquitto 建立 MQTT 伺服器,並結合 Node-RED 進行更進階的家居自動化控制,展現物聯網應用開發的實用技巧。

使用 IFTTT 和 Dweet 監聽 Twitter 並觸發 Raspberry Pi 行動

您想要您的 Raspberry Pi 在偵測到 Twitter 中的特定 hashtag 或提及時執行某些動作。Recipe 16.6 實作了這一功能,但由於它依賴於不斷輪詢網路請求來檢查顏色是否改變,因此效率非常低。

解決方案

一個不依賴輪詢的高效機制是使用 IFTTT(見 Recipe 16.4)來監聽 Twitter 並傳送網路請求給 Dweet 服務,然後 Dweet 服務可以將通知推播給 Raspberry Pi 上執行的 Python 程式(見圖 16-17)。

例如,您可以在 Twitter 中提及您的使用者名稱時,讓 LED 閃爍 10 秒。這需要一些電子元件來控制 GPIO 18 的高電平,例如 Raspberry Squid(見 Recipe 9.10)、單個 LED(見 Recipe 10.1)或繼電器(見 Recipe 10.5)。

步驟

  1. 登入 IFTTT:按照 Recipe 16.4 的步驟登入 IFTTT。
  2. 建立新 Applet:選擇「New Mention of You」作為觸發器,然後選擇 Webhooks 作為動作頻道,最後選擇「Make a web request」並完成相關欄位(見圖 16-18)。
  3. 安裝 dweepy 函式庫:在 Raspberry Pi 上執行 sudo pip3 install dweepy 安裝 dweepy 函式庫。
  4. 編寫 Python 程式:建立一個名為 ch_16_twitter_trigger.py 的 Python 程式,內容如下:
import time
import dweepy
from gpiozero import LED

KEY = 'tweet_about_me'
led = LED(18)

while True:
    try:
        for dweet in dweepy.listen_for_dweets_from(KEY):
            print('Tweet: ' + dweet['content']['text'])
            led.on()
            time.sleep(10)
            led.off()
    except Exception:
        pass
  1. 執行 Python 程式:執行 python ch_16_twitter_trigger.py 啟動程式。

圖表翻譯

此圖示

IFTTT、Dweet 和 Python 的合作過程。

圖表翻譯

IFTTT 監聽 Twitter 並傳送網路請求給 Dweet 服務,Dweet 服務將通知推播給 Raspberry Pi 上執行的 Python 程式,Python 程式控制 LED 的閃爍。

內容解密

  • IFTTT 是一個免費的網路服務,允許使用者建立自訂的 Applet,以便在不同的網路服務之間進行互動。
  • Dweet 是一個允許使用者傳送和接收簡短訊息的網路服務。
  • Raspberry Pi 是一款低成本的微型電腦,可以用於各種專案,包括物聯網和機器人。
  • Python 是一種高階程式語言,廣泛用於各種領域,包括網路開發、資料分析和人工智慧。

程式碼解說

  • dweepy 函式庫是一個 Python 函式庫,允許使用者與 Dweet 服務進行互動。
  • listen_for_dweets_from 函式用於監聽 Dweet 服務的通知。
  • LED 類別用於控制 LED 的閃爍。
  • time.sleep 函式用於暫停程式的執行。

家居自動化入門

家居自動化是一個讓家居變得更加智慧和自動化的領域,讓家居可以根據使用者的需求和設定進行自動控制。作為一個低成本和低功耗的裝置,Raspberry Pi 是一個理想的家居自動化中心。

使用 Mosquitto 將 Raspberry Pi 變成訊息代理

要將 Raspberry Pi 變成家居自動化中心,首先需要安裝 Mosquitto 軟體,這是一個 MQTT (Message Queuing Telemetry Transport) 代理伺服器。MQTT 是一個輕量級的訊息傳遞協定,廣泛用於物聯網和家居自動化應用。

安裝 Mosquitto 的步驟如下:

  1. 更新套件列表:sudo apt-get update
  2. 安裝 Mosquitto 和其客戶端:sudo apt install -y mosquitto mosquitto-clients
  3. 啟用 Mosquitto 服務:sudo systemctl enable mosquitto.service

安裝完成後,可以使用以下命令檢查 Mosquitto 是否正常執行:

mosquitto -v

這將顯示 Mosquitto 的版本號和編譯日期。

Node-RED 入門

Node-RED 是一個根據 Node.js 的視覺化程式設計工具,廣泛用於家居自動化和物聯網應用。它提供了一個圖形化的介面,讓使用者可以輕鬆地建立和連線不同的節點,實作複雜的自動化流程。

安裝 Node-RED

要安裝 Node-RED,需要執行以下命令:

  1. 更新套件列表:sudo apt-get update
  2. 安裝 Node.js 和 npm:sudo apt install -y nodejs npm
  3. 安裝 Node-RED:sudo npm install -g node-red

安裝完成後,可以使用以下命令啟動 Node-RED:

node-red

這將啟動 Node-RED 伺服器,使用者可以透過瀏覽器存取 http://localhost:1880 來使用 Node-RED。

建立一個簡單的自動化流程

建立一個簡單的自動化流程,需要執行以下步驟:

  1. 啟動 Node-RED 伺服器:node-red
  2. 開啟瀏覽器,存取 http://localhost:1880
  3. 點選「+」按鈕,建立一個新的流程
  4. 將「inject」節點拖拽到流程中
  5. 將「debug」節點拖拽到流程中
  6. 連線「inject」節點和「debug」節點
  7. 點選「deploy」按鈕,佈署流程

這將建立一個簡單的自動化流程,當「inject」節點被觸發時,將輸出一條訊息到「debug」節點。

圖表翻譯:
  graph LR
    A[Raspberry Pi] -->|安裝 Mosquitto|> B[Mosquitto]
    B -->|啟用服務|> C[Mosquitto 服務]
    C -->|檢查版本|> D[Mosquitto 版本]
    D -->|安裝 Node-RED|> E[Node-RED]
    E -->|啟動 Node-RED|> F[Node-RED 伺服器]
    F -->|建立流程|> G[簡單自動化流程]
    G -->|佈署流程|> H[自動化流程]

這個圖表顯示瞭如何使用 Mosquitto 和 Node-RED 建立一個簡單的自動化流程。

MQTT 通訊協定簡介

MQTT(Message Queuing Telemetry Transport)是一種輕量級的通訊協定,適用於物聯網(IoT)裝置之間的訊息傳遞。它採用釋出/訂閱(Publish/Subscribe)模型,允許裝置之間進行訊息交換。

MQTT 架構

MQTT 系統由兩部分組成:

  1. 伺服器(Server):負責控制和路由訊息的中央節點。
  2. 客戶端(Client):可以傳送和接收訊息的程式或裝置。

MQTT 訊息結構

MQTT 訊息由兩部分組成:

  1. 主題(Topic):用於標識訊息的型別或目的。
  2. payload:訊息的內容,可以是任何形式的資料。

MQTT 工作流程

  1. 客戶端連線:客戶端連線到伺服器並訂閱感興趣的主題。
  2. 釋出訊息:客戶端釋出訊息到伺服器,指定主題和 payload。
  3. 伺服器路由:伺服器接收到訊息後,將其路由到所有訂閱了相同主題的客戶端。
  4. 客戶端接收:客戶端接收到訊息後,可以處理 payload 中的資料。

Mosquitto 伺服器

Mosquitto 是一種流行的開源 MQTT 伺服器,支援多種平臺和語言。它提供了高效、可靠和安全的訊息傳遞功能。

Mosquitto 客戶端工具

Mosquitto 提供了兩個客戶端工具:

  1. mosquitto_sub:用於訂閱主題和接收訊息。
  2. mosquitto_pub:用於釋出訊息到指定主題。

示例

以下是使用 Mosquitto 伺服器和客戶端工具進行 MQTT 通訊的示例:

  1. 啟動 Mosquitto 伺服器。
  2. 開啟兩個終端視窗,分別用於訂閱和釋出訊息。
  3. 在第一個終端視窗中,使用 mosquitto_sub 訂閱一個主題(例如 pi_mqtt)。
  4. 在第二個終端視窗中,使用 mosquitto_pub 釋出一個訊息到相同的主題(例如 pi_mqtt)。
  5. 第一個終端視窗中會接收到釋出的訊息。

這個示例展示了 MQTT 的基本工作流程和 Mosquitto 伺服器和客戶端工具的使用方法。

使用Node-RED與MQTT伺服器

問題

您想要結合Node-RED與MQTT伺服器,以控制一般用途輸入/輸出(GPIO)引腳,例如根據MQTT訊息發布來控制GPIO 18的開關。

解決方案

使用Node-RED的“mqtt”節點和“rpi gpio”節點,在Node-RED流程中,如圖17-2所示。 佈署後,您可以透過MQTT訊息發布來控制GPIO 18的開關。為了測試,請將LED或Raspberry Squid LED連線到引腳18(參考配方10.1)。 流程中提到的“kitchen lights”是假設GPIO 18被用於控制照明開關(參考配方10.6)。

步驟

  1. 從Node-RED的“input”類別中新增“mqtt”節點。
  2. 雙擊節點以編輯它(圖17-3)。
  3. 指定一個主題(kitchen_lights)並給節點一個有意義的名稱。
  4. QoS欄位允許您設定服務品質,確定MQTT伺服器如何將訊息傳遞給目的地。級別2表示保證交付。
  5. 定義一個MQTT伺服器給Node-Red,點選“Edit”按鈕旁邊的“Server”欄位。
  6. 給伺服器一個名稱並輸入“localhost”在“Server”欄位,因為Node-RED和MQTT伺服器執行在同一臺Raspberry Pi。
  7. 新增“rpi-gpio out”節點,選擇“12 - GPIO 18”並給節點一個名稱。
  8. 將“mqtt in”節點連線到Raspberry Pi GPIO節點,使流程看起來像圖17-2。
  9. 點選“Deploy”按鈕並在Raspberry Pi上開啟一個終端會話來測試流程。

測試

在終端視窗中輸入以下命令來發布一個請求以開啟燈:

$ mosquitto_pub -d -t kitchen_lights -m 1

LED應該會亮起。然後,傳送以下命令來關閉LED:

$ mosquitto_pub -d -t kitchen_lights -m 0

討論

此配方只在Raspberry Pi位於您想要控制的東西旁邊時才有效。在實際情況下,您可能想要使用無線開關。 然而,瞭解如何透過MQTT和Node-RED控制GPIO引腳是有用的。 Node-RED可以匯入和匯出流程作為JSON文字。所有在此章節中使用的流程都可以在書籍的GitHub頁面上找到。

圖表翻譯:

  flowchart TD
    A[開始] --> B[新增mqtt節點]
    B --> C[編輯mqtt節點]
    C --> D[定義MQTT伺服器]
    D --> E[新增rpi-gpio out節點]
    E --> F[連線節點]
    F --> G[佈署流程]
    G --> H[測試流程]

內容解密:

以上步驟展示瞭如何使用Node-RED和MQTT伺服器控制GPIO引腳。透過這個配方,您可以瞭解如何使用MQTT訊息發布來控制一般用途輸入/輸出引腳。

隨著物聯網(IoT)的蓬勃發展,如何有效地整合各種服務和硬體平臺成為關鍵。本文深入探討瞭如何利用 IFTTT、Dweet 和 MQTT 等技術,實作根據 Twitter 事件觸發 Raspberry Pi 行動,並進一步延伸至建構家居自動化系統的應用。透過整合這些服務,不僅可以提升訊息傳遞效率,擺脫傳統輪詢機制的低效,更能展現高度客製化的應用潛力。

分析 IFTTT 與 Dweet 的整合方案,其核心價值在於非同步通訊的匯入。相較於 Recipe 16.6 的輪詢方式,此方案顯著降低了系統資源消耗,並提升了事件回應速度。然而,該方案仍存在依賴第三方服務的風險,例如 IFTTT 或 Dweet 服務中斷可能導致系統失效。此外,安全性也是必須考量的因素,需妥善保護 IFTTT 和 Dweet 帳號安全,避免未經授權的控制。

展望未來,隨著邊緣運算的興起,預期更多運算和邏輯將下放到邊緣裝置,例如 Raspberry Pi。因此,直接在 Raspberry Pi 上執行 MQTT Broker 並結合 Node-RED 進行流程控制,將成為更具彈性且安全的解決方案。此架構可減少對雲端服務的依賴,並提升系統的自主性和可靠性。

玄貓認為,理解並善用這些技術,將有助於開發者打造更具智慧和效率的 IoT 應用。對於追求系統自主性和安全性的開發者而言,建議優先考慮根據 MQTT 和 Node-RED 的本地化方案,並持續關注邊緣運算技術的發展趨勢。