透過Node-RED橋接Yahoo天氣資訊並發佈至MQTT Broker

現有輕量化網路服務的通訊協定眾多,例如:AMQP、XMPP、STOMP、MQTT、CoAP等。在推廣 IoT 雛形系統實作上,仍以瘦身成效最好的 MQTT 和 CoAP 鶴立雞群(訊息最短只需要幾個byte),尤其是 MQTT,在設計與數位媒體領域的跨領域 IoT 雛型系統實作上,不僅易學易用,相容性與應用也很廣(與 OSC 相容性高)。

最近帶工作營時,想找天氣資訊當做一般 MQTT 頻道來訂閱,但遍尋不著現成的服務,於是就手癢了(摩拳擦掌)。

這篇文章分享將 Yahoo! 天氣資訊轉發至 MQTT 的做法,包括以下步驟:

  1. 透過 REST API 讀取 Yahoo! 天氣資訊,回傳格式為 JSON。
  2. 用 Node-RED 擷取 JSON 格式中數值,轉發至 MQTT Broker。
系統要求:MQTT Broker、Node-RED(需要 Node.js 環境)。上述二者我都安裝在 Synology NAS 上(另文介紹安裝步驟)。

步驟一:抓 JSON 格式的 Yahoo! 天氣資訊


首先,到 Yahoo! 天氣網站,搜尋所在地的地理編號(WOEID: Where On Earth ID),或者用這個 WOEID 搜尋網站


在 Yahoo! 天氣網站搜尋地點、點選進去之後,網址裡面就有 WOEID 了,例如:

https://www.yahoo.com/news/weather/taiwan/yunlin-county/douliu-city-91290411

尾巴的數字 91290411 就是斗六的 WOEID。


接著,到 Yahoo! Developer Network 的 YQL Console (選擇 weather.forecast 服務),將搜尋字串中 woeid=XXXXXX 的數字置換為新的地理編號,按下 Test 鈕就會看到該地點的天氣資料了。資料格式可選擇 JSON 或 XML,預設為 JSON。



在畫面下方,有一欄綠色標題字 THE REST QUERY,將底下的網址複製起來。應該長得像這樣:
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%3D2502265&format=json&diagnostics=true&callback=
這就是之後要用來抓即時天氣資訊的 REST 網址。若要測試,可以將網址填入瀏覽器,回傳內容就是 JSON 格式的斗六天氣資訊。

步驟二:將天氣資訊轉發至 MQTT Broker


進入 Node-RED 介面,開啟新工作流程(Flow)。


問:如何讓 Node-RED 成為每次開機都會自動執行的常駐服務,不需要手動啟動?
答:用Node.js的程序管理套件pm2

留言