老屋翻新之 HomeKit Wi-Fi 開關 (二)
昨天講到我試了 esp-homekit 跟 Sonoff 的線上開關,但後來我真正決定要用是要埋入牆上開關盒的牆面開關,因此我又開始了一段牆上開關的測試旅程。
我希望在真正 deploy 之前,要確定硬體和 firmware 的穩定性都沒有問題,因此我決定在舊家找幾個開關來做實驗。
牛刀小試
我最早買到的 Sonoff 牆上開關是歐規的 T0EU1C,這是沒有 433MHz RF 功能的、單路的開關。原來家裡有一批可調光 T5 日光燈管用的開關剛好是歐規的 OSRAM DIM MCU P,牆面開孔的尺寸剛好可以安裝 T0EU 的開關,所以我就決定挑一顆來換。
我本來以爲 DIM MCU P 需要中性線才能產生 0-10V 的調光控制電壓,但拆了之後才發現開關盒裡沒有中性線。後來我靈機一動,想到開關盒裡還有一根 8C 的網路線通往安定器,用來傳 0-10V 的調光訊號,我把 DIM MCU P 拆掉之後,這根線就沒用了,我可以在安定器那一端把它接到中性線,這樣開關盒這一邊就有中性線可以搭接了。
TX0EU 開關這邊的中性線只需要承擔開關本身的電路消耗的電流,因此用那根 8C 的網路線來接是很安全的,而中性線的電壓理論上應該接近地線,因此也不會有絕緣電壓的問題。
這組開關工作得不錯,用了幾個月也沒有什麼問題,要它開就開、要它關就關。不過 Sonoff 這些牆上開關的負載承受能力都不大,根據規格,單路和雙路的開關每一路最大都是 2A,而三路的每一路則只有 1A。我拆了一顆美規的開關,看了它下面那一片 power board 的零件、接線方式和 layout:
牆面開關裡面分成兩塊電路板,AC-DC 電源和 relay 以及 relay 的驅動電路在下面這一塊電路板,而 ESP8266、RF 遙控、觸控面板等電路則在上面那片電路板。兩片電路板之間用一個 4×2 pin 的 2.54mm header 連接。AC 的接線柱用焊接的方式與電路板連接,而電路板上大電流的線路則有大量的過孔及單面補錫,算是有爲 AC 的大電流負載稍微加強。
它使用的 relay 跟線上開關一樣是 10A 的,但也許受限於電路板上的導電性,規格仍然限制在 2A。型號這些牆上開關多半是用來控制電燈的,以現在 LED 燈這麼省電的情況來看,單路要超過 2A 應該不容易。舊家這邊的電力是三相四線 380V/220V,固定用電都是 220V 的,因此同樣功率的電流只有 110V 的一半。可惜新家是單相三線的系統,照明要全部用 220V 的話,配電盤那邊全部都要改用 2P 的斷路器,所以我還是決定用 110V 的照明。
也來試試單火版
後來我在淘寶上看到有人在賣 “塗鴉” 這個系統的 Wi-Fi 開關。塗鴉跟 eWeLink 一樣,也是一個 Wi-Fi IOT 的協定和平台,在國外的 Wi-Fi 開關刷寫社群裡也有諸多討論。但塗鴉的開關看起來都是白牌的,有蠻多單火版的產品。我想試試看單火線的連接,就下單買了幾顆雙路和三路的的單火版開關。
這顆是三路的單火版開關,所以接線只需要接一條火線進線,和三條出線往三組燈具。它附了一顆交流電容,是給你用來並聯在其中一組負載上,製造開關關閉時的待機電流,讓開關的控制電路維持供電用的。
不過我用來測試的這幾組燈裡,有一組剛好是餐廳櫃子下方的鹵素燈,雖然它的變壓器好像是 switching 的而不是傳統的變壓器,我試著把它接在需要並聯交流電容器的那組線路上,結果真的可以讓開關運作,就不用另外並聯交流電容。根據安裝手冊的說法,單火供電的線路必須安裝在第一路,所以我得把鹵素燈安裝到第一路,這造成三顆開關的順序跟原來不一樣,害我被老婆唸了很久。
不過這個白牌的單火版開關有幾個問題,第一個是它燒錄起來比較麻煩。我拆開之後才發現,它的 ESP8266 UART 接點是平面的測試點,沒有 via hole,因此沒辦法用排針插著燒,如果不做 pogo pin 治具,就只能焊線上去燒。而且這個測試點位在觸控開關的背光擴散片下,我必須要把觸控按鍵的背光板拆下來,才能焊接燒錄訊號,這個過程中很容易把背光版的擴散片弄壞。
第二個問題就是它真的太醜了,人家 Sonoff 的觸控面板是烤漆的強化玻璃,但這個白牌開關的面板就只是一片 PC 塑膠,再加上那個黑色邊框,真的醜到我沒辦法用。還好新家在配線時,我可以請水電師傅幫忙在所有需要開關的地方都配上中性線,就可以使用 Sonoff 的開關,沒必要爲了單火配線而使用白牌的開關。
在試用這組三路的白牌開關時,我遇到了一個之前沒想到的問題。
尋尋覓覓 HAA
不管是 esp-homekit 還是 Sonoff-homekit 專案,它們都只支援單一開關的裝置,也就是 Homekit 在配對完之後只會出現一顆開關。雖然 esp-homekit-demo 裡面有多開關的範例,但寫得很簡單,我還是得花時間去研究 source code 再下去改。而且 esp-homekit 沒有 Wi-Fi captive portal 選網的的功能,我還得另外將 ESP8266 的 Wi-Fi Manager port 過去。
就在我把 ESP8266 的 SDK 環境都弄好,打算開始認真研讀 esp-homekit 的 source code 時,又出現了一線曙光。
我在 GitHub 上發現一個 repo 叫做 HAA – Home Accessory Architect,是一個發展了蠻久而且一直很活躍的 ESP8266 Homekit 裝置專案。不知道爲什麼我之前在搜尋相關的 firmware 專案時,沒有發現這一個。可能是因爲它的名字取得太隱晦,光從 HAA 或是 Home Accessory Architect 看起來跟 Homekit 的關聯很小,所以 SEO 排名不好。
看了 HAA 的相關說明,我只能說相見恨晚。
這個 firmware 有非常完整的 runtime customization 功能,除了最基本的 Wi-Fi 選網之外,Homekit 裝置的所有屬性都可以用一個 JSON 字串設定。可以設定的功能非常多,像是 Homekit 裝置的類型、裡面有幾個裝置、每個裝置的輸入、輸出對應到 ESP8266 的哪根 GPIO 等。而且它還支援像是 DS18B20、DHT11 之類的溫度 sensor,可以設定出 Homekit 相容的溫溼度感應器,也支援 CIR 訊號發射,所以可以裝一個 IR LED 之後就用 Homekit 觸發特定的紅外線遙控訊號。由於 HAA 的 JSON 字串 configuration 非常複雜,複雜到幾乎就像個程式語言一樣,手工寫起來還是有點難度,所以有人爲它做了 web configurator。
HAA 的 config file 寫起來大概是這個樣子:
{“c”:{“l”:13,”b”:[{“g”:0,”t”:5}]},”a”:[{“0”:{“r”:[{“g”:12}]},”1″:{“r”:[{“g”:12,”v”:1}]},”b”:[{“g”:0}],”s”:0},{“0”:{“r”:[{“g”:5}]},”1″:{“r”:[{“g”:5,”v”:1}]},”b”:[{“g”:9}],”s”:0}]}
其實這是格式壓縮過的 JSON 字串,如果找一般 JSON 的縮排,看起來不會這麼難懂。
而 HAA 在 setup mode 時也有個 captive portal,你可以連上它用 ESP8266 開起來的 AP,進入設定用的 web UI:
使用 Homekit non-commercial 的 protocol 做出來的產品僅供 maker 或 hobbyiest 使用,Apple 原來的授權就禁止商業販售。因此作者也在 captive portal 中說明了如果你是付錢買到這個 firmware,那一定是詐騙。
總之呢,找到 HAA 時,我有種 “眾里尋他千百度,驀然回首,那人卻在燈火闌珊處” 的感覺。它解決了我幾乎所有的問題,而且還多了非常多我需要再研究、而且非常強大的功能。
Sonoff T2US 實戰
軟體的問題解決後,由於新家的水電也開始施工了,我決定買幾個實際施工要用的牆上開關來驗證一下。
我上淘寶下單買了 Sonoff T2US1C、T2US2C、T2US3C 三種美規的牆面開關,T2 系列是白色面板、有 433MHz RF 功能的版本。如果家裡的裝潢走豪宅風或是工業風,可以考慮 T3 系列黑色面板的版本。
Sonoff 不愧是產品已經行銷全世界的公司,包裝做得相當有質感。
產品本身的質感也不錯。前面那一片面板真的是玻璃,不像白牌的開關用的是 PMMA 或是 PC 塑膠。
撬開面板後,就可以看到裡面的電路板。這是上面的電路板,PCB 上的 marking 叫做 “TOUCH”;前面看過的下面那片電路板,叫做 “POWER”。
右上角是 ESP8285 晶片本人,以及燒錄用的 UART 連接器。Sonoff 這片板子的 UART 連接器是 4 個間距 2.54mm 的洞,因此我可以很容易用 2.54mm 的 pin header 插進去燒錄,不需要再焊線,非常方便。
這顆是只有一路開關的 T2USC1,因此三個 touch pad 只有一個有裝導光片,玻璃外蓋上也只有露出一個按鈕的發光孔位。
Sonoff 的電路中除了 ESP8266 之外,還會有一顆 Silicon Labs 的 EFM8 Busy Bee 系列的 8051 微控制器,用來協調 touch IC、RF 接收器、和 ESP8266 之間的運作,讓三者對 relay 的控制、touch 開關的狀態可以同步。RF 接收器和我之前推測的一樣,是 Synoxo 的 SYN470R,這是非常常用的 RF 接收器。我幾年前在簡報筆的故事中有仔細介紹過這顆 “天線進去、DATA 出來” 的 IC。RF 遙控訊號的學習也是由 EFM8BB 負責,沒有另外的遙控學習 IC。但板子上的 touch IC 就看不出型號了,完全沒有 mark,不知道是刻意抹掉的,還是用的是那種便宜到連 laser marking 都不打的封裝。
簡單查了線之後,我輕易找到了 GPIO0,就在 ESP8266 跟 EFM8 之間連接的 R19 上。
我順手查了一下 ESP8266 跟 EFM8BB 之間的連接:
ESP8266 這邊的接腳
GPIO0 – EFM8BB1 P1.3, key 1 輸入
GPIO4 – 連接到一個沒有 mount 上的小按鈕,可能是 RESET
GPIO9 – EFM8BB1 P1.4, key 3 輸入
GPIO10 – EFM8BB1 P1.5, key 2 輸入
GPIO13 – 連接到面板上的 “Wi-Fi” LED
GPIO12 – 控制 relay #1
GPIO5 – 控制 relay #2
GPIO4 – 控制 relay #3
GPIO2 – ESP8266 的第二組 UART TX,應該是 log output
EFM8BB 這邊的接腳
P0.0 – 控制 relay #1
P0.1 – 控制 relay #2
P0.2 – 控制 relay #3
P0.3 – touch key 1 輸入
P0.4 – touch key 2 輸入
P0.5 – touch key 3 輸入
P0.6 – SYN470R 解碼資料輸出
P0.7 – 蜂鳴器 (在 power board 上)
P1.0 – key #1 的 LED
P1.1 – key #2 的 LED
P1.2 – key #3 的 LED
P1.3 – 連接到 ESP8285 GPIO0
P1.4 – 連接到 ESP8285 GPIO09
P1.5 – 連接到 ESP8285 GPIO10
P1.6 – 連接到 ESP8285 EXT_RSTB 腳 (pin #32)
查完這兩顆 IC 之間的連接之後,才知道原來 EFM8BB 才是這張板子上的老大,觸控 IC 輸出的狀態、按鈕的 LED 燈、RF 解碼出來的資料都是由它在處理的。因爲 RF IC 的重新配對是長按觸控按鍵,爲了不讓長按的訊號讓 ESP8266 接收到,touch IC 的輸出是接到 EFM8BB,它判斷過的按鍵訊號才經由 ESP8266 的 GPIO0、GPIO9、GPIO10 傳給 ESP8266。
R19 附近剛好有 EFM8BB 的燒錄連接器,上面有 GND,因此我只要在 UART 那邊送電時,用鑷子輕輕碰著 GND 跟 R19,就可以讓 ESP8266 進入燒錄模式。
接著用 ESP8266 的燒錄程式把 HAA 提供的,已經 build 好的 binary 燒進去,再讓 ESP8266 斷電重開,就可以看到 HAA 啓動後建立的 Wi-Fi AP,用手機或電腦連上之後就可以看到 Captive Portal。
用 Captive Portal 設定好 Wi-Fi 網路後,HAA 會自動重開機,並連上 GitHub 去檢查及下載更新。
整個過程約莫需要兩、三分鐘,等它更新完後就可以再度進入 Captive Portal 裡去設定 JSON configuration 字串了。
於是,新家要用的 Homekit Wi-Fi 開關大致抵定。接下來我要根據燈具的配線圖,計算不同路數的各種開關用量,來大批採購了。
請想問版主,HAA刷完之後可以支援 433Hz射頻的功能嗎?
可以,433MHz 遙控是靠另一顆 MCU 達成的,跟 ESP8266 無關
請教個問題如何將SONOFF T2US 開關 重置成出廠設定
如果已經燒過 HAA,是沒辦法變回原來的 firmware 的
請問牆面插座有需要也換成智慧牆面插座嗎?
請教一下ESP8285,用HAA燒成功了,但homekit裡面一直顯示離線,這是代表JSON錯了嗎? 您用的是四路的,但我是單路的那一種
JSON 錯的話會回到配對模式,你要先檢查 Homekit 配對有沒有成功
後來我發現了,原來是因為我的家庭,因為我是在公司測試,但加入的家庭一直是我家,建一個空的家庭,就正常了。謝謝
請問您有更新到v12版本嗎?(2023/05/13)
我的sonoff basic r2更新到v12 之後
就無法控制了
開關r2 led不會亮
以前11.9版本可以
v12 之後的設定 JSON 檔有重大變更,因爲多了對 ESP32的支援,GPIO 要多一段設定才會動。請參考 HAA 的 Wiki 有詳細說明。