Flipper BUSY Bar
원문은 Marius님이 에 게재했습니다. 이 블로그 구독하기
한때 Lemon을 만들었던 사람이 써 본, GPL 펌웨어와 HTTP API, Matter 호환을 지원하는 72x16 RGB LED 매트릭스 책상용 디바이스 Flipper BUSY Bar 리뷰.

네, 실존합니다. 지금 제 손에 들고 있습니다. Flipper가 온라인 곳곳에서 이 불길한 기기를 두고 몇 년은 족히 사람들을 애태운 끝에, 마침내 실제로 존재한다는 걸 확인할 수 있게 됐습니다.
BUSY Bar는 Flipper Zero와 아직 개발 중인 Flipper One을 만든 회사 Flipper Devices의 250g짜리 탁상용 디바이스다. 기본적으로 72x16 RGB LED 매트릭스에 여러 가지를 보여주는 작은 디스플레이이며, 이 글을 쓰는 시점 기준으로 가장 내세우는 기능은 뽀모도로 방식의 집중 타이머를 실행할 수 있다는 점, 그리고 USB와 로컬 네트워크, 인터넷을 통해 접근 가능한 완전한 HTTP API로 기기를 제어할 수 있다는 점이다.
BUSY Bar 상단에는 5단 셀렉터가 있다. 두 가지 집중 모드(BUSY와 CUSTOM, 기능적으로는 동일하고 기본값만 다르다)와, 실제로는 두 화면을 끄는 절전 모드에 가까운 OFF 위치, 현재는 시계 하나만 들어 있는 앱스(apps) 위치, 그리고 말 그대로 설정용인 세팅스(settings) 위치 사이를 전환한다. 가운데의 큰 메커니컬 버튼은 세션을 시작·일시정지하고, 스크롤 휠은 타이머를 조절하며 OK 버튼을 겸한다. 마지막으로 뒤로 가야 할 때 쓰는 백 버튼이 있다.
뒤 얘기가 나온 김에, 기기 뒷면에는 1.54인치 모노크롬 OLED가 있어 타이머와 배터리 잔량, Wi-Fi·Bluetooth·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 컨트롤러 |
| 메인 MCU | STM32U595RI, Arm Cortex-M33 @ 160 MHz with MPU, FPU and DSP; 2 MB 플래시, 2.5 MB SRAM |
| 무선 MCU | Silicon 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를 통한 NS4168 DAC(44.1 kHz), 내장 클래스 D 앰프; 6옴, 0.8 W |
| 배터리 | 1셀 18650, 3250 mAh, A2007-H04 4핀 커넥터; 과충전, 과방전, 고온·저온 보호 기능 |
| 충전 | 18W 이상 PD 충전기로 2.5시간, 그 외에는 7~8시간 |
| USB-C | USB 2.0 Full Speed 디바이스, 12 Mbit/s; PD 3.0, 5V⎓3A 및 9V⎓1.5A |
| 컨트롤 | 메커니컬 스위치, 스크롤 휠 엔코더, 5단 모드 셀렉터, 백 버튼 |
72x16 매트릭스는 ICND2153 — 16비트 그레이스케일 시프트 레지스터와 LED 오픈 감지, 고스팅 감소용 프리차지 회로를 갖춘 16채널 정전류 PWM 싱크 드라이버 — 와 8채널 파워 스위치인 ICN2012로 구동된다.
2026년 시점에서 살짝 아쉬운 점은 Wi-Fi가 2.4GHz만 지원한다는 것이다. 기기와 전자레인지로 가득한 사무실 환경에서 이 대역은 가장 혼잡한 스펙트럼이다. USB 쪽도 최대 12Mbit/s로, 말하자면 상당히 경량으로 유지됐지만 웹 UI와 HTTP API를 제공하는 가상 이더넷 인터페이스 용도로는 충분히 빠르다.
충전 쪽을 보면 문서에서는 2.5시간 충전을 위해 18W 이상 PD 충전기를 요구하지만, 기기 자체는 PD 모드로 5V⎓3A(15W)와 9V⎓1.5A(13.5W)만 사용하는 것으로 보인다.
디스플레이 밝기와 관련해 한 가지 불일치가 있다. 기술 제원 페이지에는 밝기 수치가 전혀 없고, 제품 페이지는 현재 400니트라고 하며, CNX Software와 XDA의 출시 기사는 둘 다 800니트라고 적고 있다. 측정 장비가 없어 어느 것이 맞는지 판단할 순 없지만, 밝게 조명이 켜진 공간에서도 충분히 밝다고 장담할 수 있다.
내부 구조

Flipper는 iFixit에 공식 분해 가이드를 공개했는데, 정말 멋진 일이다. 21단계로 구성된 가이드는 수리 용이성을 염두에 두고 설계된 기기를 보여준다. 후면 커버는 8개의 클립으로 고정되어 플라스틱 카드로 분리할 수 있다. 그 아래에는 PH1 십자 나사 5개가 있고, 바닥에 하나, 후면에 네 개다. 배터리는 프레스-래치 커넥터로 연결되어 있어 다른 무엇보다 먼저 분리해야 한다. 디스플레이 플렉스 케이블은 스퍼저로 여는 래치를 쓰고, 메인 PCB는 나사 3개, 컨트롤 PCB는 래치 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 매니페스트에 명시되어 있다.
빌드 시스템은 Flipper Zero에 쓰이는 것과 동일한 SCons 기반 Flipper Build Tool인 FBT이며, 의존성은 임베디드에서 흔히 보는 스택으로, Flipper 자체의 furi 추상화 아래에 FreeRTOS, TCP/IP용 lwIP, USB 디바이스용 TinyUSB, 임베디드 HTTP 및 WebSocket 서버용 Mongoose, TLS용 mbedTLS, UI용 LVGL로 구성된다.
바에는 lib/jerryscript의 JerryScript도 포함되어 있으며, lib/js_app과 js_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로 연결한 로컬 웹 인터페이스에서 켜야 한다. 활성화한 뒤에는 인증용 토큰을 지정할 수 있으며, 설정할 경우
X-API-Token헤더에 넣게 된다:curl -s http://192.168.1.42/api/status \ -H 'Accept: application/json' \ -H 'X-API-Token: 12345678'인터넷을 통한 접근은
cloud.busy.app에서 생성한 bearer 토큰으로 Flipper 클라우드를 거쳐 이루어지며, 단일 기기 또는 계정 범위로 설정할 수 있다: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 Bar는 Matter에 단일 on/off 엔드포인트, 즉 시작 상태를 off, on, toggle, last 중 하나로 설정할 수 있는 에뮬레이트된 스위치로 자신을 노출한다. 켜면 BUSY 타이머가 시작되고 끄면 종료되므로, 이 연동은 트리거 역할을 한다. 상태를 Matter에 다시 보고하려면 Settings ➔ Smart home을 켜야 하며, 그러면 타이머가 켜질 때 조명을 어둡게 하거나 문을 잠그는 등의 자동화를 집중 세션으로 구동할 수 있다.
페어링은 후면 화면이나 웹 인터페이스에 표시되는 QR 코드로 진행하며, 기기를 여러 패브릭에 동시에 커미셔닝할 수 있다.
Home Assistant 연동은 범용 REST 기능을 이용해 HTTP API를 통해 이루어지며, 양방향으로 동작한다. 즉, 기기를 자동화 트리거로 쓸 수도 있고, 집안의 다른 무언가에 대한 출력 장치로 쓸 수도 있다.
앱
BUSY Bar에는 스마트폰용 모바일 앱이 함께 제공된다. iOS 앱을 테스트해 봤는데, 뭐, 그럭저럭 괜찮았다고 해야 할까. 원래 스마트폰 앱을 많이 쓰는 편은 아니지만, 여기서 내 의견을 좀 덧붙여 보겠다.
앱은 기본적으로 바의 현재 상태를 그대로 보여주고 기초적인 제어를 제공한다. 타이머를 시작하고 앱을 설정해 두면(Flipper 클라우드를 통해) 스마트폰이 잠금 화면에 타이머를 표시하는 영구 알림을 띄우는 것을 볼 수 있다. 타이머가 실행 중일 때 다른 앱이 집중 세션을 방해하지 못하도록 방해금지 모드를 설정하는 것도 가능하다.
내게는 이런 기능들이 그저 요란한 장식에 불과하지만, 다른 사람들에게는 가치가 있을 수도 있다. 다만 앱 평점이 특별히 높지 않고, iOS 버전을 며칠 테스트하는 동안 별다른 문제를 겪지는 않았지만 외관이나 동작 방식에서 다소 저렴한 인상을 받았다. 대형 하드웨어 제조사의 고위 임원들이 요즘 세대가 원하는 것과 부합한다고 착각하며 만들어 냈을 법한 그런 앱처럼 느껴졌다.
아쉬운 점
거슬리는 점이 몇 가지 있긴 하지만, 어느 것도 치명적인 단점은 아니다.
Wi-Fi 인증은 API 스키마상 ^[0-9]{4,10}$로 제한된 단일 공유 숫자 키이며, 로컬 네트워크에서 암호화되지 않은 HTTP의 일반 헤더로 전송된다. 최소 4자리라면 경우의 수는 10,000가지에 불과하고, 속도 제한에 대한 문서는 찾지 못했다. 접근 모드 enum에는 key 외에 enabled 값도 있어, LAN에서 키 없이도 API를 열어둘 수 있다는 뜻이다. 따라서 10자리 키를 쓰고 제어할 수 없는 네트워크에는 기기를 연결하지 않는 것이 좋아 보인다.
그리고 온통 coming soon 투성이다. 사용자 앱 설치, JS SDK, Windows 애플리케이션, 확장된 앱 라이브러리 등은 모두 미래의 약속이다. Flipper 팀이 결국에는 내놓으리라 의심하지는 않지만, 기술에 익숙하지 않은 사용자가 지금 당장 거의 아무것도 할 수 없는 기기를 샀다고 생각하면, 특히 Windows 환경에서는 꽤 답답할 것 같다. 오늘날 배송되는 기기는 집중 타이머이자 시계, 그리고 상태 디스플레이다.
마지막으로 가격. 웨이팅 리스트 멤버에게는 179달러, 첫 3,000대에게는 199달러로 출시됐고 최종 정가는 249달러로 책정됐다. 249달러라면, 특히 지금 소프트웨어 상태를 고려하면 선뜻 권하기 어렵다. 만지작거리는 걸 좋아하는 기술 사용자라서 이걸 사려는 거라면 그만한 가치가 있을지도 모르지만, 과거에 보여줬듯 비슷한 기기를 직접 훨씬 저렴하게 만들 수도 있다. 특히 이미 메이커의 늪에 깊이 빠져 있다면 더욱 그렇다.
총평

Flipper는 내가 Flipper라면 만들었을 법한 기기를 만들었다. 이는 진심 어린 칭찬이다. 하드웨어는 Flipper 하드웨어가 늘 그렇듯 상태 표시등 주제에 과하다 싶을 정도로 정교하게 만들어졌으며, 진짜 메커니컬 스위치와 진짜 엔코더, 교체 가능한 18650, 공식 분해 가이드가 있고 접착제는 어디에도 쓰이지 않았다.
돈값을 하는지는 전적으로 무엇을 하려고 사느냐에 달려 있다. 동료들에게 ‘비켜 달라’고 알리는 장치로서는 너무 비쌀 뿐 아니라 전혀 효과적이지도 않다. 당신을 방해하는 사람들은 ‘방해하지 마시오’라는 표시 때문에 물러나지 않기 때문이다. 이렇게 말해두자. BUSY Bar 정가보다 약 50달러 저렴한 가격으로도 책상 위에 여러 Smith and Wesson 모델 중 하나를 올려둘 수 있는데, 동료들의 말을 막는 데는 그게 훨씬 효과적일 것이다.
하지만 8GB 파일시스템과 WebSocket, 여러 프로그램이 서로 덮어쓰지 않고 하나의 화면을 공유할 수 있도록 하는 정교한 우선순위 시스템을 갖춘, 작고 잘 만들어진 완전 스크립팅 가능한 RGB 매트릭스로 본다면, 이 분야에서 가장 개방적이고 아마도 가장 뛰어난 제품이며, 커뮤니티가 Flipper가 미처 생각지 못한 활용법을 찾아낼 것이라 기대한다.
PS: BUSY Bar를 끄는 것은 Vim을 종료하는 것과 비슷하다. 눈에 띄는 방법이 없다는 점에서 그렇다. 네, 상단 스위치에 “OFF” 위치가 있긴 하다. 하지만 그건 단순히 디스플레이만 끄고 BUSY Bar 자체는 계속 실행되며 Wi-Fi에도 연결된 채로 유지된다. 배터리를 전혀 소모하지 않도록 기기를 완전히 종료하려면 스위치를 “Settings” 위치에 두고 System, Power, Shutdown으로 이동한 뒤 Yes로 종료를 확인해야 한다. 그제야 기기가 실제로 꺼진다.
보너스: busybar.zig
앞서 언급했듯, 이번 리뷰와 함께 공유하고 싶은 작은 보너스가 있다. BUSY Bar의 현재 OpenAPI 명세를 최대한 충실히 구현하고, HTTP API로 기기를 제어할 수 있는 busybar 커맨드라인 도구를 제공하는 Zig 라이브러리다.
이 라이브러리는 Zig의 std 라이브러리만을 사용하므로 Zig가 지원하는 모든 플랫폼 타깃을 지원하며, 상당히 가볍고 사용하기 쉽다. 내 BUSY Bar와 함께 사용하고 있는데 아주 잘 동작하고 있다. 커맨드라인 도구에는 바쁜 모드(busy mode)를 시작·종료하는 간단한 명령어 등, 그렇지 않으면 JSON 페이로드를 직접 작성해야 했을 몇 가지 편의 기능이 들어 있다.
간단히 말해, BUSY Bar를 주문한 사람 중 Zig 도구나 직접 만든 스크립트로 데스크톱 환경에 통합하고 싶은 분이 있다면 busybar.zig 저장소를 한번 확인해 보시길 바란다. BUSY Bar를 가지고 놀기 위한 CLI 도구만 필요하다면 GitHub 릴리스 페이지에서 지원되는 모든 플랫폼용 빌드를 찾을 수 있다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기