大概兩年前,我就一直在尋找可以用 HomeKit 的智慧門鎖方案。後來找著找著就放棄了,當時的研究結果是這樣的:
大部分支援 HomeKit 的門鎖都是歐美款式的門鎖,然而歐美國家使用的鎖,外型跟亞洲國家不太一樣,亞洲的鎖通常會長很多,而這種鎖唯一有支援 HomeKit 的只有當時一組叫做「多靈 P8」的鎖。
但是電子鎖這種關乎安全的東西,還是找大牌子比較保險,而就我當時研究,最高階的電子鎖應該不外乎是 Yale(耶魯)跟三星兩家。可惜這兩家都不支援 HomeKit,所以那時候我就放棄購買了,想說等過段時間再看看會不會有出 HomeKit 的門鎖。
敗家不需要理由
兩年過去了,市面上支援 HomeKit 的門鎖多了一些,包括小米也出了平價的 HomeKit 門鎖。但我還是認為選擇大品牌的門鎖比較妥當,可惜這兩家大廠這兩年依然沒有出支援 HomeKit 的鎖(Yale 有出,但是是歐美規格)。因此最後還是放棄了 HomeKit,趁著特價活動,把 Yale 的 YDM-7116 + 藍牙模組 + Yale Link Bridge 一次入手。
沒錯,這款特價時會送整組藍牙跟 Bridge,這邊有傳送門。注意要確定有沒有寫送 Bridge(遠端橋接器),因為之前有陣子沒送,現在又突然送了,這顆橋接器單買要三四千,買到賺到。或者有時候門市會做特價也會整組包在一起賣,有興趣的可以打電話去問看看。
順帶一提,YDM-7116 是舊款,新款是 YDM-7116A,差別在於指紋感應的模式不同,新款感應當然比較好,如果對這方面沒有要求,買舊款就夠了。如果你想要知道這系列的電子鎖有什麼功能,可以看陳甯的這篇 YDM-7216 介紹。
遠端功能真難用
在請師傅安裝門鎖完成後,我就使用了一下 Yale Link 的 App。用完真的是想罵髒話,下面的動畫完美示範了 App 的問題:
很明顯的,這款 App 有許多問題:
- 對 iPhone 12 Pro 解析度不支援,整個跑版
- 打開 App 要先等動畫,之後要手動按門鎖,再按遠端連線,最後再按解鎖,太花時間
如果用 App 解鎖要花十幾秒鐘,誰還要用?刷指紋就好了啊。花三四千買這組橋接器的人真的是有夠浪費錢。
✭ 黑魔法研究室 ✭ 魔改
不過買都買了,與其抱怨還不如想辦法研究看看它的機制,所以我就開始逆向 App 以及分析 App 請求 API 的封包內容,過了兩天,居然還給我真的研究成功。
(順帶一提,在台灣販售的耶魯電子鎖確實是使用韓國 iRevo 的晶片,因為 App 連線的伺服器的確是 iRevo 的伺服器。)
研究完成之後,就開始著手寫 Homebridge 外掛套件(JavaScript 跟 TypeScript 我都不會,苦手),由於我個人的喜好原因,我偏向使用 Homebridge 而非 HomeAssistant。有興趣的話可以下載 homebridge-yale-link 來安裝。根據其他使用者的說法,可能需要 30 分鐘左右的時間來摸索如何設定。
最後 HomeKit 串接成果如下:
雖然還是要花 5 秒鐘,但是整體時間已經比上面開 App 快上了三倍,在某些條件下還可以再省略一隻 API 的呼叫,會再快一兩秒,詳情可以看套件安裝說明。
我打算在樓梯牆壁貼一個 NFC 感應卡,然後搭配捷徑與 HomeKit 的方式來開門,這樣就可以先提早算好這幾秒鐘的時間差,讓人走到門前的時候剛好門鎖已解鎖。
結界限制
由於魔改再怎麼樣都是非原生的 HomeKit,因此會有一些限制:
- 如果開啟了「家庭」App 之後用傳統方式改變門鎖狀態(例如用指紋開門),則 App 中的狀態不會即時更新。要做到這點其實不難,問題是得每隔幾秒就去呼叫 API,我擔心會大量消耗門鎖的電力,造成很快就沒電的情形發生。
- 如果先打開門,再開啟家庭 App,則狀態會偵測為已開門,這部分沒有問題。
- 門鎖打開後,若門的位置已歸位,過幾秒會自動上鎖。我的實作方式是在「家庭」App 中會自動把狀態變回已上鎖狀態,但實際上這只是一個過幾秒鐘會切換狀態的指令,實際上有沒有上鎖不能從那邊看出來。
- 舉個例子:用 HomeKit 解鎖後,馬上把門推開並且不要歸位,過幾秒鐘 App 會顯示門已經上鎖(時間到,自動切換狀態),但是實際上未上鎖。
安全性
方便與安全性是很難兼顧的,在本次的研究中我就發現了幾個安全性的問題。
雖然 Yale Link App 理論上會綁定手機的 UDID、門鎖藍牙模組的序號,搭配每次操作都會更新的 Google 帳號 token,而使得只有符合以上組合的請求才可以成功解鎖。但由於部分 API 設計的缺陷,導致攻擊者只要能入侵你的 Google 帳號,控制你家的門鎖根本成了易如反掌的事情。
如果你在乎安全,我會建議直接把橋接器拔掉,不要使用。或者你得確定你的帳號密碼強度夠強,然後有開兩階段認證,之後禁止其他沒有安全觀念的家庭成員使用自己的 Google 帳號登入、綁定門鎖橋接器。
如果你非常在乎安全,我會建議你藍牙模組也拔掉,並且不要使用 App,因為這個 App 目前也是有一些安全問題存在。細節不多說,但若按照台灣的「行動應用資安聯盟」的標準,這個 App 是不會通過審查的。
至於我個人目前是採用高強度密碼的 Google 帳號搭配兩階段認證的方法,並禁止家裡其他成員使用 App,一律走 HomeKit 解鎖,或者就用電子鎖原本的指紋或卡片解鎖,來取得安全性與方便性中間微妙的平衡。
您好,感謝您分享這個HB插件,想請問您,yale7116鎖在安裝homebridge前一定要先進入安全模式嗎? 因為目前安裝的步驟到第10點後,並沒有出現terminalId 以及 deviceId 的值,出現了[1/10/2021, 22:25:20] [YaleLinkPlatform] Failed to login with SSO token, please try again. Error: 401這個錯誤,是我哪裡弄錯了嗎? 謝謝您~
出現該錯誤就重新做 7~9,這個錯誤跟安全模式應該是沒有關係的,因為原因是你給了無效的 token…
不過我沒有在一般模式跑過整個流程就是了。
您好,
非常感謝您的回覆,我後來轉成安全模式,重做兩次順利接上去了,也在Homekit中順利動作,但當我重新下載yale link app再使用8#1#重新加入藍芽模組後,app中可開關鎖,可是homekit鎖就不再動作,且無回應並出現了錯誤訊息。
能請您再幫忙看看嗎?再次感謝您的協助了,謝謝~
因好像不能貼圖片,所以用了iclud連結,再次感謝您~
錯誤訊息icloud圖片連結: https://share.icloud.com/photos/0Bmkh6Y5E70q-4mjjtO5F-ovg
你確認一下 HomeBridge 那邊 isNoOtherTerminal 是不是設到 true,如果你還想要用 App 去連 Bridge 的話這邊建議 false。
錯誤出現的原因有幾個,第一種就是 App 拿到控制權,結果 HomeBridge 同時也要控制權,就會發生衝突,或者有時候是單純 API timeout。但這種情況在下一次重新嘗試操作就會恢復正常了,還請再試試看
最後想請問,所以您覺得是一般模式可能無法使用這個套件嗎?謝謝
您好,應該是我isNoOtherTerminal設定到true的關係,晚些我再試試看,非常感謝您的協助。
另在一般模式下我試了5、 6 次,重新反覆設定藍芽模組, 重置再連結Yale bridge, 寫HB config ,然後取得token,但都卡在取得令牌說錯誤而卡關,一次都沒成功過。
換了安全模式,重複一樣的動作,到了第三次,HB終端機就成功出現ID,鎖也就順利成功連上HB了。(但我也不知道為何是第三次才成功)
所以在我設定後的心得,確實安全模式才成功沒錯。
請您參考,謝謝。
不好意思, 更正一下, 是卡在取得ID不是令牌,謝謝
好的謝謝提供資訊,有可能必須要安全模式它才會分辨 ID,因為一般模式無法刪除單一裝置,也就沒有分辨 ID 的必要…
然後我今天發現 Yale 的伺服器好像炸了,如果你發現怎麼突然又連不上了,應該是 Yale 的問題,因為 App 也無法用 WiFi 控制
您好,下午不行,晚上好像又可以了,用HB也正常開關鎖了。
想再請教一下,若我也將原先的yale link app的藍芽也設定好,兩種使用方式:app開門與homekit開門,這樣會延遲開門速度嗎? 雖然有看了您的說明,但還是不太明白…,謝謝
如我上面回覆,我昨天晚上發現 Yale 的伺服器炸了,不是 HomeBridge 這邊的問題。
關於您的問題,是這樣的:
Yale Link App 開門有兩個模式
1. 直接連線藍牙
2. 透過 WiFi 連接 Bridge
如果你只透過藍牙,則 isNoOtherTerminal 可以設 true,HomeBridge 反應速度會變快
如果你 Yale Link App 會透過 WiFi 開鎖,則 isNoOtherTerminal 要設 false,才不會造成 HomeBridge 失效
您好,感謝您仔細的說明,完全明白了,我再試試看。謝謝您的協助與回覆。