😴

Apple Watchの睡眠データを自動で連携して、LLMに読み込ませ毎朝アドバイスを送る仕組みを作ってみた

2025/01/14に公開

Apple Watch で記録している睡眠データを使って、LLM(Large Language Model)から朝のアドバイスを自動的に送信する仕組みを構築してみたのでご紹介します。

毎朝起きると自動で睡眠内容を分析し、“昨日はどれくらい深く眠れたのか?”や“快適な睡眠のために何を意識するといいか?”など、ポジティブなメッセージが Slack などに届くようにしてみました。

こんなメッセージが毎朝届きます

なぜ作ったのか?

Apple Watch の睡眠計測機能は便利ですが、次に生かせるようなフィードバックは意外と少ないな、と感じていました。そこで毎日のデータを LLM に渡し、ポジティブなコーチングスタイルでアドバイスを生成することで、快適な睡眠習慣につなげる狙いがあります。

全体のアーキテクチャ

今回の仕組みは以下のようなフローで動作します。

  1. Apple Watchで睡眠データを記録
  2. iPhoneHealth Auto Exportアプリがヘルスケアデータを読み取り、自動で REST API (Cloudflare Workers) にデータを送信
  3. データを受け取った REST API が D1 Database (CloudflareのSQLite互換DB) に保存
  4. データ保存のタイミングで Dify で組んだワークフロー経由で LLM に解析を依頼
  5. LLMが生成したアドバイスを Slack などのチャットツールへ送信(こちらも Dify で実装)

これで、Apple Watch で測定した睡眠データが毎朝自動的に解析され、ポジティブなアドバイスとして受け取れます。

使用技術

  • LLMワークフロー: Dify をセルフホスト
  • REST API: Cloudflare WorkersHono
  • DB: Cloudflare の D1 Database (SQLite 互換)
  • Health Auto Export: iPhone のヘルスケアデータを任意の REST API に自動送信するためのアプリ

どんなデータが送られてくる?

Health Auto Export が送信してくるのは、下記のような JSON フォーマットです。Apple Health の「睡眠分析」(Sleep Analysis)を主に使用します。

{
  "data": {
    "metrics": [
      {
        "name": "sleep_analysis",
        "units": "hr",
        "data": [
          {
            "inBedEnd": "2025-01-13 10:59:13 +0900",
            "asleep": 0,
            "rem": 0.7333333333333334,
            "source": "XXXさんのApple Watch 7",
            "sleepStart": "2025-01-13 06:02:13 +0900",
            "date": "2025-01-13 10:50:13 +0900",
            "inBedStart": "2025-01-13 06:02:13 +0900",
            "deep": 0.55,
            "core": 3.483333333333333,
            "inBed": 4.7666666666666675,
            "sleepEnd": "2025-01-13 10:59:13 +0900",
            "awake": 0.175
          }
        ]
      }
    ]
  }
}
  • rem: レム睡眠時間(時間単位で計測)
  • deep: 深い睡眠時間
  • core: コア(浅い)睡眠時間
  • awake: 覚醒時間
  • inBed: ベッドに入っていた合計時間(寝返りなどで実際には眠っていない時間も含む)

これらを使って「その日の睡眠の質」を LLM に評価させ、次の行動のアドバイスを生成します。

REST APIの構築

Gitリポジトリ

コードは こちらの GitLab リポジトリ に公開しています。

処理の流れ

  1. Health Auto Export から受け取った JSON をパース
  2. sleep_analysis のデータを取得
  3. 日付をキーとして既存のデータかどうか判定し、DB に保存
  4. 新規登録の際に Dify へ「睡眠データを元にコーチングアドバイスを」とリクエスト

この処理が完了すると、Dify は生成したアドバイスを Slack に POST するようになっています。

LLMでのアドバイス生成

今回のポイントは セルフホストの Dify で LLM を動かし、REST API からの入力に応じてアドバイスを作成しているところです。
index.ts 内では下記のような形で Dify に HTTP リクエストを投げます。

const difyResponse = await fetch(c.env.DIFY_API_ENDPOINT, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${c.env.DIFY_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    inputs: {
      query: "睡眠データを元に解析した上でアドバイスをお願いします。 300文字程度の文章で、ポジティブにコーチをお願いします! 最初に朝の挨拶をしてください。",
      context: JSON.stringify(sleepData),
      system_additional_query: "テンションはポジティブでさわやかで明るく、絵文字を使う(マスト)など気分が上がるような雰囲気でお願いします。"
    },
    response_mode: "blocking",
    user: "onigiri24365"
  })
})

Dify ではこのリクエストを受け取ると、LLM に対して「この睡眠データを踏まえて何をアドバイスするか?」というプロンプトを実行し、ポジティブな文章 を生成します。
返ってきたテキストは Slack Incoming Webhook などを使って、ユーザーのチャットへ投稿するかたちです。

Difyワークフロー

こんな流れになっています。

今回は比較的汎用的に利用できるような構造にしてみました。

DSLは こちら

セットアップ方法

1. Dify での LLM設定

  1. セルフホストした Dify を立ち上げる
  2. 自分のモデル(ChatGPT APIやOpenAI APIなど)を設定(今回はDeepSeekを利用)
  3. Slack 送信用の Webhook URLを埋め込み、ワークフローを作成
  4. API用のキーを作成

2. Cloudflare Workers の設定

  1. GitLabリポジトリをクローン
  2. npm install で依存関係をインストール
  3. wrangler d1 create sleep-analyzer で D1 Database を作成
  4. npm run dev でローカル開発サーバーを起動、npm run deploy で本番デプロイ
  5. Cloudflare Worker 側で DIFY_API_KEYDIFY_API_ENDPOINT を環境変数として設定し、連携する

3. Health Auto Export の設定

  1. Health Auto Export アプリをダウンロード
  2. “Export to REST endpoint” の設定で、
    • POST の URL に Cloudflare Worker のエンドポイントを入力
    • Export format を JSON に設定
    • Data type を “Sleep Analysis” だけに絞っておく
  3. 定期的に自動送信するようスケジュールを設定(1日1回など)

実際に動かしてみて

  1. 夜に Apple Watch をつけて寝る
  2. 朝起きると自動でデータが同期される
  3. LLMが睡眠データを分析し、ポジティブなメッセージが Slack に届く

毎朝こうしたフィードバックがあると、昨日の睡眠を振り返りやすくなり、またモチベーションも上がりそうです。

今後の拡張

  • 深度の推移データを可視化して、LLM に「睡眠傾向」を把握させる
  • 他の健康データ(心拍数や活動量など)も連携して、より総合的なアドバイスをする
  • 週間や月間の睡眠レポートをまとめて Slack に送信する

LLM の性能やプロンプトの工夫次第で、より精度の高いコーチングやインサイトを得ることができそうです。

まとめ

Apple Watch で計測した睡眠データを自動収集し、セルフホストの LLM で分析して、ポジティブなメッセージを毎朝受け取れる仕組みを作ってみました。

REST API には Cloudflare Workers を使い、Dify で LLM をセルフホストしているので、コストを抑えつつ自分好みにカスタマイズ できるのが大きな魅力です。普段から睡眠を取るだけで、朝一番にちょっとした励ましやヒントが得られるので、生活の質を高めるきっかけになるかもしれません。

興味がある方はぜひリポジトリを参考に、あなたの環境でも試してみてください。もっと良いアイデアや改善ポイントがあれば教えていただけると嬉しいです!

リンク

Discussion