Bambulab製3Dプリンターの集中管理システムBambuddy導入の記事はこちら。
神ツールですがBambulabのサードパーティツール締め出し施策の絡みで、これを使うには開発モードを有効にする必要があり、結果としてBambu純正のスマホアプリBambu Handyが使用できなくなります。多くの機能はBambuddyに直接スマホブラウザからアクセスすれば事足りるのですが、どうしても弱いのが通知系です。Bambuddyは代わりにDiscordなどの連携したチャットツールに進捗やエラー情報をポストする機能があるのですが、さすがにiOSのライブアクティビティ(ロック画面やDynamic Islandに進捗バーを表示するアレ)には対応できません。Home AssistantやBambuddyまでは進捗データが来ているので、そこから適当なREST APIに出力するパッチをClaudeさんに書いてもらって、なにか汎用のREST APIからLive Activityを作製するアプリを探すか、これもAIに作ってもらうか?と考えてチャットで相談してみたら、なんと既に同様のことができるソリューションがあるという返答が。
■notify-bambuddyとNotify!で実現
notify-bambuddyはsimplytoast1氏が公開しているオープンソースプロジェクトで、Bambuddy用のコンパニオンツールです。Bambuddyの稼働しているマシンに同一または独立のDockerコンテナとしてインストールすれば、Bambuddyからプリント状況を取得し、Notify!アプリ(後述)のサーバーに投げてくれるというもの。ほぼ1人で開発されており、あまり注目されていないプロジェクトのようですがClaudeさんが見つけ出してくれました。
Notify!は様々なサーバーから状況を取得してLive Activityを発行する汎用アプリで、Bambuプリンタ->Bambuddy->notify-bambuddy->Notify!サーバー->Notify!アプリ->ライブアクティビティというチェーンで実現します。
Notify!のサーバーを経由するのでnotify-bambuddyはポート開放する必要がないのもナイス。
またBamby Handyのライブアクティビティは一度アプリを開いて印刷中のデータを都度取得する必要がありました。ひとつの印刷に対してのみ有効なライブアクティビティが生成されるという感じ。それがNotify!を通じたシステムだと、一度アプリを起動してサーバーとPUSH通知のパスを通しておけば、それ以降に開始した印刷の進捗が自動的にライブアクティビティに追加されます。このサーバー基点で新規アクティビティを発行する機能(push-to-start)はiOS17.2から実装されたらしく、それまではiPhone内のアプリからしか開始できず、アプリを開かない限り更新されないという制約がありました。Bambu Handyはその時点の仕様を元に作られており、push-to-startに未対応、ということなのかと理解しました。もうこの時点でBambu Handyを超えました。
■notify-bambuddyのセットアップメモ
この記事を執筆した時点で、リリースされている0.5.0だとiOSの最新仕様に追いつけていないのか、一部問題が発生しました。Claudeさんに解析してもらいパッチを作製してIssueとして投げておいたので、そのうち反映されるかも知れませんが、一応やったことをメモしておきます。DockerでBambuddyと同一ホストに別コンテナとして作製する想定です。同一コンテナで作ると起動/終了は一本化できて楽ですが、BambuddyのAPIキーをdocker-config.ymlファイルに平文で書くことになりセキュリティ的に微妙だったり、Bambuddyの更新時に設定が上書きされるリスクがあるので、完全独立でコンテナを作製する方針としました。
BambuddyのAPIキーを作る
Bambuddyの「設定」->「APIキー」で読み取り以外の権限を抜いたAPIキーを1つ発行しておきます。
iPhoneにNotify!アプリをセットアップ
アプリをインストールして起動すると三択画面が出るので、一番下のNorification Onlyを選択。画面がわかったら「Settings」タブを開き、1台1台固有のDevice IDとTokenが表示されるのでメモしておきます。
notify-bambuddyのコンテナを作製
コンテナ用に適当なフォルダを作り、docker-config.ymlをリポジトリのREADMEからコピペします。
|
1 2 3 4 5 6 7 8 9 10 11 |
services: notify-bambuddy: image: ghcr.io/simplytoast1/notify-bambuddy:0.5.0 container_name: notify-bambuddy restart: on-failure:5 env_file: [.env] volumes: - notify-bambuddy-state:/data volumes: notify-bambuddy-state: |
同じフォルダに.envファイルを作り、以下の内容を記述します。
|
1 2 3 4 5 |
BAMBUDDY_URL=http://192.168.x.x:8000 BAMBUDDY_API_KEY=bb_xxxxxxxx NOTIFY_DEVICE_ID=ABC12345 NOTIFY_DEVICE_TOKEN=xxxxxxxx DRY_RUN=1 |
BAMBUDDY_URL: Bambuddy本体にアクセスできるURL(LANアドレスでOK)
BAMBUDDY_API_KEY: 上で発行したAPIキー
NOTIFY_DEVICE_ID=Notify!アプリで確認したDevice ID
NOTIFY_DEVICE_TOKEN=Notify!アプリで確認したToken
DRY_RUN=(テスト実行なら1、本番なら0)
という感じ。追加で、以下の項目も書けるようです。
|
1 2 3 |
ALERTS=off # すでにBBのwebhookでNotify!に通知している場合 PRIVACY_MODE=true # ロック画面にファイル名を出したくない場合 BAMBUDDY_PRINTER_IDS=1 # 特定のプリンターだけ表示したい場合 |
.envを保存したら
|
1 |
chmod 600 .env |
を実行して所有者以外は読み取れないようにしておきます。
DRY_RUN=1の状態で、テスト起動します。
|
1 |
docker compose up -d && docker compose logs -f |
ここからが問題です。コンソールに
|
1 |
notify-bambuddy | notify-bambuddy: NOTIFY_DEVICE_ID 'IOYxxxxxxxxxxxxx' is not a Notify device id. Expected either 8 characters (an iOS device, from Settings -> Device in the app) or 'WB' followed by 14 more (a browser registered through the Notify web app). |
というエラーが出ました。.envに記入したDevice IDの形式が「8文字のはずなのに多すぎる、これは正しいDevice IDじゃない。」と言っているわけです。しかしNotify!アプリの設定画面には確かに16文字表示されているんだからしょうがない。notify-bambuddyの最新0.5.0は2026年9月1日更新のようなので、もしかするとその後で正式版がリリースされたiOS27でDevice IDのフォーマットが変わった可能性があります。実際、curlでNorifyサーバーにDevice IDとTokenの組み合わせを送ると正常と判定されます。Notify!アプリが発行し、Notifyサーバーは有効だといっているものを、notify-bambuddyが勝手に不正な形式だと怒っているだけです。
そこでさらにClaudeさんにGithubリポジトリを読んでもらって判定箇所を特定、パッチを作製してもらいました。そのdiffがこちら。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-_IOS_DEVICE_ID_RE = re.compile(r"^[A-Z0-9]{8}$") +_IOS_DEVICE_ID_RE = re.compile(r"^(?:[A-Z0-9]{8}|[A-Z0-9]{16})$") _WEB_DEVICE_ID_RE = re.compile(r"^WB[A-Za-z0-9]{14}$") @@ - if _IOS_DEVICE_ID_RE.match(device_id): - tiles_enabled = True - elif _WEB_DEVICE_ID_RE.match(device_id): + if _WEB_DEVICE_ID_RE.match(device_id): # A browser. Everything except the tile still works. + # Checked FIRST: a 16-character browser id can also fit the iOS shape. tiles_enabled = False + elif _IOS_DEVICE_ID_RE.match(device_id): + tiles_enabled = True |
いや、Claude優秀だな!
Docker内のソースを一時的に書き換えて実行する手順な以下の通り。
- コンテナディレクトリ(docker-compose.ymlがあるフォルダ)で、「git clone https://github.com/simplytoast1/notify-bambuddy.git」して、最新の0.5.0をローカルに展開。
- cd notify-bumbuddy/src/notify-bambuddy/するとconfig.pyファイルがあるので上記パッチを適用。
- コンテナディレクトリに戻って「docker build -t notify-bambuddy:local .」でビルド
- docker-cimpose.ymlのimage行を「image: notify-bambuddy:local」に書き換え。
これでDockerが取得したままの0.5.0のかわりに、ローカルでアップデートしたビルドを実行してくれます。もし後日公式でアップデートされたら、image行を最初の通りに戻します(その際は0.5.0ではなくなっているでしょう。latestでもいいはず)。
■動作の様子
こんな感じでロック画面に進捗バーが復活しました。これでBambu Handyへの未練がなくなります。

エラーで止まっている時はこんな感じ。

■追加設定
・通知領域タップ時の遷移先
ライブアクティビティの制限として、通知をタップした場合、そのアクティビティを作製したアプリ、つまりNotify!アプリが開いてしまいます。できればBambuddyの画面にとばしたい。それには、.envに以下を書けば、通知ボックス上にリンクが出現するようです。
|
1 2 3 |
TILE_BUTTON_URL=https://(BambuddyのURL)/ TILE_BUTTON_TITLE=Bambuddy TILE_BUTTON_OPEN=true |
ただし、BambuddyのURLはグローバルアドレスでないと自宅外からは参照できません。またあくまで通知ボックスの中にリンクが出るだけで、通知ボックス全体のタップ遷移先はあくまでNotify!アプリになってしまうようです。設置してみたものの、まだ結果が見られてないので、反映されたらまたスクショ貼ります。
だだあくまでURLをブラウザで開くのみなので、PWAとして動かすことはできなそう。
・複数デバイスへの通知
iPhoneの他にiPadでも同じライブアクティビティを表示したいですが、.envに記入するDevice IDとTokenはアプリをインストールした端末毎に固有です。Notify!アプリにGroup IDという機能があって同じ通知を別端末で受けることも可能なようですが、ライブアクティビティでも反映されるかは不明。
Claudeはnotify-bambuddyコンテナを複数立てる(正確には1つのコンテナに複数のインスタンスを動かす)方法を提案してきました。どちらを使えば実現できるのか今後検証予定です。

