Flipper BUSY Bar

Marius

Flipper BUSY Bar

原文は Marius により に公開されました。 このブログを購読する

かつてLemonを製作した筆者による、72×16 RGB LEDマトリクス搭載のデスクデバイスFlipper BUSY Barのレビュー。GPLファームウェア、HTTP API、Matter対応を備える。

Flipper BUSY Bar

そう、これは実在する。いま手に持っている。何年にもわたってFlipperがオンライン上のあちこちでこの不穏なデバイスをちらつかせてきたように感じていたが、ついに本物であることを確認できた。

BUSY Barは、Flipper Devicesによる重量250グラムのデスクデバイスだ。同社はFlipper Zeroや、現在も鋭意開発中のFlipper Oneで知られている。基本的には72×16のRGB LEDマトリクスにさまざまな情報を表示する小さなディスプレイで、執筆時点での主な売りはポモドーロ風のフォーカスタイマーが使えることと、USB、ローカルネットワーク、インターネット経由で本体を制御できる本格的なHTTP APIを備えていることだ。

BUSY Barの天面には5ポジションのセレクターがあり、2つのフォーカスモード(BUSYCUSTOM。機能的には同一でデフォルト設定のみが異なる)、実際には両方のスクリーンを消すスリープモードのようなOFFポジション、現在は時計だけが入っているアプリポジション、そしてその名のとおり設定用のポジションを切り替えられる。中央の大きなメカニカルボタンでセッションの開始/一時停止を行い、スクロールホイールでタイマーを調整しつつOKボタンも兼ね、最後に「戻る」ボタンでナビゲーションを戻せる。

「戻る」ついでに言うと、デバイスの背面には1.54インチのモノクロOLEDがあり、タイマー、バッテリー残量、Wi-Fi、Bluetooth、USBのインジケーターを表示する。これにより、内蔵マウントでモニターの天板に挟み、メインのマトリクスディスプレイを自分とは反対側に向けた状態でも、使用者自身がデバイスを使い続けられる。

仕様

本体サイズは168.6×55.2×40.8mm、重量は250g/8.82oz。筐体はPC/ABS製で、前面と背面のパネルはPC、モニターマウントのパッドはTPEだ。最大21mm厚までのモニターに取り付け可能で、曲面ディスプレイでも問題なく使えることを確認した。ただし、ポータブルディスプレイのような特に薄いモニターでは、上に乗せることはできない。

Flipper自身のドキュメントで公開されている完全な仕様は以下のとおりだ。

仕様詳細
メインディスプレイ72×16 RGB LEDマトリクス、有効表示領域158.4×35.2mm、60Hz。LEDサイズ1.23×1.2mm、ピッチ2.2mm、コモンアノード。ICND2153ICN2012ドライバ。光センサーによる手動/自動輝度調整
背面ディスプレイ1.54インチ モノクロOLED、160×80、16階調グレースケール、60Hz。SSD1320コントローラ、SPI接続
メインMCUSTM32U595RI、Arm Cortex-M33 @ 160MHz(MPU、FPU、DSP搭載)。フラッシュ2MB、SRAM 2.5MB
ワイヤレスMCUSilicon Labs SiWG917M111MGTBA、Arm Cortex-M4F @ 180MHz。フラッシュ8MB、SRAM 672KB
ワイヤレスWi-Fi 6(IEEE 802.11 b/g/n/ax)、2.4GHzのみ、WPA3。Bluetooth Low Energy 5.4
ストレージ8GB eMMC NAND
オーディオモノラル。NS4168 DAC(I2S、44.1kHz)、Class Dアンプ内蔵。6Ω、0.8W
バッテリー1セル 18650、3250mAh、A2007-H04 4ピン端子。過充電、過放電、過熱・低温保護あり
充電18W以上のPD充電器で2.5時間、それ以外では7〜8時間
USB-CUSB 2.0 Full Speedデバイス、12Mbit/s。PD 3.0、5V⎓3Aおよび9V⎓1.5A
操作系メカニカルスイッチ、スクロールホイールエンコーダ、5ポジションモードセレクター、戻るボタン

72×16のマトリクスはICND2153で駆動される。16チャンネルの定電流PWMシンクドライバで、16ビットグレースケールのシフトレジスタ、LEDオープン検出、ゴースト低減用のプリチャージ回路を備え、さらにICN2012の8チャンネルパワースイッチと組み合わされている。

2026年時点で少し残念なのは、Wi-Fiが2.4GHzのみに対応していることだ。デバイスや電子レンジがひしめくオフィス環境では、最も混雑する帯域を使うことになる。USB側も最大12Mbit/sと、いわばライトな仕様だが、Web UIとHTTP APIを提供する仮想イーサネットインターフェースとしては十分ではある。

充電については、ドキュメントでは2.5時間という数値に18W以上のPD充電器が必要とされているが、デバイス自体が対応しているPDモードは5V⎓3A(15W)と9V⎓1.5A(13.5W)のみのように見える。

ディスプレイの輝度については食い違いがある。技術仕様ページには輝度の数値自体が記載されておらず、製品ページでは現在400ニト、CNX SoftwareXDAの発売時の記事ではいずれも800ニトとされている。測定できる機材を持っていないのでどちらが正しいかは判断できないが、明るい場所でも十分に明るいことは保証できる。

内部構造

FlipperはiFixitで公式の分解ガイドを公開しており、素晴らしい。21ステップで、修理しやすさを考慮して設計されたデバイスの姿が描かれている。背面カバーは8つのクリップで留まっており、プラスチックのカードで外せる。その下には5本のPhillips PH1ネジがあり、底面に1本、背面に4本ある。バッテリーはプッシュラッチ式のコネクタで、他の何よりも先に外す必要がある。ディスプレイのフレキシブルケーブルはスパッジャーで外すラッチ、メイン基板は3本のネジ、コントロール基板は5つのラッチ、前面ディスプレイの裏蓋は6つのラッチ、ボタンスタビライザーは3本のネジで固定されている。モニターマウントの脚は摩擦ではめ込むだけだ。

接着されている部分は一切なく、バッテリーは4ピン端子の標準的な18650セルなので、交換品はたいていの電子部品店で安く簡単に入手できる。2026年のコンシューマー向けデバイスとしては、Right to Repairを支持する仲間たちにはたまらないはずだ。

ファームウェア

ファームウェアのソースは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抽象化の下にFreeRTOS、TCP/IP用のlwIP、USBデバイス側のTinyUSB、組み込み用HTTP/WebSocketサーバーのMongoose、TLS用のmbedTLS、UI用のLVGLといった構成である。

本機はlib/jerryscriptJerryScriptも含み、lib/js_appjs_runnerサービスを介して組み込まれている。これはFlipper Zeroがスクリプトアプリ用に使っているのと同じJavaScriptエンジンだ。エンジン自体はすでにファームウェアに入っているので、あとは自分のスクリプトをデバイスにロードするための正式な手順がドキュメント化されるのを待つばかりのように見える。

HTTP API

BUSY BarはHTTPサーバーを動作させ、3つのトランスポートで同じAPIを提供しており、OpenAPI 3.1として文書化されている。

デバイスをUSBでコンピューターに接続すると仮想イーサネットインターフェースが立ち上がり、本体背面に印字された固定アドレス10.0.4.20でアクセスできる。http://10.0.4.20/がローカルのWebインターフェース、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経由のローカルWebインターフェースから有効にする必要がある。有効にした後は認証用のトークンを選べる。トークンを設定した場合は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で生成した、単一デバイスまたはアカウントにスコープされたベアラートークンを使う:

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

ライブラリ

FlipperはPython用のbusylibを提供しており、同期クライアントとasyncioクライアントの両方がある。メソッド名はAPIパスに直接マッピングされており、たとえば/api/display/drawdisplay_drawに、/api/storage/removestorage_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をオンにする必要があり、そうするとフォーカスセッションが、タイマー開始時に照明を暗くしたりドアをロックしたりといったオートメーションを駆動できる。

ペアリングは背面スクリーンまたはWebインターフェースに表示されるQRコードで行い、デバイスは複数のファブリックに同時にコミッショニングできる。

Home Assistantとの統合は、汎用のREST機能を使ってHTTP API経由で行われ、双方向に動作する。つまり、デバイスをオートメーションのトリガーとしても、家の中の他の何かの出力先としても使える。

アプリ

BUSY Barにはスマートフォン用のモバイルアプリが付属する。iOSアプリを試してみたが、まあ、可もなく不可もなくといったところだ。もともとスマホアプリをあまり使わない方だが、ここで少しだけ感想を述べておく。

アプリは基本的にバーの現在の状態をミラーし、簡易的な操作を提供する。タイマーを開始してアプリを(Flipperのクラウド経由で)セットアップしておくと、スマートフォンのロック画面にタイマーを表示する常駐通知がプッシュされる。タイマー実行中に他のアプリがフォーカスセッションを妨げないようにするおやすみモードを設定することも可能だ。

個人的にはこれらはギミックに思えるが、人によっては価値がある機能かもしれない。とはいえ、アプリの評価はあまり高くなく、数日間iOS版を試した限りでは特に問題はなかったものの、見た目や動作にはどこか安っぽさが残った。大手ハードウェアメーカーの“意識高い系おじさん”たちが、今の世代が求めているものだと勘違いして作ったようなアプリ、という印象だった。

留意点

気になる点がいくつかあるが、致命的な欠点というほどのものはない。

Wi-Fi認証は単一の共有された数字のキーで、APIスキーマでは^[0-9]{4,10}$に制約され、ローカルネットワーク上では暗号化されていないHTTPのプレーンヘッダーで送られる。最小の4桁ではキースペースは1万通りで、レート制限についての記述は見つからなかった。アクセスモードのenumにはkeyのほかにenabledという値もあり、これはLAN上でキーワードなしでAPIを開放できることを意味する。したがって、10桁のキーを使い、自分で制御できないネットワークにはデバイスを置かないのが賢明だろう。

次に、すべてが近日公開な点だ。ユーザーアプリのインストール、JS SDK、Windowsアプリ、拡充されたアプリライブラリはいずれも将来の約束である。Flipperチームが最終的に実現してくれることは疑っていないが、技術に詳しくないユーザーが、現時点ではほとんど何もできないデバイスを買ってしまったら非常にがっかりするだろうことは想像に難くない。特にWindowsマシンではそうだ。今届くデバイスは、フォーカスタイマーと時計、そしてステータスディスプレイでしかない。

最後に価格だ。ウェイティングリスト登録者向けに179米ドル、最初の3,000台は199米ドル、最終的な小売価格は249米ドルとされている。249ドルでは、特に現状のソフトウェアではかなり手を出しにくい。技術に明るいユーザーで、いじり倒したいというのであれば、そのペソを払う価値はあるかもしれないが、過去に示したように、すでに工作の沼にハマっているなら、同様のデバイスは自分でずっと安く作れる。

まとめ

Flipperは、自分が期待していた通りのデバイスを作ってきた。それは心からの褒め言葉のつもりだ。ハードウェアは、Flipperのハードウェアがいつもそうであるように、ステータスライトとしてはオーバーエンジニアリングで、本物のメカニカルスイッチ、本物のエンコーダー、交換可能な18650、公式の分解ガイド、そしてどこにも接着剤が使われていないという徹底ぶりだ。

それが値段に見合うかどうかは、何に使いたいかに完全にかかっている。同僚に「話しかけないで」と伝えるためのデバイスとしては、高すぎるし効果もない。話しかけてくる人は、やめてくれという看板では止まらないからだ。こう言い換えよう。BUSY Barの小売価格より約50ドル安い金額で、デスクにSmith and Wessonのモデルのいずれかを置けば、同僚を遠ざけるのにはおそらくもっと効果的だろう。

しかし、8GBのファイルシステム、WebSocket、そして複数のプログラムが互いに上書きすることなく1つの画面を共有できる精巧な優先度システムを備えた、小さく、頑丈で、完全にスクリプト可能なRGBマトリクスとしては、このクラスで最もオープンでおそらく最高のものだ。コミュニティが、Flipperがまだ思いついていないような使い方を見つけてくれることを期待している。

PS: BUSY Barの電源を切るのはVimを終了するようなもので、すぐには分からない。天面のスイッチには「OFF」ポジションがあるが、あれはディスプレイを消すだけで、本体は起動したまま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」を使用して翻訳されました。

コメント