iPhoneの「ショートカット」アプリで、同じくiPhoneの「ヘルスケア」アプリから睡眠時間を得るために工夫した点の備忘録です。
結論から言うと、「就寝時刻」「起床時刻」をそれぞれ取得することにしました。
理由は「睡眠時間」という値をヘルスケアから得られないこと。iPhoneの睡眠時間は、同じ夜から朝までの睡眠を一つの睡眠とカウントするわけではなく、レム睡眠X時間、その次のノンレム睡眠をY時間…と細切れにカウントし、最初っぽい時刻と最後っぽい時刻の差を睡眠時間と計算しているようなのです。このため、仮にヘルスケアの「睡眠」というデータを特定の日付でフィルタしたとしても、その中身は睡眠タイプ、開始時刻、終了時刻などからなる2次元の配列になります。
そのため、考え方としては「過去1日の中で最も早い睡眠の開始時刻を就寝時刻」、同様に「最も遅い睡眠の終了時刻を起床時刻」として、このショートカットを夕方 = その日の就寝見込み時刻の少し前に作動させることにしました。
以下、就寝時刻を取得するショートカット画面です。

最終的に得たいのは時刻という一つのテキスト形式の値なので、配列に対しいくつかのフィルタをかけてあげる必要があります。
まずは、最も早い睡眠の開始時刻を得たいので、開始日の順序を古い順にし、「制限」で取得データ数を1つに制約します。ただこの時点で「ヘルスケアサンプルを検索」が返す値は「睡眠タイプ」「開始日」「終了日」などが含まれた配列なので、そこから開始日(開始時刻)を得るために「ヘルスケアサンプルの詳細を取得」で「開始日」のみ抜き出してあげる必要があります。
以下、同様の考え方で起床時刻を抽出するショートカットです。

このやり方がうまいのは、例として夜中にトイレに起き、少し目が覚めてからまた寝た場合など、睡眠が中断した際にも最初の就寝時刻と最後の起床時刻をカウントしてくれるところです。中断も加味した正確な睡眠時間の集計にはかなり凝った処理が必要になる気がします。