Flipper BUSY Bar

Marius

Flipper BUSY Bar

原文由 Marius 發布,訂閱此部落格

一篇關於 Flipper BUSY Bar 的評測——一款搭載 GPL 韌體、具備 HTTP API 與 Matter 相容性的 72x16 RGB LED 矩陣桌上裝置,來自曾打造過 Lemon 的那位作者。

Flipper BUSY Bar

是的,它真的存在,我正拿在手上。在 Flipper 於各種線上貼文中用這款神祕裝置吊足大家胃口、感覺像是過了好幾年之後,我終於可以證實:它是真的。

BUSY BarFlipper Devices 打造的一款 250 公克桌上裝置,這家公司就是 Flipper Zero 背後的團隊,而仍在開發中的 Flipper One 也是出自他們之手。基本上,它就是一塊能在 72x16 RGB LED 矩陣上顯示各種資訊的小螢幕;就本文撰寫當下,它最主要的賣點是能執行番茄鐘風格的專注計時器,以及擁有一套完整的 HTTP API,可透過 USB、區域網路與網際網路來控制它。

BUSY Bar 頂部有一個五段式切換開關,可在兩種專注模式(BUSYCUSTOM,功能上完全相同,僅預設值不同)、OFF 檔位(實際上比較像是休眠模式,會關掉兩面螢幕)、目前只內建時鐘的 Apps 檔位,以及用來……調整設定的 Settings 檔位之間切換。中間有一顆大型機械按鍵用來開始與暫停計時,滾輪可調整計時器並兼作 OK 鍵,最後還有一個返回鍵,供需要返回上一層時使用。

說到背面,裝置背面配有一塊 1.54 吋單色 OLED,會顯示計時器、電量百分比以及 Wi-Fi、藍牙與 USB 指示燈。如此一來,即便用內建支架夾在螢幕上緣、讓主矩陣顯示器朝外,裝置對使用者本人來說依然可用。

規格

裝置尺寸為 168.6 x 55.2 x 40.8mm,重量為 250g/8.82oz。機身採用 PC/ABS 材質,正面與背面面板為 PC,螢幕支架的緩衝墊為 TPE。它可夾在厚度達 21mm 的螢幕上,我也能確認在曲面螢幕上同樣可用。不過,如果你的螢幕特別薄(例如某些可攜式螢幕),就可能無法穩固地架在上面。

根據 Flipper 官方文件公布的完整規格如下:

規格項目詳細資訊
主顯示器72x16 RGB LED 矩陣,主動區域 158.4x35.2mm,60 Hz;LED 尺寸 1.23x1.2mm,間距 2.2mm,共陽極;ICND2153 + ICN2012 驅動晶片;可透過光感測器手動或自動調整亮度
背面顯示器1.54 吋單色 OLED,160x80,16 階灰階,60 Hz;透過 SPI 的 SSD1320 控制器
主控 MCUSTM32U595RI,Arm Cortex-M33 @ 160 MHz,具 MPU、FPU 與 DSP;2 MB 快閃記憶體,2.5 MB SRAM
無線 MCUSilicon Labs SiWG917M111MGTBA,Arm Cortex-M4F @ 180 MHz;8 MB 快閃記憶體,672 KB SRAM
無線通訊Wi-Fi 6(IEEE 802.11 b/g/n/ax),僅支援 2.4 GHz,WPA3;Bluetooth Low Energy 5.4
儲存空間8 GB eMMC NAND
音訊單聲道;透過 I2S 以 44.1 kHz 運作的 NS4168 DAC,內建 D 類放大器;6 歐姆,0.8 W
電池單顆 18650,3250 mAh,A2007-H04 4-pin 連接器;具備過充、過放、過溫與低溫保護
充電使用 18 W 以上 PD 充電器約 2.5 小時,否則需 7 至 8 小時
USB-CUSB 2.0 Full Speed 裝置,12 Mbit/s;PD 3.0,5V⎓3A 與 9V⎓1.5A
操控介面機械開關、滾輪編碼器、五段式模式切換器、返回鍵

這片 72x16 矩陣由 ICND2153 驅動,這是一款 16 通道定電流 PWM 汲極驅動器,具備 16 位元灰階移位暫存器、LED 開路偵測與用於降低殘影的預充電路,以及 ICN2012 這顆 8 通道電源開關。

在 2026 年還只支援 2.4 GHz 的 Wi-Fi,多少讓人有點遺憾。在充滿各種裝置與微波爐的辦公室環境中,BUSY Bar 使用的是目前最為壅塞的頻段。USB 方面也只能說是「輕量級」,最高速度僅 12 Mbit/s,不過,對於用來提供網頁介面與 HTTP API 的虛擬乙太網路介面來說,倒是綽綽有餘。

充電方面,文件上寫著要達到 2.5 小時的充電時間需要 18 W 以上的 PD 充電器,但裝置本身似乎只支援 5V⎓3A(15 W)與 9V⎓1.5A(13.5 W)這兩種 PD 模式。

關於顯示器亮度有一處不一致:技術規格頁面完全沒有標示亮度數值,產品頁面目前寫的是 400 nits,而來自 CNX SoftwareXDA 的首發報導則都標為 800 nits。我沒有儀器可以測量,所以無法確定究竟是哪一個,但可以保證的是,即便在光線充足的環境下,它的亮度也非常足夠。

內部結構

Flipper 在 iFixit 上發布了官方拆解指南,這點非常值得讚賞。指南共 21 個步驟,描述了一款以可維修性為設計考量的裝置。背蓋由 8 個卡扣固定,用塑膠卡片就能拆下;底下有 5 顆 PH1 十字螺絲,一顆在底部、四顆在背面。電池採用按壓式卡扣連接器,必須最先拔除。顯示器的軟排線使用撬棒開啟的卡扣,主機板由 3 顆螺絲固定,控制板由 5 個卡扣固定,前顯示器背蓋由 6 個卡扣固定,按鍵穩定器則由 3 顆螺絲固定。螢幕支架腳架為緊配式設計。

沒有任何零件是用膠黏的,電池則是採用 4-pin 連接器的標準 18650 電芯,這意味著在多數電子材料行都能輕鬆、便宜地買到替換品。對於 2026 年的消費性電子產品來說,這大概會讓同樣支持維修權的夥伴們非常喜愛。

韌體

韌體原始碼已在 GitHub 上以 busy-app/busybar-firmware 的形式公開。大部分官方程式碼採用 GPL 授權,furi 函式庫為 MIT,圖像素材為 CC-BY 4.0,字型則為 OFL 1.1,這些皆在 REUSE 清單中聲明。

建置系統為 FBT,也就是 Flipper Zero 所使用的、以 SCons 為基礎的 Flipper Build Tool;依賴套件則是一套常見的嵌入式技術堆疊,底層是 Flipper 自家 furi 抽象層之下的 FreeRTOSlwIP 負責 TCP/IP,TinyUSB 處理 USB 裝置端,Mongoose 作為嵌入式 HTTP 與 WebSocket 伺服器,mbedTLS 負責 TLS,LVGL 則負責 UI。

BUSY Bar 還在 lib/jerryscript 中內建了 JerryScript,並透過 lib/js_appjs_runner 服務串接起來。這正是 Flipper Zero 用於腳本應用程式的同一套 JavaScript 引擎。既然韌體中已經內建了引擎,現階段似乎只差一個將自己的腳本載入裝置的正式文件化方法。

HTTP API

BUSY Bar 運行著 HTTP 伺服器,並透過三種傳輸方式提供同一套 API,相關文件以 OpenAPI 3.1 格式撰寫。

透過 USB 將裝置連接到電腦時,會建立一個虛擬乙太網路介面,裝置的固定位址為 10.0.4.20,印在機身背面。http://10.0.4.20/ 是本地網頁介面,http://10.0.4.20/docs 是由裝置當前韌體產生的 API 參考文件,而 http://10.0.4.20/api 則是該 API 的基礎 URL。透過 USB 存取時不需要驗證,但透過 Wi-Fi 時可以使用驗證,而經由 Flipper 雲端存取時則必須驗證。

範例

curl -s http://10.0.4.20/api/status/power
{
  "state": "discharging",
  "battery_charge": 99,
  "battery_voltage": 4183,
  "battery_current": -180,
  "usb_voltage": 4843
}

此請求會回傳目前的電源狀態。電池電流單位為 mA,電池與 USB 電壓單位皆為 mV,這表示你無需額外硬體就能繪製裝置本身的耗電曲線。

注意:透過 Wi-Fi 的存取預設為關閉,必須先透過 USB 在本地網頁介面中啟用。啟用後,你可以自行設定一組用於驗證的 token,若有設定,需放在 X-API-Token 標頭中:

curl -s http://192.168.1.42/api/status \
  -H 'Accept: application/json' \
  -H 'X-API-Token: 12345678'

透過網際網路的存取則是經由 Flipper 雲端,使用在 cloud.busy.app 產生的 bearer token,範圍可限定為單一裝置或整個帳號:

curl -s https://api.busy.app/busybar/status \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer <token>'

函式庫

Flipper 為 Python 維護了 busylib,同時提供同步與 asyncio 客戶端。它將方法名稱直接對應到 API 路徑,例如 /api/display/draw 會變成 display_draw/api/storage/remove 則變成 storage_remove。這讓 OpenAPI 文件可以直接作為該函式庫的參考文件:

from busylib import BusyBar, types

bb = BusyBar("10.0.4.20")

bb.display_draw(
    types.DisplayElements(
        application_name="my-app",
        elements=[
            types.TextElement(
                id="status",
                type="text",
                x=2,
                y=4,
                text="BUILDING",
                font="small",
                display=types.DisplayName.FRONT,
            ),
        ],
    )
)

該函式庫還包含一個 converter 模組,可為裝置縮放並重新編碼圖片與音訊,一個用於 _busybar._tcp 的 mDNS 探索輔助工具,以及韌體相容性檢查。

除此之外,還有一個給所有 soydev 的官方 TypeScript 函式庫,以及一個由社群維護的 .NET 客戶端。另外還有一個 Zig 函式庫,不過……稍後再詳談。:-)

智慧家庭

BUSY BarMatter 中以單一的開/關端點呈現,是一個可設定啟動狀態為 offontogglelast 的模擬開關。將其開啟會啟動 BUSY 計時器,關閉則會結束計時,使這項整合得以作為觸發器。要將狀態回報給 Matter,需要在 Settings ➔ Smart home 中開啟,此時專注時段就能驅動自動化,例如在計時器啟動時調暗燈光或鎖門。

配對可透過背面螢幕或網頁介面上的 QR code 完成,且裝置可同時加入多個 fabric。

Home Assistant 的整合是透過 HTTP API 並使用通用的 REST 功能完成,可雙向運作——既能將裝置作為自動化觸發器,也能將其作為家中其他裝置的輸出端。

應用程式

BUSY Bar 提供了智慧型手機用的行動應用程式。我測試了它的 iOS 版本,嗯,只能說還算可以吧。我本來就不是重度的手機 App 使用者,不過還是分享一下我的看法。

這個 App 基本上就是鏡射 BUSY Bar 目前的狀態,並提供基本的控制功能。當你啟動計時器且已設定好 App(透過 Flipper 雲端)後,會看到 App 推送一則常駐通知,在手機鎖定畫面上顯示計時器。也可以設定「請勿打擾」模式,在計時器運行期間防止其他 App 打斷你的專注時段。

對我來說這些算是噱頭,但對其他人而言或許有其價值。話雖如此,這些 App 的評價並不算高,雖然我在測試 iOS 版本的幾天內沒有遇到任何問題,但 App 在外觀與操作上的確給人一種有點廉價的感覺。感覺就像是大型硬體廠商裡那些企業老派主管會想出來的 App,誤以為自己很懂當今年輕世代想要什麼。

缺點

有幾點讓我有點在意,不過都還不到構成致命缺點的程度。

Wi-Fi 驗證採用單一共享的數字金鑰,受 API schema 限制為 ^[0-9]{4,10}$,透過未加密的 HTTP 以明文標頭在區域網路中傳送。以四位數下限來算,金鑰空間只有 10,000 種組合,而且我沒有找到任何關於速率限制的文件。存取模式的列舉值中除了 key 之外還包含 enabled,這表示 API 可以在區域網路上完全不設金鑰就開放存取。因此,最好使用十位數的金鑰,並避免讓裝置連上你無法掌控的網路。

再來就是一大堆「即將推出」。安裝使用者 App、JS SDK、Windows 應用程式以及更豐富的 App 資料庫,這些全都是未來的承諾。我並不懷疑 Flipper 團隊最終會兌現,但可以想像,對於非技術使用者來說,買了一個現階段幾乎沒什麼功能的裝置,恐怕會非常令人沮喪,尤其是在 Windows 電腦上。今天收到的這台裝置,說穿了就是一個專注計時器、一個時鐘,以及一個狀態顯示器。

最後是價格。它最初對等候名單成員的售價為 USD 179,接著前 3,000 台為 USD 199,最終零售價則標為 USD 249。以 249 美元的價格,尤其是在目前的軟體狀態下,實在很難讓人下手。如果你是技術使用者,真心想拿來把玩一番,或許還算值得,但如我過去 所展示的,你完全可以自行以便宜許多的成本打造類似的裝置,特別是當你早已深陷動手做的坑裡時。

總結

Flipper 打造出了我預期他們會打造的裝置,這句話是真心的讚美。硬體方面,一如 Flipper 產品一貫的風格,對於一個狀態燈來說可謂過度設計——配備真正的機械開關、真正的編碼器、可替換的 18650 電池、官方拆解指南,而且全機無任何膠黏。

是否值得花這筆錢,完全取決於你打算拿它來做什麼。如果只是想當作叫同事走開的告示牌,它實在太貴而且一點也不管用,因為會打擾你的人並不會被一塊寫著「請勿打擾」的牌子嚇退。換個方式說:用比 BUSY Bar 零售價便宜約 $50 的價格,你可以在桌上擺上一把 Smith and Wesson 的其中一款,那可能會是更有效阻止同事來找你聊天的方法。

然而,若把它看作一塊小巧、做工精良、可完全透過腳本控制的 RGB 矩陣,具備 8 GB 檔案系統、WebSocket,以及一套精密的優先權系統,讓多個程式可以共享同一塊螢幕而不互相覆蓋,那麼它就是同類產品中最開放、也可能是最好的選擇,我相信社群會發掘出連 Flipper 都還沒想到的用途。

PS:關掉 BUSY Bar 就像要退出 Vim 一樣,因為它沒有提供直觀的關機方式。是的,頂部的切換開關有一個「OFF」檔位,但那只是關掉顯示器,BUSY Bar 本身仍在運行並保持 Wi-Fi 連線。如果你想徹底關機以避免耗電,必須將開關切到「Settings」檔位,依序進入 SystemPowerShutdown,並以 Yes 確認關機。只有這樣,裝置才會真正關閉。

番外:busybar.zig

如前所述,我想藉這篇評測分享一個小小的額外成果,那就是一個盡可能貼近實作 BUSY Bar 現行 OpenAPI 規格的 Zig 函式庫,並附帶一個可透過 HTTP API 控制裝置的 busybar 命令列工具。

該函式庫僅使用 Zig 的 std 函式庫,因此支援 Zig 的所有平台目標,本身也相當輕量且易於使用。我自己就在 BUSY Bar 上使用它,運作得非常順暢。命令列工具還包含一些提升使用體驗的功能,例如用簡單指令啟動與停止忙碌模式,否則就得手動撰寫 JSON 酬載。

長話短說,如果你已經訂購了 BUSY Bar,或許正想將它整合到 Zig 工具中,甚至只是想用自己的腳本整合到桌面環境,歡迎參考 busybar.zig 儲存庫。如果你只是想拿 CLI 工具來把玩 BUSY Bar,也可以在 GitHub 上的發佈頁面找到所有支援平台的建置版本。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言