老屋翻新之 HomeKit Wi-Fi 開關 (一)
從開始設計新家的裝潢起,我就打算要弄一套好用又可靠的自動化開關。不過因爲之前有失敗的經歷,所以這次我特別謹慎。
十多年前剛買大樓的房子時,我也曾經試著在家裡裝 X.10 電力線載波遙控系統,那時還從美國買了不少 X.10 的裝置、插座回來。但因爲大樓的供電是 380V/220V 三相電,110V 插座的電是過自設變壓器產生的,相間的 coupling 很差,X.10 的訊號過不太去。我試過在配電盤上的主線之間裝 coupling 電容,但效果仍然不好,所以 X.10 後來就擱著沒用了。
兩年前在 AppWorks 研究用 Amazon Echo 的 Alex 控制 IOT 開關時,我也曾經做過用 ESP8266 控制的 Wi-Fi 開關,然後就在做完之後沒多久,我就在淘寶上發現有家叫 Sonoff 的公司也用 ESP8266 做了幾乎一樣的裝置。
這次要尋找適合的 Wi-Fi 開關時,我就想到了 Sonoff 的產品。
Sonoff 出了一系列用 ESP8266 做的開關,除了線上開關之外也有很多埋壁式的面板開關,可以直接用來取代原本牆上的開關。這些開關出廠時,裡面的 firmware 是搭配 eWeLink 易微連的 app 使用。仔細研究之後才發現,eWeLink 已經形成一個非常大的生態系,中國有非常多的 Wi-Fi 開關、IOT 裝置可以用這個平台控制,app 本身也寫得不錯,還有個漂漂亮亮的界面。
但這 app 畢竟來自中國,我並不想要我家裡的電燈開關受到千里之外位在中國境內的伺服器所控制,因此我只打算用 Sonoff 的硬體,不打算用它的 firmware 跟 app。
我花了點時間研究這些 Wi-Fi 開關的 firmware 修改,發現了一個叫 Tasmota 的開源 firmware,專門用來刷這些 ESP8266 的開關,而且也有非常完整的生態系和週邊支援。Tasmota 的裝置用 MQTT 當作主要的控制協定,也有很多支援 Tasmota 控制的 app、web UI,甚至還有 Homekit gateway 等模組,可以讓 Tasmota 的裝置被 Apple HomeKit 找到、控制。
但我心裡最想要的,其實是直接、原生的 Apple HomeKit 控制。也就是裝置本身可以直接支援 HomeKit 協定,不用經過 gateway。
在網路上搜尋 ESP8266+HomeKit,可以找到爲數不少的開源 firmware,其實已經有蠻多人做過嘗試了。我最早看到的是一個叫 Arduino-HomeKit-ESP8266 的專案,看來是一個大陸人寫的。我試了這個 firmware,但發現它的穩定性不太行。可能是因爲 ESP8266 Arduino Core 本身的 overhead,這個 firmware 在執行時幾乎用盡 ESP8266 的記憶體,甚至常常在配對時會失敗,或是執行一段時間之後裝置就沒有回應。(BTW,HomeKit 裝置在配對時的加密驗證演算法還蠻複雜的,連 ESP8266 裡的 Tensilica L106 32-bit 處理器跑起來都有點吃力。)
順帶一提,這些開源的 ESP8266 HomeKit firmware 都是基於 Apple 提供的非商業版 HomeKit Accessory Protocol。Apple 對週邊裝置要求 MFi 認證的龜毛是衆所周知,如果你要製造、銷售 HomeKit 相容的裝置,就得先拿到門檻不低的 MFi 認證。不過 Apple 自己大概也知道,如果只靠 commercial 的供應商,HomeKit 大概花一個世紀也不會普及,所以在 Developing for HomeKit 的專區中,特別留了一個位置給 hobbyists 跟 makers,讓像我們這樣的熱血 maker 也可以自幹 HomeKit 裝置。
GitHub 上這些開源的 HomeKit 相關專案,用的就是這一套非商業版的 protocol。用非商業版協定唯一的缺點,就是在配對裝置時會跳出一個訊息告訴你 “這個裝置沒有 MFi,你確定要繼續嗎” 之類的,其它用起來似乎都跟買來的 HomeKit 裝置一樣,我相信 Apple 沒有藏私。
因爲 Arduino-HomeKit-ESP8266 的作者有 credit 一個專案,叫做 esp-homekit,我就順藤摸瓜找到這裡來。這個專案不依賴 Aduino,而是編出 ESP8266 的 native binary (好啦,ESP8266 Arduino Core 編出來的也是 native binary…) 我本來以爲它用的是 ESP8266 的 official SDK,所以爲它在 Linux 的 VM 中架了整套的 ESP8266 SDK 跟開發環境,弄到一半才發現它用的不是 official SDK,而是一套叫做 ESP-OPEN-RTOS 的開源 SDK。於是我又花了一點時間把 ESP-OPEN-RTOS 的環境架起來,才能編譯這個專案。
esp-homekit 的功能很完整,也有爲數衆多的 demo code (在另一個叫做 esp-homekit-demo 的專案裡),但最大的問題就是沒有 documentation,完全沒有。所有的東西都要去 demo 程式裡找,API 也要看 sample code 才能大略知道要怎麼 call。
我買了幾個 SONOFF 的線上開關模組,測試了一下這個專案編出來的 firmware。
Sonoff 這種模組開關在淘寶上面真的很便宜,單純的 Wi-Fi 開關大概台幣一百塊左右就買得到,如果要加 433MHz RF 遙控功能的,再加一百塊就有了。
有 RF 遙控功能的版本,就是除了可以透過 ESP8266 用 Wi-Fi 控制開關之外,它裡面還有一個類似 SYN470 那種學習型 RF 解碼器,可以跟各式各樣的 433MHz 遙控器配對,用來控制開關。而且 ESP8266 的軟體會去 poll 開關的狀態,所以用遙控器控制開關時,開關的狀態也會反應在 HomeKit 裡。
這是 Sonoff switch 拆開來的樣子,這個開關已經出到第三代了,一代和二代的外觀一樣,電路板有小改,三代則是連外觀都不一樣。照片中這顆是二代附 RF 功能的,在淘寶上叫做 Sonoff RFR2。
照片中豬尾巴天線下方有一個模組,就是 SYN470 的 RF 接收模組,用排針跟主板相連。如果是沒有 RF 的版本就不會有這一個模組。模組下方就是 ESP8285,這是 ESP8266 內建 1MBytes flash 的版本。我拆過早期的 Sonoff 一代開關,裡面用的還是 ESP8266 跟外掛的 SPI flash,但二代就改用 ESP8285 了。
由於 AC-DC 電源也跟數位電路一起擠在這一張小小的電路板上,所以板子上切了不少鏤空槽,做了實體隔離。板子正面還可以看到 flyback 變壓器的輸出,從變壓器的二次側用導線直接接到低壓側線路,組裝其實蠻粗糙的,也難怪可以賣這麼便宜。
Sonoff 最貼心的地方在於,不管它的電路板怎麼改、ESP8266 再怎麼埋在看不到的地方,ESP8266 的 UART 訊號一定會有看得到的接點,而且會標明訊號。有了 UART,距離燒錄 ESP8266 就更接近了。
但除了 UART,要讓 ESP8266 進入 DFU bootloader 還需要在開機時把 GPIO0 拉到地。GPIO0 在哪裡呢?我找了一顆沒有 RF 功能的 Sonoff R2 開關來觀察,用電錶一端碰著晶片上的 GPIO0,另一端在電路板上亂找,發現連接到 RF 接收模組的連接器上就有 GPIO0,而且它隔壁剛好就是 GND。我只要把 UART 接上,再把這兩支腳短路,上電後就能讓 ESP8266 進入燒錄模式。
在研究 esp-homkit 的 firmware 時,我又發現有另外一個專案叫做 Sonoff-Homekit,其實也是從 esp-homekit 衍生出來的。不過這個專案比較好的地方是,它提供了兩個 compile 好的 binary,一個是開機後開關的狀態預設是 off,另一個是開機後開關的狀態預設是 on。這樣的設計的目的是你可以用開機後自動 on 的 firmware 燒錄在 Sonoff switch 上,把它串接在原來已經有開關的燈具上。當你把開關打開時,Sonoff switch 供電開機,同時燈也亮了;當你把開關關掉時,燈當然也熄了。而當原來的開關是開著的時候,就可以用 HomeKit 來控制 Sonoff switch,要開要關都可以。
於是我就裝了一顆 Sonoff switch 到客廳的 LED 燈管上。
Sonoff switch 本身的電源一樣來自 AC,因此它必須要有火線與中性線才能工作。一般燈具的配線是火線經過開關到燈具,而中性線直接拉到燈具,因此將 Sonoff switch 裝在燈具附近不會有問題。但如果要把它裝在原來牆上開關的位置,取代原來的開關,就可能會面臨沒有中性線可以接的問題。
經過幾個月的測試,esp-homekit 和它衍生出來的 firmware 穩定性都沒什麼問題,只要 Wi-Fi 訊號沒有問題,在 HomeKit app 裡面幾乎沒看過裝置離線。
我本來的打算是新家所有的燈具都直接配 Sonoff RF switch,然後牆上需要裝開關的地方就用這種大陸叫做 “隨意貼” 的 433MHz RF 遙控器:
但開始施工之後發現,要讓水電師傅了解 “原來有開關的地方不用配開關” 這件事,其實有一點難度,他們從第一天開始切管槽、挖牆時,就把所有的開關盒位置都挖了。
於是,我只好改變策略,決定在牆上開關的位置使用這種面板開關:
由於大陸的牆面開關尺寸遵循歐規,因此比較容易買到的開關是這種方形的 86 開關,面板尺寸是 86mm x 86mm。我第一批買到的 Sonoff 牆面開關就是這個尺寸的,型號是 Sonoff TX0EU,這是沒有 RF 功能的版本。
Sonoff 所有的牆面開關都需要有中性線,因爲大陸稱中性線叫 “零線”,所以這種需要火線跟中性線的開關稱之爲 “零火版” 開關。在搜尋產品時,我發現除了 Sonoff,還有其它的廠商也有做類似的開關,他而且們有出 “單零版” 的開關。
所謂單零版的開關,就是不需要接中性線,利用流過開關的電流,旁路出一點點的電壓差,用來驅動開關本身。
但是當開關關閉時,線上沒有電流流過,要怎麼偷電呢?如果負載是傳統的鎢絲燈泡這種線性負載,開關這邊可以串聯一個很高的阻抗,讓一個微小的電流流過開關,以維持開關的供電。而因爲這個電流非常小,燈泡看起來是不亮的。很多人家裡用的 Panasonic “星光開關” 就是利用這個原理,讓開關關閉時,開關面板上的氖燈有微小的電流流過而會發亮。
但遇到現在的 LED 燈、省電燈泡或是 T5 安定器這種非線性的負載,就不是這麼一回事了。這種負載裡面多半有個整流電路,先將 AC 轉爲高壓 DC 再重新震盪、升壓或降壓成需要的電壓,而整流電路會有一個濾波電容。開關提供的微小電流沒有辦法直接讓燈泡的電源電路工作、點亮燈泡,但這個電流會對濾波電容充電,讓電容裡面的電壓慢慢上升。當這個電壓高過燈泡的工作電壓時,電源電路就會啓動開始工作,一次把濾波電容裡的電荷用光,這時後我們就會看到燈泡閃了一下。電容裡的電被放光之後,又要再來一次慢慢充電的過程,然後再讓燈閃一下,如此周而復始,我們就會看到燈泡會三不五時閃一下。這個現象在早期 LED 燈泡剛上市時很常見。
爲了應付這種接在星光開關上會有微小漏電電流的問題,現在很多燈具或是燈泡裡面,都會並聯一個小小的交流電容器,讓燈泡本身在小電流時的阻抗不是無限大,而是有一個很大的阻抗,可以讓小電流流過。除了可以避免燈泡在關掉的時候亂閃,也可以提供星光開關上的小燈電源。
不過 ESP8266 Wi-Fi 開關需要的電流比星光開關的那個小氖燈稍微大一點,因此燈泡內建的電容器流過的電流多半不夠讓單火版的開關工作。單火版的開關會另外附一個電容器,讓你並聯在負載上,以取得開關所需要的電流,讓開關工作。
於是,接下來我又試了好幾組不同的牆面 Wi-Fi 開關。不過,那又是另一個故事了。
要保留實體開關也可以參考同牌的sonoff mini
謝謝,但 Sonoff mini 裝不進標準的美規 120 開關鐵盒,後方深度不足
您好,想請問一下,若星光開關裝Sonoff mini還能保留原來氖燈的功能嗎?
應該不行,因爲 Sonoff mini 會把迴路斷開
應該不行,因爲 Sonoff mini 在不導通時會將迴路整個斷開。而星光開關的氖燈是利用迴路上原來的壓差產生漏電電流點亮的。
謝謝你的分享,想請教一下esp-homekit 的firmware除了用homekit控制,有web介面和api嗎?有時在使用電腦時,用browser關燈比起尋找手機先解鎖再開homekit關燈方便。
另外,它可以把8266改成pwm嗎? 除了高壓開關,我還有一些8266的usb低壓開關,也flash了tasmota, 可以用pwm把usb調教快慢和光暗等,但它不能直連homekit, 現在只是用ha或hb來間接連上homekit,要一台rpi或長開電腦
HAA 沒有 web 界面,它只設計給 Homekit 控制。它的 web 界面只用來設定裝置。
PWM 有支援,要用 JSON 檔寫設定。