17年的時(shí)候我入職了一家做智能家居的公司,終于寫(xiě)完了對(duì)這個(gè)項(xiàng)目進(jìn)行復(fù)盤(pán)。
復(fù)盤(pán)主要還是宏觀層面上的思考,并且挑選了部分模塊的案例。
智能硬件產(chǎn)品的形態(tài)是智能時(shí)鐘,這個(gè)idea是出自老板在兩年前早上洗漱時(shí)候覺(jué)得如果在這段時(shí)間希望能自動(dòng)提醒今天的天氣、新聞甚至車(chē)輛限號(hào)的情況。
這個(gè)場(chǎng)景其實(shí)在家居中目前還沒(méi)有成熟的產(chǎn)品能夠?qū)崿F(xiàn),原因有兩點(diǎn):
做智能硬件比單一的軟件在難度上要高很多,因?yàn)橐紤]到硬件的很多的模塊,比如底層系統(tǒng)架構(gòu),wifi模塊,顯示模塊,揚(yáng)聲器模塊,外觀等等因素,以及與手機(jī)之間的交互。
其二是由于技術(shù)不成熟目前的智能家居還未細(xì)化到對(duì)單一場(chǎng)景進(jìn)行智能優(yōu)化。
項(xiàng)目啟動(dòng)之初,首先是要考慮的是產(chǎn)品形態(tài),以什么樣的消費(fèi)升級(jí)來(lái)做這個(gè)概念。
經(jīng)過(guò)頭腦風(fēng)暴后,老板最終拍板決定使用時(shí)鐘。
硬件組成
接下來(lái)需要分析的是硬件方面的組成。
首先作為一個(gè)智能硬件,必要的是CPU,WiFi模塊,藍(lán)牙模塊。
而從概念來(lái)講那么一塊屏幕和揚(yáng)聲器也是必要的。
那么作為一款“電器”,還需要考慮的是,使用蓄電池還是使用插電式的方式,這就需要綜合產(chǎn)品形態(tài)來(lái)考量。
既然是時(shí)鐘,那么必然是掛在墻上幾乎不會(huì)移動(dòng)的,所以從能耗的出發(fā)點(diǎn),我們摒棄了電池以追求不必充電的效果,所以在時(shí)鐘下部墜了一根電源線(xiàn),而在線(xiàn)上參考手機(jī)耳機(jī)設(shè)置了調(diào)節(jié)音量的按鈕。
在操作上來(lái)講,首先是需要手機(jī)app進(jìn)行遠(yuǎn)程交互,另外在硬件上也需要一些簡(jiǎn)單的按鈕進(jìn)行操作。而設(shè)計(jì)之初由于成本的把控和技術(shù)的實(shí)現(xiàn),沒(méi)有加入語(yǔ)音控制系統(tǒng),那么也就不需要麥克風(fēng)。
在場(chǎng)景的考慮上,一款家居類(lèi)硬件我們需要它除了使用網(wǎng)絡(luò)獲取外界的信息,之外還需要有相應(yīng)的傳感器檢測(cè)整個(gè)家的一些情況,所以在這里我們加入了溫濕度傳感器。?

在硬件上的模塊清單大致如上。
設(shè)備設(shè)置
設(shè)備聯(lián)網(wǎng)
軟件這里也需要分成兩個(gè)部分來(lái)進(jìn)行設(shè)計(jì),一個(gè)是設(shè)備上的另一個(gè)是手機(jī)app。
軟硬件交互,是最基本的一個(gè)功能,首先面臨的問(wèn)題是關(guān)聯(lián)手機(jī)和如何讓硬件聯(lián)網(wǎng)。
時(shí)鐘的屏幕由于不是觸摸屏,所以需要用戶(hù)在手機(jī)上進(jìn)行聯(lián)網(wǎng)操作。

登錄后手機(jī)聯(lián)網(wǎng)引導(dǎo)界面
設(shè)備聯(lián)網(wǎng)為了友好顯示,做了分步驟進(jìn)行:?

開(kāi)機(jī)之后語(yǔ)音提示用戶(hù)掃描屏幕上的二維碼去應(yīng)用商店下載手機(jī)應(yīng)用,下載之后手機(jī)進(jìn)行登錄操作,此時(shí)按照手機(jī)上的說(shuō)明讓設(shè)備進(jìn)入了等待藍(lán)牙連接的狀態(tài)。
手機(jī)與設(shè)備藍(lán)牙連接之后,手機(jī)上輸入WiFi的信息會(huì)通過(guò)藍(lán)牙傳給設(shè)備,從而進(jìn)行設(shè)備聯(lián)網(wǎng)。
設(shè)備成功聯(lián)網(wǎng)之后,進(jìn)入新手引導(dǎo)環(huán)節(jié)。
操作引導(dǎo)
由于設(shè)備是自定義的操作模式,所以用戶(hù)需要引導(dǎo)進(jìn)行使用從而培養(yǎng)習(xí)慣。
設(shè)備上語(yǔ)音+動(dòng)畫(huà)的形式幫助說(shuō)明:
音量控制、切換應(yīng)用、喚起菜單、播放/暫停、選擇 等的簡(jiǎn)單操作。
手機(jī)應(yīng)用設(shè)計(jì)
手機(jī)上的應(yīng)用采用了常規(guī)的底欄按鈕分頁(yè)面設(shè)計(jì)。
首頁(yè):是對(duì)于設(shè)備中插件的一些操作(類(lèi)似我們?cè)谑謾C(jī)或電腦的桌面,或者可以理解為遙控器),也包含了一些常用的設(shè)備快捷操作及增刪設(shè)備上的插件(功能)。
插件商店(精選):用戶(hù)可以在商店中下載需要的一些插件(功能)。
*插件:
為避免和應(yīng)用這一名詞的混淆(如微信、淘寶等),我們將設(shè)備上的應(yīng)用定義為插件。
也就是說(shuō),在App Store或Google Play下載下來(lái)的是應(yīng)用(即在應(yīng)用商店下載了“時(shí)鐘應(yīng)用”),而在我們時(shí)鐘應(yīng)用中的插件商店可以下載到插件對(duì)設(shè)備進(jìn)行安裝使用。
所以在設(shè)計(jì)插件時(shí)不僅需要做手機(jī)端的插件,還需要做設(shè)備端的插件,并且保證雙方版本號(hào)一致,才能夠進(jìn)行正常使用。
在這里的插件下載不需要手機(jī)端應(yīng)用的升級(jí)和更新(只有ROM/Launcher有修改時(shí),手機(jī)端應(yīng)用或設(shè)備需要推送升級(jí))。
個(gè)人中心:包括了賬號(hào)設(shè)置、不常用的設(shè)備操作以及設(shè)備基本設(shè)置,如解綁設(shè)備、添加設(shè)備、添加用戶(hù)、切換設(shè)備等。

智能播報(bào)
在我入職之前,大部分基礎(chǔ)功能已經(jīng)做好了,比如設(shè)備設(shè)置、賬號(hào)系統(tǒng)、以及部分插件如時(shí)鐘、電臺(tái)、藍(lán)牙音樂(lè)。
我需要做的是各個(gè)部分的優(yōu)化以及新插件。
在做智能播報(bào)之前,我發(fā)現(xiàn)設(shè)備似乎少了點(diǎn)什么。
設(shè)備總是需要被動(dòng)的去喚起某一項(xiàng)功能,比如看天氣時(shí)需要手動(dòng)切換到天氣插件,需要聽(tīng)電臺(tái)時(shí)又需要手動(dòng)切換至電臺(tái)插件。
基于這個(gè)思路,結(jié)合現(xiàn)在已有的功能,我想到了讓設(shè)備主動(dòng)去推信息流。也就是說(shuō)當(dāng)用戶(hù)預(yù)設(shè)好了場(chǎng)景后,就可以收聽(tīng)信息。
再回到idea的階段,用戶(hù)的需求是在洗漱的時(shí)間收聽(tīng)時(shí)間、天氣、限行及路況。
那么一旦洗漱時(shí)間固定,我們就可把這個(gè)信息流做進(jìn)鬧鐘里,時(shí)間到了就自動(dòng)序列去播放內(nèi)容。
而這樣一個(gè)功能聯(lián)動(dòng)了不同的插件,同時(shí)也不適合做成新插件,就需要在launcher中加入一個(gè)提醒狀態(tài),可以類(lèi)似手機(jī)中鬧鐘響了桌面會(huì)覆蓋一個(gè)圖層顯示當(dāng)前鬧鐘狀態(tài),用戶(hù)可以進(jìn)行手動(dòng)關(guān)閉。同樣的,我們?cè)谠O(shè)備上也設(shè)置了手動(dòng)關(guān)閉的操作。
自動(dòng)播報(bào)
我們可以讓用戶(hù)在手機(jī)上設(shè)置好播放內(nèi)容、時(shí)間等并該播報(bào)處于開(kāi)啟狀態(tài),到時(shí)間時(shí)就可以進(jìn)行播報(bào)。

手機(jī)端智能播報(bào)頁(yè)面
而設(shè)備端會(huì)暫停當(dāng)前音頻,進(jìn)入‘智能播報(bào)順序流’,跳轉(zhuǎn)至對(duì)應(yīng)插件頁(yè)面。
播報(bào)順序:
鈴聲:20秒音樂(lè),第15秒開(kāi)始減弱。
叮咚音效(選擇鈴聲時(shí),該音效不播放;未選擇鈴聲時(shí)播放該音效)
時(shí)間tts:{{早上(4:00-12:00]/下午(12:00-18:00]/晚上(18:00-4:00]}}好,現(xiàn)在是{{19}}點(diǎn){{17}}分,桔貓為您準(zhǔn)備了{(lán){起床播報(bào)}}。
日歷tts:今天是{{2018}}年{{1}}月{{1}}日,星期二,農(nóng)歷{{冬}}月{{十五}}。(設(shè)備端顯示日歷頁(yè)面)
天氣tts:當(dāng)前為您播報(bào)的是{{西安}}的天氣,今日{(diào){雨夾雪}},最高氣溫{{1}}度,最低氣溫{{零下3}}度,PM2.5為{{400}},{{重度污染,外出請(qǐng)戴好防霾口罩}}。{{易發(fā)感冒}},{{今天不適宜洗車(chē)}}。(設(shè)備端顯示天氣頁(yè)面)
新聞tts:現(xiàn)在為您播報(bào)桔貓{{國(guó)內(nèi)}}新聞:{{……}}(設(shè)備端顯示新聞頁(yè)面)
mozik:現(xiàn)在為您播報(bào)的是mozik精選音樂(lè)(設(shè)備端顯示mozik頁(yè)面)
手動(dòng)播報(bào)
而定時(shí)播報(bào)幾乎僅限類(lèi)似于時(shí)間規(guī)律的場(chǎng)景,那如果我們也想讓用戶(hù)在不固定的時(shí)間聽(tīng)到播報(bào)推送要怎么做?
時(shí)間不固定的場(chǎng)景最典型的的是下班回家,由于下班的時(shí)間以及路上所花費(fèi)的時(shí)間導(dǎo)致下班回家不是固定的時(shí)間,那么首先要考慮的是如何獲得用戶(hù)回家的信息。
一開(kāi)始我想到了一回家用戶(hù)的手機(jī)會(huì)自動(dòng)連上家里的WiFi,通過(guò)這一信息聯(lián)動(dòng)傳遞,設(shè)備獲知了用戶(hù)連上WiFi了就等同于下班了。但對(duì)此,開(kāi)發(fā)也進(jìn)行了技術(shù)預(yù)研,發(fā)現(xiàn)并不能從路由器或手機(jī)系統(tǒng)獲得相關(guān)數(shù)據(jù)。
關(guān)鍵詞是“快捷”“用戶(hù)想聽(tīng)”,從這兩點(diǎn)出發(fā),我想到了在設(shè)備上設(shè)置一個(gè)快捷喚醒智能播報(bào)的操作。
同時(shí)在錯(cuò)過(guò)了“想聽(tīng)”的時(shí)候不會(huì)再去推,這樣也就需要時(shí)效性。比如說(shuō)用戶(hù)下班已經(jīng)是晚上11點(diǎn),回到家只想倒床就睡,那么設(shè)備一旦過(guò)了“播報(bào)有效期”就默認(rèn)今天不需要播報(bào),提示也會(huì)在設(shè)備屏幕上消失。
這樣一來(lái)就有了“手動(dòng)播報(bào)”的定義:在預(yù)設(shè)好的某一時(shí)間段內(nèi),手動(dòng)拉動(dòng)拉繩開(kāi)始進(jìn)行播報(bào)。

手動(dòng)播報(bào)
當(dāng)?shù)竭_(dá)用戶(hù)所設(shè)置的手動(dòng)播報(bào)時(shí)間段內(nèi),設(shè)備端底部彈出如圖彈框;
[已為您準(zhǔn)備好今日的{{播報(bào)名}} 下拉拉繩開(kāi)始收聽(tīng)]
下拉拉繩后進(jìn)入自動(dòng)播報(bào);
當(dāng)過(guò)了有效時(shí)間時(shí),底部彈框消失,手動(dòng)播報(bào)不會(huì)被觸發(fā)。

編輯播報(bào)頁(yè)面
手機(jī)端新增播報(bào)頁(yè)面
‘重復(fù)’與當(dāng)前鬧鐘選擇【重復(fù)頁(yè)面】一致,點(diǎn)擊跳轉(zhuǎn)【重復(fù)頁(yè)面】;
‘播報(bào)內(nèi)容’顯示當(dāng)前已選序列流內(nèi)容名,點(diǎn)擊進(jìn)入【播報(bào)內(nèi)容頁(yè)面】;
點(diǎn)擊‘播報(bào)時(shí)長(zhǎng)’跳轉(zhuǎn)至【播報(bào)時(shí)長(zhǎng)頁(yè)面】,可選項(xiàng)有:5 分鐘 10分鐘 15分鐘 20分鐘 30分鐘 自定義,點(diǎn)擊自定義彈框彈出[0-12]小時(shí)[0-59]分鐘選項(xiàng),點(diǎn)擊確定后,‘對(duì)勾標(biāo)記’停留在‘自定義’一欄,點(diǎn)擊確定,【編輯播報(bào)頁(yè)面】顯示播放時(shí)間為 {{分鐘}}分鐘;
顯示:
0小時(shí)X分鐘顯示 X分鐘
X小時(shí)0分鐘顯示X小時(shí)
點(diǎn)擊‘手動(dòng)播報(bào)’可進(jìn)行切換開(kāi)啟/關(guān)閉,時(shí)長(zhǎng)選擇范圍與播報(bào)時(shí)長(zhǎng)一致;
點(diǎn)擊右上角‘確定’為保存,該播報(bào)開(kāi)關(guān)依然保持之前的狀態(tài);
點(diǎn)擊左上角‘返回箭頭’視為取消操作(未保存)。
插件設(shè)計(jì)
新聞播報(bào)插件
新聞模塊最簡(jiǎn)單的方式是接入了第三方的API,我們?cè)诤笈_(tái)設(shè)置定時(shí)的拉流接口就可以了。
新聞播報(bào)這個(gè)插件在我入職之前就已經(jīng)上線(xiàn)了,但由于硬件設(shè)備與手機(jī)不同,會(huì)出現(xiàn)一些因?yàn)樵O(shè)備關(guān)閉/斷網(wǎng)的狀態(tài)導(dǎo)致的一些問(wèn)題,這個(gè)就算是一個(gè)邏輯優(yōu)化。
問(wèn)題:之前新聞播放到A,過(guò)了幾天之后進(jìn)入新聞界面,設(shè)備端顯示A的標(biāo)題,手機(jī)端底部不顯示播放進(jìn)度bar,設(shè)備端點(diǎn)擊中鍵后不能播放。
原因:進(jìn)入新聞界面后:手機(jī)端的播放記錄是從服務(wù)器拉取,這個(gè)時(shí)候服務(wù)器返回空,所以底部播放記錄的bar不展示;設(shè)備端的播放記錄是讀的本地,所以顯示A,點(diǎn)擊播放的時(shí)候請(qǐng)求服務(wù)端,由于A已經(jīng)被刪掉所以點(diǎn)擊中鍵后不能播放。
優(yōu)化:
每次更新新聞之后,設(shè)備端顯示當(dāng)前所選頻道的(最新更新的)第一條新聞,不顯示上次的播放記錄(早上6:50-7:00之間用戶(hù)打開(kāi)新聞應(yīng)用,需要設(shè)備端主動(dòng)拉取新聞內(nèi)容,檢查該新聞是不是今天的新聞);
判斷歷史記錄是不是當(dāng)天的;
每天只刪除一次新聞內(nèi)容,刪除時(shí)間點(diǎn)是每天早上6:50,設(shè)備端保持一致;
新聞更新失敗要有重試邏輯,播放后臺(tái)已經(jīng)刪除的新聞BUG解決;

流程圖

測(cè)試用例
倒計(jì)時(shí)插件
作為時(shí)間類(lèi)的設(shè)備,常用的功能必然是與時(shí)間相關(guān)。
在一次頭腦風(fēng)暴中,同事們提到有時(shí)候經(jīng)常會(huì)用到提醒工具,比如提示敷面膜的倒計(jì)時(shí),以防時(shí)間過(guò)長(zhǎng)。
那么此類(lèi)的工具在家的場(chǎng)景下使用設(shè)備操作更為方便,于是構(gòu)思了在移動(dòng)端設(shè)置常用的倒計(jì)時(shí),在設(shè)備上進(jìn)行使用。
計(jì)時(shí)器通常的設(shè)置需要名稱(chēng)及時(shí)長(zhǎng),所以在手機(jī)端添加只有這兩個(gè)字段。

手機(jī)端添加計(jì)時(shí)器
而在設(shè)備上呈現(xiàn)的需要三種狀態(tài):未開(kāi)始-進(jìn)行中-已結(jié)束。
同時(shí)也需要展示倒計(jì)時(shí)名稱(chēng),倒計(jì)時(shí)所剩時(shí)間。
操作上有切換倒計(jì)時(shí)及開(kāi)始/結(jié)束倒計(jì)時(shí)。
倒計(jì)時(shí)結(jié)束tts:
[【音效】您設(shè)置的計(jì)時(shí)器{{煮雞蛋}}已結(jié)束];
異常情況的處理是每一個(gè)設(shè)計(jì)都需要考慮到的部分,在設(shè)計(jì)倒計(jì)時(shí)的時(shí)候,異常情況大概會(huì)有以下幾條:
主從用戶(hù)是否需要同步‘倒計(jì)時(shí)信息’;
設(shè)備關(guān)閉/斷電等原因關(guān)機(jī),如何處理;
鬧鐘/提醒來(lái)時(shí),聲音是否會(huì)重復(fù);
正在進(jìn)行倒計(jì)時(shí),手機(jī)端添加一條倒計(jì)時(shí),設(shè)備端是否需要刷新,及倒計(jì)時(shí)的順序;
這里給出解決方案:
(當(dāng)前倒計(jì)時(shí)結(jié)束后順序重置,如:有倒計(jì)時(shí)ABC,A為第一個(gè)倒計(jì)時(shí),顯示:CAB,當(dāng)前進(jìn)行倒計(jì)時(shí)A,此時(shí)手機(jī)端添加倒計(jì)時(shí)D,按下鍵則顯示DAB(A被選中)
設(shè)備端倒計(jì)時(shí)正在進(jìn)行,手機(jī)端管理倒計(jì)時(shí),當(dāng)前倒計(jì)時(shí)不受影響。該倒計(jì)時(shí)結(jié)束時(shí),同步手機(jī)端信息;)
其他
升級(jí)更新
硬件設(shè)備比較難的一點(diǎn)是ROM升級(jí),在研發(fā)狀態(tài)時(shí)候可以隨時(shí)打開(kāi)設(shè)備插上數(shù)據(jù)線(xiàn)更換ROM包,而對(duì)于測(cè)試階段多個(gè)設(shè)備情況下就需要批量統(tǒng)一升級(jí),這里就必須要使用OTA進(jìn)行升級(jí)。

交互流程如泳道圖
強(qiáng)制更新:
后臺(tái)推送之后,會(huì)使用第三方OTA推送至設(shè)備,設(shè)備處于非離線(xiàn)的狀態(tài)就可以立即進(jìn)入更新;
設(shè)備重新聯(lián)網(wǎng)時(shí)需要主動(dòng)請(qǐng)求當(dāng)前版本是否與后臺(tái)版本一致,如果不一致會(huì)立即進(jìn)入更新。
非強(qiáng)制更新:
用戶(hù)在手機(jī)端確認(rèn)更新后,設(shè)備開(kāi)始下載更新安裝包,下載完成后,設(shè)備則自動(dòng)開(kāi)始進(jìn)入更新?tīng)顟B(tài)。