樹莓派 + Home Assistant + HomeKit 從零開始打造個人智能家居系統 篇三:進階配置 Home Assistant

通過本篇教程,你將完成對 Home Assistant 的進一步配置,個性化設置與管理你的智能家居設備。

題外話

關於智能家居,我與很多人一樣,因新房裝修而開始關注,2014 年智能家居市場方興未艾,還是傳統智能家居廠商的天下,同年 Apple 在 WWDC 上發佈了 HomeKit 智能家居平台,到了 2015 年才在 iOS 9 中內置了「家庭」App。而在這一年,國內也誕生了小米智能家庭、阿里智能、京東微聯等平台,可以說,智能家居領域我們是和世界同步的。

2016 年接觸了 HomebridgeHomeKitHome Assistant 等內容,我就嘗試着自己也整一套試試。用戶規模決定了相關領域的繁榮,網上關於智能家居的文章汗牛充棟,我自認為還是有些軟硬件基礎,期間卻也走過不少彎路。如今跟大家分享這一點個人愛好,也不免拾人牙慧,因為官方文檔就在那裡,你不可能跳出這個框架之外。書寫這個系列文章的初衷,就是想讓更多人能夠加入進來,哪怕是零基礎的小白。所以我會選擇一個我認為最筆直的路給你,我會添加很多的引用,還會提到一些我認為容易錯的點,並且盡量不涉及代碼與命令行,與其說是原創教程,不如說是一個中文版本的注釋或詮釋更為恰當。

有人跟我說,還是太複雜,99%的有智能化需求的客戶不會花時間去整這些。

那麼,這就是為了那1%不滿足現有平台和 App 的用戶而生的,足矣。

一、檢查配置

有不少人反饋,在安裝和配置中遇到了問題,或是 Home Assistant 界面直接無法顯示,又或是某一個組件沒有正常顯示,通常後者還能在系統首頁看到相關提示。

每當組件或配置選項導致警告時,相關信息將存儲在配置目錄下的 home-assistant.log 文件中。此文件在 Home Assistant 開始時重置。

Home Assistant 大多數異常情況都是因為 configuration.yaml 文件錯誤而導致的,而新手通常在不同地方取得這些配置,不同論壇、網站對於代碼的顯示效果是不同的,非常容易導致 YAML 文件語法錯誤,在修改 configuration.yaml 配置文件後,可在側面板 Configuration > General > Configuration Validation 處檢查,通過後再重啟服務。

▲檢查配置文件

還是推薦使用支持 YAML 語法的 Sublime 或者 Atom 對 configuration.yaml 進行修改,能夠實時發現錯誤。

複習一下 YAML 基本語法規則:

■ 大小寫敏感

■ 使用縮進表示層級關係

■ 縮進時不允許使用Tab鍵,只允許使用空格。

■ 縮進的空格數目不重要,只要相同層級的元素左側對齊即可

對於同一種類的組件,如果有多個,或者多個不同平台的設備,按以下格式填寫:

sensor: # 組件名,在配置文件中不能重複

– platform: forecast

– platform: bitcoin

二、自定義設備

一般設備接入後,顯示的名稱是一長串信息,如下圖左邊第一行設備所示,而自定義後,如下圖右邊所示。

▲設備顯示

獲取設備 ID

所有設備在 Home Assistant 中進行配置,都有一個唯一的 ID,這個 ID 在側面板 Developer Tools 中的 「<>」States 中獲得。

▲獲取設備 ID

別問我怎麼區分同一類的不同設備,名字那麼像,在首頁操作哪個,哪個有反應,就是那個。?

配置文件

configuration.yaml 文件中,添加 customize: ,示例如下:

homeassistant:
name: Home
unit_system: metric
# 示例
customize: # 注意縮進 customize 屬於 homeassistant 下級,與 name 同級
sensor.living_room_motion: # 設備 ID
friendly_name: 客廳動作傳感器 # 昵稱 即你想要的設備名
icon: mdi:run # 圖標 即設備左側顯示,詳情見下方引用
hidden: true # 是否在 Home Assistant 中隱藏
homebridge_name: 動作傳感器 #在 iOS 家庭 App 中的名稱
homebridge_hidden: false #是否在 iOS 家庭 App 中隱藏
thermostat.family_room:
entity_picture: https://example.com/images/nest.jpg #顯示圖片,與圖標二選一
friendly_name: Nest
switch.wemo_switch_1:
friendly_name: Toaster
entity_picture: /local/toaster.jpg
switch.wemo_switch_2:
friendly_name: Kitchen kettle
icon: mdi:kettle

保存後,可在側面板找到 Configuration > General > Configuration Reloading > RELOAD CORE,重載相關配置,而無需重啟 Home Assistant 服務。

更多自定義內容見官方文檔

icon 圖標設置,採用 Material Design Icons 網站內的圖標,在icon: mdi: 後輸入想要的圖標名稱。

三、設備分組分頁

設備顯示

設備添加後默認都是獨立的,一部分可控制的以卡片(Card)形式顯示,還有一部分僅顯示信息的以徽章(Badge)形式顯示。有些同類設備也會有默認分組(Light、Switch 等)。設備數量增多後就會顯得十分不便。

▲默認顯示

而下圖中,玄關、客廳、餐廳等等,雖然同處於一個頁面內,每一個又包含了多個設備,但是明確的分類與組合,使得使用效率與體驗大大提升。Home Assistant 採用組(Group)的概念來組合設備,玄關、客廳等,每個都是一個組(Group),你可以根據自身需求,任意設置不同的「組」,同一設備可加入多個「組」,甚至「組」也能嵌套「組」。

▲設備分組

設備分組

繼續圖中房間分類為例,要實現這樣的效果,需要在 configuration.yaml 文件中,添加 group: ,示例如下:

homeassistant:
name: Home
unit_system: metric
# 示例
group: # 注意縮進 group 與 homeassistant 同級
rooms_view: # 這是整個 ROOMS 頁的設置 下節會講解分頁
name: ROOMS # 顯示名稱
view: yes #是否分頁 即在頁頭顯示
entities: # ROOM 分頁下的組
– group.Entrance # 玄關
– group.LivingRoom
– group.DinnerRoom
– group.CookRoom
– group.BedRoom1
– group.BedRoom2
Entrance: # 一個典型的 group,這一行名字自定義
name: 玄關 # 顯示名稱
view: no # 不分頁,
icon: mdi:home-variant # 組作為一個整體時的圖標
entities: # 組下包含設備
– binary_sensor.door_window_sensor_xxxxxx # 玄關入戶門 ID
– binary_sensor.motion_sensor_xxxxxxxxxx # 玄關人體傳感器 ID
– switch.plug_158d0000fa791f # 玄關入戶燈 ID
LivingRoom:
name: 客廳
view: no
icon: mdi:sofa
entities:
– sensor.temperature_xxxxxxxxxx
– sensor.humidity_xxxxxxxxxx
– binary_sensor.motion_sensor_xxxxxxxxxx
– switch.wall_switch_right_xxxxxxxxxx
– switch.wall_switch_right_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
– media_player.marantz_nr1504
DinnerRoom:
name: 餐廳
view: no
icon: mdi:glass-tulip
entities:
– switch.wall_switch_left_xxxxxxxxxx
– switch.wall_switch_left_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
CookRoom:
name: 廚房
view: no
icon: mdi:pot
entities:
– binary_sensor.motion_sensor_xxxxxxxxxx
– switch.wall_switch_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
BedRoom1:
name: 主卧
view: no
icon: mdi:hotel
entities:
– sensor.temperature_xxxxxxxxxx
– sensor.humidity_xxxxxxxxxx
– switch.wall_switch_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
– switch.plug_xxxxxxxxxx
BedRoom2:
name: 次卧
view: no
icon: mdi:hotel
entities:
– sensor.temperature_1xxxxxxxxxx
– sensor.humidity_1xxxxxxxxxx
– switch.wall_switch_1xxxxxxxxxx
– switch.plug_1xxxxxxxxxx

保存後,可在側面板找到 Configuration > General > Configuration Reloading > RELOAD GROUP,重載相關配置,而無需重啟 Home Assistant 服務。

設備分頁

當設備進一步增多後,可以設置分頁,來更好地顯示設備。如下圖中,我分了「HOME」、「ROOMS」、「DEVICES」、「WEATHER」四個頁面。

▲設備分頁

繼續在 group: 中修改配置,結合上節內容,示例如下:

homeassistant:
name: Home
unit_system: metric
# 示例
group: # 注意縮進 group 與 homeassistant 同級
default_view: # 默認首頁 即 HOME 頁
view: yes # 是否分頁 即在頁頭顯示
entities: # 第一個分頁下的設備與組
– sun.sun
– sensor.now_weather
– sensor.now_tmp
– group.Today
– group.SystemMonitor
– group.Rooms
rooms_view: # 這是整個 ROOMS 頁的設置
name: ROOMS # 顯示名稱
view: yes # 是否分頁 即在頁頭顯示
entities: # ROOM 分頁下的組
– group.Entrance # 玄關
– group.LivingRoom
– group.DinnerRoom
– group.CookRoom
– group.BedRoom1
– group.BedRoom2
devices_view: # 這是整個 DEVICES 頁的設置
name: DEVICES # 顯示名稱
view: yes # 是否分頁 即在頁頭顯示
entities:
– group.Lights
– media_player.marantz_nr1504
– group.Battery
weather_view: # 這是整個 WEATHER 頁的設置
name: WEATHER # 顯示名稱
view: yes # 是否分頁 即在頁頭顯示
entities:
– group.WeatherNow
– group.WeatherToday
– group.WeatherTomorrow
– group.AQI

保存後,可在側面板找到 Configuration > General > Configuration Reloading > RELOAD GROUP,重載相關配置,而無需重啟 Home Assistant 服務。

更多自定義內容見官方文檔

如果你足夠細心,你會發現,在 Developer Tools 中的 「<>」States 中,所有的「組」也有自己的 ID。

四、拓展配置

拆分配置

所有的配置信息都集成在 configuration.yaml 中,可以想像,當設備配置信息增多時,configuration.yaml 將變得十分臃腫,在沒有更好的可視化配置方法之前,我們可以對 configuration.yaml 進行拆分,以提高可讀性。

以上文自定義設備為例,在配置文件夾內新建 customize.yaml 文件獨立存放設備的自定義信息,其中內容如下。

sensor.living_room_motion: #設備 ID 通常會配置以下內容
friendly_name: 客廳動作傳感器 #昵稱 即你想要的設備名
icon: mdi:run #圖標 即設備左側顯示,詳情見下方引用
hidden: true #是否在 Home Assistant 中隱藏
homebridge_name: 動作傳感器 #在 iOS 家庭 App 中的名稱
homebridge_hidden: false #是否在 iOS 家庭 App 中隱藏

再修改 configuration.yaml 文件,以 !include 引用獨立出來的配置信息,如下所示。

homeassistant:
name: Home
unit_system: metric
# 示例
customize: !include customize.yaml
group: !include group.yaml # group 同理

更多請參考官方文檔,請注意,homeassistant: 之後每一行縮進兩個空格。由於Home Assistant中的配置文件是基於YAML語言的,因此縮進和間距很重要。還要注意,customize: 是 homeassistant: 的子級,而 group: 與 homeassistant: 同級。

打包配置

Home Assistant 還提供了一個方法,可以將多個組件、個性化設置、自動化信息捆綁在一起,一同管理。

比如,我有一個「燈+開關」的組合,我對其進行了自定義,並設置了自動化,我可以建立一個名為 my_light_switch_package.yaml 之類名字的文件,來存放這一組合的所有信息,其內容如下:

homeassistant:
customize:
switch.xxxxxx.xxxxx:
friendly_name: XXX
homebridge_name: XXX

switch:
– platform: rest

light:
– platform: rpi

group:
light&switch:
name: XXX
view: no
icon: mdi:light
entities:
– switch.xxxxxx.xxxxx

在這個文件中,不但對接入了組件,還對其進行了自定義,並建立了分組。

接下來在 Home Assistant 配置目錄中創建一個名為「packages」的文件夾,將 my_light_switch_package.yaml 放入其中,在 configuration.yaml 中添加 packages 信息,。

homeassistant:
packages: !include_dir_named packages # 此語句表示會自動調用 packages 文件夾下的文件。注意層級。

官方文檔

五、自定義前端顯示

自定義側面板

我使用 Home Assistant 其中的一個目的就是只用打開一個 App(Web)就可以控制所有設備,利用 Panel iFrame 組件,我們可以將一些常用的 Web 頁面集成到側面板。比如路由器管理頁面、個人博客頁面、媒體服務器等等。

▲自定義側面板

以路由器為例添加如下內容到 configuration.yaml 文件中:

panel_iframe:
netgear: #面板名稱
title: Netgear #標題(必填),在側面板中顯示。
icon: mdi:router-wireless #圖標(可選)
url: http://192.168.2.1/start.htm #要打開的URL(必填)。

自定義主題

▲自定義主題

主題(Themes)提供了字體、顏色等的自定義,而主題的設置,涉及前端相關知識,這裡不做過多講解(主要在官網也沒找到幾個好看的……),僅提供一個主題配置供大家參考。

configuration.yaml 文件中的 frontend: 下進行配置:

frontend:
themes:
midnight:
# 主體
primary-color: ‘#5294E2’
accent-color: ‘#E45E65’
dark-primary-color: ‘var(–accent-color)’
light-primary-color: ‘var(–accent-color)’

# 文字
primary-text-color: ‘#FFFFFF’
text-primary-color: ‘var(–primary-text-color)’
secondary-text-color: ‘#5294E2’
disabled-text-color: ‘#7F848E’
label-badge-border-color: ‘green’

# 背景
primary-background-color: ‘#383C45’
secondary-background-color: ‘#383C45’
divider-color: ‘rgba(0, 0, 0, .12)’

# 表格
table-row-background-color: ‘#353840’
table-row-alternative-background-color: ‘#3E424B’

# 導航菜單
paper-listbox-color: ‘var(–primary-color)’
paper-listbox-background-color: ‘#2E333A’
paper-grey-50: ‘var(–primary-text-color)’
paper-grey-200: ‘#414A59’

# 卡片
paper-card-header-color: ‘var(–accent-color)’
paper-card-background-color: ‘#434954’
paper-dialog-background-color: ‘#434954’
paper-item-icon-color: ‘var(–primary-text-color)’
paper-item-icon-active-color: ‘#F9C536’
paper-item-icon_-_color: ‘green’
paper-item-selected_-_background-color: ‘#434954’
paper-tabs-selection-bar-color: ‘green’

# 標籤
label-badge-red: ‘var(–accent-color)’
label-badge-text-color: ‘var(–primary-text-color)’
label-badge-background-color: ‘#2E333A’

# 開關
paper-toggle-button-checked-button-color: ‘var(–accent-color)’
paper-toggle-button-checked-bar-color: ‘var(–accent-color)’
paper-toggle-button-checked-ink-color: ‘var(–accent-color)’
paper-toggle-button-unchecked-button-color: ‘var(–disabled-text-color)’
paper-toggle-button-unchecked-bar-color: ‘var(–disabled-text-color)’
paper-toggle-button-unchecked-ink-color: ‘var(–disabled-text-color)’

# 滑塊
paper-slider-knob-color: ‘var(–accent-color)’
paper-slider-knob-start-color: ‘var(–accent-color)’
paper-slider-pin-color: ‘var(–accent-color)’
paper-slider-active-color: ‘var(–accent-color)’
paper-slider-container-color: ‘linear-gradient(var(–primary-background-color), var(–secondary-background-color)) no-repeat’
paper-slider-secondary-color: ‘var(–secondary-background-color)’
paper-slider-disabled-active-color: ‘var(–disabled-text-color)’
paper-slider-disabled-secondary-color: ‘var(–disabled-text-color)’

# Google
google-red-500: ‘#E45E65’
google-green-500: ‘#39E949’

重啟 Home Assistant 服務之後,我們可以在側邊欄 Configuration > General > Set a theme 選擇相關主題。

▲選擇主題

官方文檔論壇

六、下節預告

經過前期所有的設置,我們已經可以在 Home Assistant 中較好地使用所有接入設備。但這個「智能」家居還是顯得一點都不智能,並沒有達到理想中的樣子。而我們將在下節開始涉及整個智能家居系統的靈魂——自動化(Automation)。

■ Home Assistant 自動化

Leave a Comment