智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

作者:GeekOn

導讀:話說對了才有用,沒用的叫囉嗦;事做對了才有用,不然叫磨洋工。

什麼叫有用實在是見仁見智,話說出來有人愛聽,事做出來有人開心,就夠了。

就說我吧,出門下樓,下雨了,沒帶傘;大太陽,沒戴帽子墨鏡,只好心裡一萬個不情願。所以第一個要做的就是出門提醒,尤其是下雨這件事情實在是。。。。

程式設計嘛,總是要有邏輯:

開門檢測天氣預報條件分流播放提醒

老規矩,先增加天氣預報的功能到Homeassistant中,系統自帶了現成的英文天氣預報,HA管理頁->

側邊欄

->

配置

->

整合

->“

+

”,

Meteorologisk institutt (Met.no)

跳出來的對話方塊中填好名字,和經緯度就可以了,預設的經緯度就是你當前的位置。如果需要選定地點的經緯度,1、你可以上網去找,2、

側邊欄

->

配置

->

地點

->“

+

” 在跳出的地圖上選擇你要的地方,就會有對應的經緯度顯示出來。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

圖上是個有意思的地方,當然不是你的經緯度,如果是家裡的話,半徑小一點,100左右就可以了。

Met。no設定好之後,就可以到HA管理頁新增天氣預報卡片:

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

看起來還是蠻好看的。

既然說了是進階,那麼就要用上函式和變數,DIY的時候總得要有所追求,不然就沒得提高了不是。上Node-RED

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

今天用五個部件,三個新部件

current_state

在流程中檢測某個實體(entity_id)的當前狀態。

switch

是一個分流器,透過設定不同的關鍵字來選擇或者過濾輸出,每一個輸出點都對應一個條件。

函式

函式是個很有用的部件,在屬性頁裡可以寫很多東西,有點類似於語言程式設計了。進階嘛,總得有點小難度。

event:state

不多講,和之前一樣的設定方式,entity_id設定為Door(門),state設定為on,就是開門就輸出一條訊息。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

call service

不多講,這裡設定為tts 到 google home。注意的是Data留空,用

函式

來控制。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

current_state

如其名,就是檢測當前狀態,並傳遞到下一個部件。State留空,就是不管是什麼狀態都在同一個輸出節點。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

switch

也不難,按照天氣狀態來新增分流條件。多個條件透過屬性頁左下的新增按鈕來增加。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

函式

來了,屬性頁開啟基本啥都沒有,想起一句歌詞“空,空,空,空如也”。就像賺錢,越是啥都不幹的越賺錢。這東西也一樣,空,但很牛X。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

msg。payload 負責告訴下一個接收部件訊息的來源;變數內容則是要傳到下一個部件的具體內容,這裡我們要傳遞到下一個流程的

Data

(在call service中留空了),所以變數名稱就是

"data":

,call service是TTS,所以data的格式按照tts的需求去寫,“message”、“Language”。

變數中語句多於一行,記得加“,”分割,最後一行不需要(初學之坑)。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

按照上圖

部署

之後,當門開啟時,如果天氣預報下雨,HA就會透過Google home說話提醒帶傘。

既然switch設定了5個輸出口,那另外四個怎麼用呢,可以透過設定每個不同的tts home來對應,不過這樣的話還要函式幹甚呢,所以

函式

不是這樣用的。

函式的進階使用

Switch

的屬性也有一項msg。payload,也就是說switch的輸出訊息也是透過msg。payload來傳遞,那麼在

函式

中就可以引用啦。

智慧家居 篇十:第八章 說有用的話,做有用的事 ——Notify的進階

初學的時候,可以把需要帶傘的,和只是需要報一下天氣的分開,這個時候

switch

就有用啦,如果再進階,函式中可以直接使用

if else

來判斷,那麼switch都不需要了。。。。

#附上程式碼:

var mesg = “”

var laug  = “en-us”

if (msg。payload == “rainy”)

{

mesg = “take a umbrella。”

}

else

if (msg。payload == “tornad”)

{

mesg = “體重不夠,不要出門”,

laug = “zh-cn”

}

else

if (msg。payload == “hail”)

{

mesg = “請自帶鐵鍋。”,

laug = “zh-cn”

}

msg。payload =

{

“data”:

{

“message”: “outside is ” + msg。payload + mesg,

“language”: laug

}

}

return msg;

函式的使用同樣見仁見智,會成為HA程式設計中最有趣的部分,比起新增多個部件來達到同樣的效果,函式更能夠把流程精簡下來。

記得買輸出裝置