本文へスキップ
Paulo Rivera
すべてのプロジェクト

OmaElk:Omarchyプラグイン

安価なELK-BLEDOB / ELK-BLE対応Bluetooth LEDライトを操作するOmarchyプラグイン

  • Python
  • スター 0
  • omarchy
  • plugin
  • python
  • qml
  • bluetooth
  • linux
  • open-source
omaelk_logo

🌱 きっかけ

数か月前、上司が社内のチャンネルで、DHH氏が作ったネットで話題の新しいOSOmarchyについて触れました。まあ、それが悪い考えでした。私は数年間Ubuntuを使っていましたが、この新しいOSがいかにかっこよく、カスタマイズ性が高いかを読んで、まずは別のHDDで試してみることにしました。ところが結局、PC全体をリセットしてしまいました。それ以来すっかりハマっていて、すべてが思い通りに動くところが大好きです。「We can fix everything(何でも直せる)」という考え方にも賛成です。便利なエージェンティックOSという側面についても、いつか考えを共有したいと思っています。

さて、数か月前に、使い心地を試そうと安価なBluetooth LEDライトを購入しました。ところが、このライトは専用のAndroid・iOSアプリからしか操作できません。私はずっと、そのエコシステムの外で使いたいと思っていました。そこでClaudeと一緒にバイブコーディングを始め、どこまで行けるか試してみました。その結果が、ライトを自由に操作できる本格的なOmarchyプラグインです。

✨ できること

  • 🔆 バーウィジェット: Omarchyテーマの色を反映するピクセルアートの電球。ポップアップから色、エフェクト、明るさ、速度を操作できます
  • 🎵 音楽連動モード: 色相がスペクトラムに追従(低音は赤、高音は紫)し、明るさは音量に追従します
  • 🎨 22種類の内蔵エフェクトに加え、カラーダイアログと画面上のスポイトも搭載
  • 🔄 テーマ同期: ライトをOmarchyテーマのアクセントカラーに、手動またはテーマ変更のたびに自動で合わせます
  • ⌨️ スクリプト用の omaelk CLI と、Omarchyランチャー用のメニュー生成機能

🧠 仕組み

さて、これは私の専門分野ではありませんが、Claudeの力も借りてまとめた仕組みの概要をご紹介します!

Bluetoothのスキャンと接続には数秒かかり、さらに接続済みのコントローラーは広告(アドバタイズ)を止めてしまいます。そのため、コマンドごとに接続する方式では、素早い操作が固まったり取りこぼされたりしました。そこで、小さなバックグラウンドデーモンが唯一のBluetooth接続を保持し、各コマンドはそのソケットへの1行の書き込みにしました。

omaelk CLI / バーウィジェット / メニュー ──► Unixソケット ──► デーモン ══ BLE ══► コントローラー
  • ⚡ 接続後は、コマンドが約50ミリ秒で実行されます
  • 🔒 ロックにより、複数のクライアントが同時に複数のデーモンを起動して接続を奪い合うことはありません
  • 🩹 デーモンはBlueZの接続が詰まっても自動で復旧します
  • 🔬 コントローラーのプロトコル(GATT特性上の9バイトのフレーム)を直接実装しました

🔐 プライバシーを考慮した設計

音楽モードが聴き取るのはマイクではなく、デフォルト出力のモニターです。約43ミリ秒ごとのフレームをFFTで解析した後は破棄するため、録音・保存・送信は一切行いません。ライトに届くのは3バイトの色データだけです。

📈 軽量

音楽モード中でCPU 1コアの約1.4%、メモリ37MB。アイドル時は0%です。

かっこいいと思いませんか?リソースをほとんど消費しないんです。私は細部へのこだわりを大切にしていて、OmaElkを開発する際にこの点は間違いなく意識していました。

🙏 先人たちの成果の上に

プロトコルの実装は、他の方々によるオープンソースのリバースエンジニアリングの成果を土台にしています(リポジトリにクレジットを記載)。

🧰 使用技術

Claude · Python · bleak · NumPy · QML / Quickshell · BlueZ · PipeWire

🔗 GitHubで見る