HeartRate Broadcasterアプリのアイコン

あなたの心拍数、
あらゆるバイクコンピュータに。

HeartRate Broadcaster (HRB) は、Apple Watch と AirPods Pro からリアルタイムの心拍数を読み取り、それらを1つの測定値に融合します。その後、標準的な心拍数モニターとして Bluetooth LE 経由でブロードキャストするため、トレーニングアプリからは胸 strap として認識されます。

心臓は一つ、ストリームも一つ

あなたの時計が測定し、AirPods が測定します。同時に2つのセンサーが異なる値を示すのは、1つのセンサーがわずかに誤っているよりも悪いため、HRB はそれらの間で調整を行い、正確に1つの数値を電波に乗せます。

Apple Watchから97 BPMの心拍数を表示するHeartRate Broadcaster、センサーの合意行に「Watchのみ」と表示され、ヘッドユニットが接続されている状態。

オープンな環境でのセンサー合意

現在受信できるセンサーの名前を列挙し、それらが BPM でどのくらい離れているかを表示し、最終的にどの1つの測定値を採用して送信したかを示します。

Apple Watch
主要なセンサーです。実際のワークアウトセッションを実行します。これは、有用なレートで心拍数をサンプリングし、画面をオフにしたままサンプリングを継続するための唯一の方法です。
AirPods Pro 3
2つ目の、完全にオプションのセンサーです。時計単体でも完全な情報源となりますし、AirPods単体でも同様です。
iPhone
一致する値の平均を計算し、一致しない場合は外れ値を除外し、その結果を標準的なBluetooth LE心拍数サービス(0x180D)として広告します。センサーが応答を停止すると、古い値との比較を静かに行うのではなく、そのことを明示します。
ヘッドユニット
MyWhoosh、Zwift、TrainerRoad、Wahoo、そしてBluetooth対応のGarmin Edgeデバイスすべてが、1つの一般的なチェストストラップとして認識します。

ワット数を入力し、カロリーを出力

パワーメーターが仕事量を測定します。その仕事量をカロリーに変換するには、以下の2つの定数が必要です。

セッションのサマリー:アクティブカロリー37、安静時分も含めた総カロリー40、仕事量40 kJ、平均出力217 W、そしてPowerTap P1ペアがカウントされた4つのセンサー。
以下の算術処理で得られたすべての数値を、1枚のカードに表示します。効率0.24で仕事量40 kJ は 40 kcal となり、これが総量です。安静時の割合を差し引くと、Health に伝えられる値は37となります。

ペダルから数値へ

ワットはジュール毎秒です。HRBは、メーターが実際に報告していた時間に対して報告された出力を積分し、機械的な作業量を体がそれを生成するために消費したエネルギーに変換します。

作業
すべてのパワーサンプルは、そのサンプルがカバーする時間間隔を掛けて合計されます。データ欠落分は補間されず除外され、サマリーには欠落した秒数が記載されます。
効率
消費カロリーの約24%がペダルでの仕事に変換され、残りは熱として放出されます。この数値0.24は、トレーニング済みのサイクリングで測定される0.20〜0.25の範囲内にあり、これが1キロジュールの仕事が約1キロカロリーの費用がかかる理由です。
安静時
健康とは、活動エネルギーで「安静時より上」を意味するため、セッションの基礎代謝分 — Mifflin–St Jeor式、身長、体重、年齢、性別に基づく — が記録される前に差し引かれます。サマリーには両方の数値が表示されます。
メーターなし
電力がない場合、推定は公開された心拍数回帰(Keytelら、2005年)にフォールバックし、画面にその旨を表示します。推定値としてラベル付けされたものは、測定されたかのように振る舞う数値よりも価値があります。

バイク上のすべてのメーター

サイクリングパワー(0x1818)、サイクリング速度とケイデンス(0x1816)、FTMS屋内バイクデータ(0x1826)。ペダル、クランク、スマートトレーナーはすべて報告します。ペダルベースのメーターは、利用可能な場合は左右バランスも報告します。

Wahoo Kickr Core 2とPowerTap P1ペダルで走行・テストを実施。両方を同時に使用。

1つのメーターがカウントされ、他はログに記録される

ペダル、クランク、トレーナーは、駆動系の異なる地点で測定するため、異なる値を示します。カロリー値の基準となるメーターをあなたが選択します。他のメーターは、それ自体の平均値とともに併記され、ばらつきを確認できます。

ライド、ラン、スイム

セッションは開始前にラベル付けされ、パワーメーターが検出されるとデフォルトでライドになります。このラベルがHealthKitのアクティビティタイプを設定し、Apple Watchもそれに合わせてセッションをラベル付けします。

あなたの身体の詳細はここにあります

身長、体重、生年月日、性別は一度入力すると、スマートフォンにのみ保存されます。これらは上記の2つの計算式にのみ使用され、他の目的では使用されません。身長はフィートとインチ、またはセンチメートルで入力します。

ヘルスケアに書き込む

各セッションは、アクティブエネルギーを含むワークアウトとして保存されるため、リングやヘルスケアを読み取る他のアプリに反映されます。アプリ内の履歴には、ヘルスケアにフィールドがない詳細、つまりどのパワーメーターが検知され、どこにギャップがあったかが記録されます。

推測しているときに表示されます

身体プロファイルの不備、センサーの接続切れ、または心拍数のみの推定は、数値下のメモセクションに表示されます。数値が実際よりも良く見えるように、静かに丸められることはありません。

入手方法3つ

アプリは1つだけで、ビルドも1つです。異なるのは入手方法で、このうち2つのルートは無料で、その代わりに努力や忍耐を求められ、3つ目が App Store です。

TestFlight — 無料、90日間

誰でも利用可能で招待は不要です。AppleのTestFlightアプリを開き、公開リンクを開くと、ベータ版が他のアプリと同時にインストールされます。各ビルドは公開日から90日間使用可能で、新しいビルドが公開されるとカウントがリセットされ、更新され続ける限りベータ版は稼働し続けます。

公開ベータに参加

サイドロード — 無料、開発者アカウントが必要

GitHubの各リリースには、Release構成の.ipaファイルが含まれています。これは配布用に署名されているため、インストールするには独自のIDで再署名する必要があります — Xcode、AltStore、Sideloadlyのいずれでも可能です。HealthKitとバックグラウンドBluetoothは、無料のプロビジョニングプロファイルでは利用できないため、この方法には有料のApple Developerアカウントが必要です。完全なソースコードも公開されています。

GitHubのリリース

App Store — USD 4.99

1回の購入で、サブスクリプション、アプリ内購入、広告、アカウントは不要で、他のアプリと同様に自動的に更新されます。あなたは上記の2つのルートを回避するための対価と、その背後にある作業に対して支払っています。

App Storeで表示

TestFlightで試す

ベータ版は公開されており、招待リストや承認手順はありません。有料版と同じアプリで、ストアではなくAppleのベータチャネルを通じてインストールされます。

1 — TestFlightをインストール
Apple公式のベータ版アプリで、App Storeで無料です。iPhoneにインストールしないとリンクが機能しません。
2 — 公開リンクを開く
同じiPhoneでtestflight.apple.com/join/VUJCa5Gwを開き、「承諾」および「インストール」をタップします。招待やコードは不要です。
3 — ウォッチアプリを追加
iPhoneのWatchアプリからインストールします。他のウォッチアプリと同じ方法です。ウォッチがセンサーなので、この手順は必須です。

TestFlightのビルドは公開日から90日間有効です。新しいビルドごとにこの期間がリセットされるため、更新され続ける限りベータ版は稼働し続けます。App Store版には有効期限はありません。

すべての画面

iPhone 17 Pro MaxとApple Watchのリリースビルドからキャプチャ。一部のスクリーンショットは走行中のスマートフォンで撮影、他はBluetooth無線を搭載しないシミュレーターで撮影(センサーは実際の値をアプリに供給する代替セット)。画面の数値はすべてアプリ独自の計算によるもの。イラストは一切使用していません。

機能

ここにある機能はすべて、現在アプリで利用可能です。このページに記載されている内容は、ロードマップではありません。

本格的な心拍センサー

標準の心拍サービス(0x180D)をアドバタイズし、心拍測定と身体センサーの位置情報を送信します。Bluetooth対応のセンサーであれば、専用アプリやプラグインなしでペアリング可能です。

2つのセンサー、1つの数値

時計と AirPods の両方がデータを報告する場合、HRB は一致する測定値の平均をとり、一致しない場合は外れ値を拒否します。これは、すでに把握している傾向により近い方を選択するものです。

バーチャルシフター

同じスマートフォンは、オープンなBike Controlプロトコルを通じてシフターとしても機能します。これにより、心拍センサーのボタンでMyWhooshやZwift上のトレーナーを操作できます。クリック音やPlayコントローラー、別のデバイスも不要です。

Dynamic Island

ロック画面およびDynamic IslandでのLive Activity:現在のBPM、データソース、およびヘッドユニットの購読状況を表示。アンロックせずに一瞥するだけで確認できます。

フローティングウィンドウ

ピクチャインピクチャ機能により、他のアプリを使用している間も画面上に数値を表示し続けます。HRBでワークアウトを開始し、トレーニングアプリに切り替えると、BPMは浮遊ウィンドウとして追従します。ホーム画面へのスワイプ後も動作し続け、関連のないアプリの上にも浮遊表示されます。また、サイレントモードで動作し、ウィンドウは音を鳴らさず、一時停止、音量低下、または既存の再生コンテンツの占有を行いません。

Apple Watchのロック画面

スリーブのファスナー、ジャージのジッパー、またはバーテープへの接触などが原因で、走行中にブロードキャストが中断されることがあります。ロックを有効にすると、Apple Watchアプリは誤タップをブロックします。解除するには意図的に1秒間長押しする必要があり、その間もBPMは読み取り可能です。

完全な診断情報

「設定」では、識別子ごとの接続済みセントラル、サブスクライバーごとの送信フレーム数、ライブフレームレート、最後のフレームの正確なバイト数、および最終送信からの経過時間を表示します。何かが正常に動作していない場合、リンクのどちら側に問題があるかを確認できます。

心拍同期アニメーション

スマートフォンとApple Watchのハートアイコンは、測定された心拍数に合わせて鼓動を打ち、サンプルの受信が停止すると停止します。妥当な数値の上に静止したハートが表示される場合は、センサーの接続が切れていることを意味します。

バックグラウンドで送信を継続

ヘッドユニットが接続されると、リンクはスマートフォンのロック状態に関係なく維持されます。HRBは値が変更されたかどうかに関係なく1秒ごとに通知を行います。これは実際のストラップが行い、ヘッドユニットが期待する動作です。

テスト信号

装着せずにペアリングとデバッグを行うための合成心拍数ソースです。センサーの問題を心配する前に、ヘッドユニットがブロードキャストを受信していることを確認してください。

25言語対応

スマートフォンとApple Watchのすべての画面が25言語に翻訳されています。アラビア語は英語の鏡像ではなく、右から左へのレイアウトで対応しています。設定で1つ選択すると、スマートフォンの設定に関係なく、その選択が保持されます。このサイトも同じ25言語に対応しています。

互換性

Bluetooth LE Heart Rate Serviceセンサーとペアリングするあらゆるアプリやヘッドユニットは、HRBと同じ方法でペアリングします。

MyWhoosh Zwift TrainerRoad Wahoo Garmin Edge (Bluetooth) nRF Connect

これがHRBが読み取るデータです。名前が記載されているものは、アプリの開発およびテストで使用された機器です。リストにないメーターやトレーナーでも動作します。アプリが特定のモデルではなく、標準的なCycling PowerおよびFTMSプロファイルを読み取るためです。

Wahoo KICKR CORE 2 PowerTap P1 SRAM Red crank Any Bluetooth power meter Apple Watch AirPods Pro 3 OpenBikeControl shifting

ANT+非対応 — アプリでも追加不可

HRBはBluetooth LEのみでブロードキャストします。ANT+は別の無線プロトコルであり、iPhoneにはANT+ハードウェアが存在しないため、どのソフトウェアもANT+を送信できません。これはアプリの制限ではなく、デバイスの制限です。

ANT+のみで心拍数をペアリングするデバイス — Garmin Forerunner 935を含む — は、設定方法にかかわらず、このブロードキャストを一切受信できません。

MyWhooshの設定

2つの構成が動作します。どちらを選ぶかは、iPhoneを持ち歩くかどうかにかかっています。なぜなら、Apple Watchだけでは何も接続できないからです。

Apple Watch + iPhone + AirPods Pro 3

高精度な構成。両方のセンサーからデータが送信され、HRBがそれらを1つの数値に統合します。MyWhooshからは1つのチェストストラップとして認識されます。Watchアプリを起動し、iPhone上でソースとしてBothを選択してから、MyWhooshのセンサー画面でHRBをペアリングします。iPhoneは部屋の中に置いたままにしてください。Apple Watchはヘッドユニットの近くである必要はなく、iPhoneの近くであれば大丈夫です。

iPad + AirPods Pro 3

1台構成。AirPods Pro 3はiPadに直接ペアリングされるため、HRB、MyWhoosh、Bike Controlのすべてが同じ画面で動作します。iPhoneもApple Watchも不要です。ソースをAirPodsに設定してください。ここではWatchのオプションは非表示になります。接続先がないためです。

Apple Watchは常にiPhoneを経由する

Apple WatchはiPhoneとしかペアリングできず、Bluetooth経由で心拍データを直接広告送信することはありません。ウォッチアプリが測定したデータをiPhoneに渡し、ヘッドユニットが実際に接続するのはiPhoneです。

つまり、Apple WatchはiPhone構成では2つ目のセンサーを追加するだけで、iPad構成では何も追加されません。デスクに1台だけ置きたい場合は、iPadでAirPodsを使用し、Apple Watchは使わないようにしてください。

フォアグラウンドで1回ペアリング MyWhooshがセンサーの接続を報告するまで、HRBの画面を開いたままにしてください。iOSはバックグラウンドアプリの広告サービスを隠すため、検出にはフォアグラウンドが必要です。接続確立後は、アプリを切り替えるかデバイスをロックしても接続は維持されます。
1台のデバイスから送信 HRBを電話機またはiPadで実行してください。両方で同時に実行しないでください。2つのコピーが同時に広告を出すと、MyWhooshのリストに2つの同一のHRBセンサーが表示され、ペアリング画面からはそれらを区別する方法がありません。
ウォッチリンク(行が赤の場合) メイン画面のウォッチアプリの行は、電話機が実際に検出している内容を示します。「インストールされていない」はウォッチアプリがまだ開かれたことがないことを意味し、「到達不能」は通常、ウォッチアプリが実行されていないことを意味します(アプリを開いてセッションを開始してください)。この行はiPadでは完全に非表示になります。
センサーなしで試す ソースをテスト信号に設定すると、合成された50〜100 BPMのデータを放送します。これは実際のデータと同じようにMyWhooshでペアリングでき、装着前にセンサー側が正常に動作することを確認する最も簡単な方法です。

質問

最初に直面する問題と、それに対する率直な回答。

AirDropが動作しなくなった場合 — まず放送を停止してください

AirDropはBluetooth LEを介して近隣のデバイスを探しますが、HRBも同じ無線を使用します。HRBが広告を送信し、ヘッドユニットが購読している間、HRBはその無線を継続的に占有します。その結果、AirDropは相手のデバイスを検出できないか、転送開始前に停止します。

放送を停止するか、HRBを終了してからAirDropを再起動してください。すぐに機能します。HRBがフォアグラウンドに戻れば、ペアリングはワンタップで完了します。放送中に機能しなくなった他の機能(CarPlayのハンドオフ、キーボードのキー入力途切れ、Continuity Cameraなど)でも、同様の対処が有効な場合があります。

ペアリング後に画面をロックできますか?

できます。検出にはHRBがフォアグラウンドにある必要がありますが、接続は画面のロック、バックグラウンドへの移行、アプリの切り替え後も維持されます。ただし、アプリを非表示にして初めてペアリングすることはできません。iOSはバックグラウンドでサービスの広告を停止するためです。

バッテリー消費はどのくらいですか?

ブロードキャスト自体は消費が少ないですが、測定値を生成するワークアウトセッションは消費が大きいです。そのデバイスでの心拍数ワークアウトと同程度の消費が見込まれます。iPhone 構成では、測定を行っているため、Apple Watch の方が影響を受けやすくなります。

2つのアプリが同時にブロードキャストを読み取ることができますか?

はい。Bluetooth LEでは1つのセンサーに対して複数のサブスクライバーが許可されるため、MyWhooshと2つ目のアプリの両方が同じ数値を確認できます。メイン画面にはライブのサブスクライバー数を表示するため、両方が実際に接続されていることを確認できます。

走行中に BPM が凍結した

測定値は古くなるとグレー表示になり、無効な数値を繰り返すことはありません。AirPodsの場合、これは通常、レポートを停止したことを意味します。その行のルートピッカーはオーディオを一時的に切り替えてリンクを再確立するため、アプリを離れることなく接続を回復できます。

Garminで検出されない

そのモデルがANT+のみで心拍数をペアリングするか確認してください。iPhoneにはANT+ラジオがないため、どのアプリでも送信できません。Bluetoothストラップを受け付けるGarminデバイスはHRBと通常通りペアリングしますが、そうでないデバイスは永遠にペアリングできません。

データはどこに送信されますか?

Bluetoothラジオへ、それ以外には送信されません。アカウントもサーバーも分析機能もありません。心拍はデバイス上のHealthKitから取得され、標準的なセンサー値としてペアリングしたデバイスへ送信されます。

要件

実行に必要なもの、およびコスト

iPhone iOS 26以降。ブロードキャストにはBluetoothの周辺機器ロールを使用するため、シミュレーターではサポートされていません。実際のハードウェアが必要です。
Apple Watch watchOS 11以降。ウォッチアプリはワークアウトセッションを実行します。これは、実用的なレートで心拍数を取得し、画面をオフにした状態でサンプリングを継続するための唯一の方法です。
AirPods オプション。AirPods Pro 3は、ワークアウトセッションを実行しているデバイスに心拍数を報告するため、HRBはソースとして有効化すると電話でセッションを開始します。
価格 App StoreではUSD 4.99で、一度の支払いのみ。サブスクリプションやアプリ内購入はありません。TestFlightベータ版は、次のバージョンを早期に試したい誰でも利用できるよう、リリース版と同時に実行されます。
ペアリング ヘッドユニットが接続するまでアプリを開いたままにしてください。iOSはバックグラウンドにあるアプリのアドバタイズ済みサービスUUIDを隠すため、ディスカバリはフォアグラウンドで発生する必要があります。その後、電話のロックを解除しても接続は維持されます。
ブロードキャスト名 デフォルトはHRBで、最大10文字まで編集可能です。アドバタイズパケットは31バイトであり、ヘッドユニットはそれより長い名前は切り捨てます。

GitHubでオープンソース

このアプリ全体はMITライセンスの下で公開されています — iPhoneアプリ、Watchアプリ、Live Activity、ビルドスクリプト、そしてこのウェブサイトです。プライバシーに関する主張を鵜呑みにするのではなく、Bluetoothのコードそのものを読みたいという方には、すべて公開されています。

読む
github.com/tankbottoms/HeartRateBroadcaster — Swift製、依存関係なし、解析用のSDKも含まれていません。
ビルド
クローンしてxcodegen generateを実行し、プロジェクトを開いてビルドします。コード署名には独自のチーム識別子が必要ですが、それ以外に追加の設定は必要ありません。
サイドロード
各リリースには、サイドロード手順付きのRelease構成.ipaファイルが含まれています。HealthKitとバックグラウンドBluetoothは、フリープロビジョニングプロファイルでは利用できないため、再署名には有料のApple Developerアカウントが必要です。