出門在外也能控制 Home Assistant 嗎?

出門在外也能控制 Home Assistant 嗎?必須得可以!這也是智能家居很重要的一環,舉凡人在外面控制燈具、瓦斯、門窗開關、透過攝影機查看家裡狀況、回家路上提前開冷氣、提前啟動電飯鍋開始煮飯…… 遠端控制是必不可少的功能。

此篇我們就來實作,走起!

釐清家中的網路拓撲(怎麼互相連接的?如何上網的?)

以我為例,在此篇操作之前的拓撲為:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+———————+
|中華電信|
+———————+
|
(PPPoE 撥號)
|
v
+———————————————————————————————————————————+
|小烏龜 (Modem + 路由器,內部網段:192.168.1.x)|
+———————————————————————————————————————————+
|
(DHCP 分配 IP)
| |
| +---> IPTV 1(客廳的MOD)
| +---> IPTV 2(房間的MOD)
v
+—————————————————————————————————————+
|MiWifi (路由器,內部網段:192.168.31.x)|
+—————————————————————————————————————+
|
(DHCP 分配 IP )
|
+---> 終端設備(手機、電腦等)
|
v
+——————————————+
|Home Assistant|
+——————————————+

建議各位一定要先稍微梳理一下家中的網路連接狀況,否則很容易跟我之前一樣犯很不必要的錯。(錯誤案例留在文末,供大家嘲笑並警惕)

此例中,我家裡同時有兩台路由器在搞路由,各自維護了兩個內網網段。所以假設我今天手機 wifi 連 MiWifi 來上網,實際上是小烏龜向中華電信取得了 111.87.87.87 這個外網 IP,然後 DHCP 分配給 MiWifi 一個內網 IP 例如 192.168.1.69,接著 MiWifi 再 DHCP 分配給手機一個內網 IP 如 192.168.31.168 來上網的。

一般家庭為了更好的 wifi 訊號額外買一台分享器是很常見的情形,而由於小烏龜本來就預設開著 DHCP,大家在安裝上很容易變得跟此例一樣。但如此一來,家裡變成了「雙重路由」,等等設定通訊埠轉發(Port Forwarding)會比較麻煩。

我這邊的解法是,MiWifi 改為 PPPoE 撥號直接跟中華電信額外再要一組 IP,各位不妨可以參考。不過如果你不介意,做兩層通訊埠轉發也是 ok 的。

分享器直接撥號

反正中華電信可以同時給我們八組 IP(其實是不是挺大方的?還是因為台灣人口少所以沒差?),那我們就讓小烏龜拿一組(主要給MOD用)、MiWifi 也拿一組,各自對外。

你說你不知道你的 PPPoE 撥號帳號密碼?嗯跟我一樣,就打去中華電信問一下吧 XD

pppoe

順帶一提,帳號部分我本來輸入的是跟小烏龜一樣的 xxx@wifi.hinet.net ,但連不上,於是嘗試了 xxx@hinet.net 就意外成功了,各位可以嘗試。而 xxx@ip.hinet.net 應該是申請固定 IP 之後才會使用到的。

如此一來,我的拓撲就變成了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+———————————————————————————+
| 中華電信 |
+———————————————————————————+
| |
(Modem) (PPPoE 撥號)
| |
| v
+———————————————————————————————————————————+
|小烏龜 (Modem + 路由器,內部網段:192.168.1.x)|
+———————————————————————————————————————————+
|
(PPPoE 撥號)
| |
| +---> IPTV 1(客廳的MOD)
| +---> IPTV 2(房間的MOD)
v
+—————————————————————————————————————+
|MiWifi (路由器,內部網段:192.168.31.x)|
+—————————————————————————————————————+
|
(DHCP 分配 IP )
|
+---> 終端設備(手機、電腦等)
|
v
+——————————————+
|Home Assistant|
+——————————————+

對於 MiWifi 來說,小烏龜此時就單純作為 Modem(數據機、調製解調器),而非上層路由器。對我們的 HA 來說,就是通向外網的障礙(?)少了一層,耶✌🏻

固定HA的內網位置

如果存粹交給 MiWifi 用 DHCP 來分配內網 IP 給 HA 的話,可能過一陣子位置就跑掉。所以我們來固定一下內網的 IP 位置:

miwifi

如此一來,HA 就會乖乖待在 192.168.31.254 了。

設定通訊埠轉發(Port Forwarding)

此處注意「端口轉發」、「通訊埠轉發」、「Port Forwarding」指的是同一件事情,免得找不到設定入口。

此處可以先把外部的 80port(http 預設端口)轉到 IP為254(我們剛剛固定的位置)的 8123port(HA預設的端口)。簡單來說就是外部的 80 轉到內部的 8123。

而我們預先設好另一組外部 443 轉內部 8123,等等會用到。(443 是 https 預設端口)

portfowarding

設定DDNS + 走 https

而因為我這裡並沒有跟中華電信申請固定 IP,所以外網位置每隔一段時間會回收重發。那我從外網要怎麼追蹤 HA 目前最新的外網位置呢?

此處我們使用 DuckDNS 這個 DDNS 服務(動態DNS)。DuckDNS 透過附加元件安裝到 HA 裡面以後,會幫你偵測 HA 的外網位置,如果改變,就幫你記得,你只要用設定好的域名訪問就 ok 了,非常方便。

https://www.duckdns.org/ 註冊好,申請一組域名,取得 token。

接著從「設定 > 附加元件 > 附加元件商店」搜尋「Duck DNS」,安裝並開啟(記得設定成啟動時開啟)。進入 Duck DNS 裡面的設定(如下圖右側),填入你取得的域名與 token,在 Let’s Encrypt 欄位裡面填入:

1
2
3
4
accept_terms: true
algo: secp384r1
certfile: fullchain.pem
keyfile: privkey.pem

設定為 true 表示我們要透過 https 連線。

接著到 HA 的 configuration.yaml 加入設定(如下圖左側),如果你不知道怎麼編輯這個 file,請參考之前的智能家居 EP7:File Editor

1
2
3
http:
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem

duck

沒錯,DuckDNS 也幫我們集成了 Let’s Encrypt 的加密簽署服務了,揪甘心餒!

HA開啟外部存取

到「設定 > 系統 > 網路」將外部存取打開:

remotegood

成功遠端訪問!

至此,設定完畢 :)


錯誤示范

當初網際網路知識還太嫩,失敗收場。將錯誤案例留下供大家參考,最後會解釋失敗原因。

此篇「遠端控制」失敗收場,目前未解,若有高手還請救救我QQ(已解決!)

為實現遠端連線,參考了以下三篇:

路由器設定 Port Forwarding

路由器把 HA 伺服器的內網位置給固定住:

miwifi

然後設定好端口轉發:

portfowarding

HA 安裝 DuckDNS

註冊好 DuckDNS,並在 HA 安裝完畢。

設定完畢:

duckdns

HA 開啟外部存取

你看我這裡也開了:

remotegood

URL 也嘗試過各種方法了:

url

我試過 https, http, 80, 443, 8123,在 port forwarding 的設定也給過 80, 443, 8123 諸如此類。但沒半個可以成功。

除了我訪問 https://myurl.duckdns.org 能連進我的中華電信小烏龜後台。

目前懷疑是小烏龜的設定問題,但進去檢查了一輪沒什麼特別發現。

中華電信小烏龜後台

cht

順帶一題,中華電信小烏龜後台進入的方式預設為:https://192.168.1.1。記得一定要走 https,否則不給進。

簡單設定可以選擇以 user 登入,帳號密碼皆為 user

進階設定有一說是一定要實體乙太網路接電腦才能進去,但我這邊透過 wifi 進去也是可以的。帳號為 cht,密碼為小烏龜型號後四碼+小烏龜MAC後四碼,皆為小寫。以我為例即為 25gqxxxx

敗因解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
中華電信
|
| (PPPoE 撥號)
v
小烏龜 (Modem + 路由器,內部網段:192.168.1.x)
| |
| +---> IPTV 1(客廳的MOD)
| |
| +---> IPTV 2(房間的MOD)
|
| (DHCP 分配 IP)
v
MiWifi (路由器,內部網段:192.168.31.x)
|
+---> 終端設備(手機、電腦等)
|
+---> Home Assistant

當初的拓撲如上所示。

為什麼最後總是只能訪問到小烏龜後台呢?如今看來就很明顯了。

透過 DuckDNS 幫我們找到的外網的 IP 位置,是誰的位置呢?是小烏龜透過 PPPoE 撥號向中華電信借來的 IP,所以當然是直接連到小烏龜身上。

所以我們在 MiWifi 裡面用心地設置的 Port Forwarding 當然不會生效,因為壓根就沒有訪問請求進來過!

這題的解法有二:

  1. 不改變上網方式的前提之下,可以設定兩層 Port Forwarding,小烏龜一層、MiWifi 再一層。
  2. 讓 MiWifi 也取得一組外網 IP。

以我為例,反正中華電信允許多撥(可以同時撥八組),我 MiWifi 直接 PPPoE 要一組外網 IP,一切就迎刃而解了。