1. Create reports

Asleep.createReports()

var config: Asleep.Config?
var reports: Asleep.Reports?

if let config {
    reports = Asleep.createReports(config: config)
}
Property NameTypeDescription
configAsleep.ConfigAsleep.Config 객체를 입력

2. Get a single report

Asleep.Reports.report()

var reports: Asleep.Reports?
let sessionId: String

// Closure
reports?.report(sessionId: sessionId, completionBlock: { (report: Asleep.Report?, error: Asleep.AsleepError?) in
    if let error {
        print(error)
        return
    }
    
    if let report {
    }
})

// Async
Task {
    do {
        let report = try await reports?.report(sessionId: sessionId)
    } catch {
        print(error)
    }
}
Property NameTypeDescription
sessionIdStringSleep Tracking을 정지할 때 받을 수 있는 sessionId의 값
completionBlockAsleep.Model.Report?nil이면 에러 발생
Asleep.AsleepError?Error Codes

3. Get multiple reports

Asleep.Reports.reports()

var reports: Asleep.Reports?
let fromDate: String = "2023-05-01"
let toDate: String = "2023-05-07"

// Closure
reports?.reports(fromDate: fromDate, toDate: toDate, completionBlock: { (reportSessions: [Asleep.Model.SleepSession]?, error: Asleep.AsleepError?) in
    if let error {
        print(error)
        return
    }
    
    if let reportSessions {
    }
})

// Async
Task {
    do {
        let reportSessions = try await reports?.reports(fromDate: fromDate, toDate: toDate)
    } catch {
        print(error)
    }
}
Property NameTypeDescription
fromDateString (YYYY-MM-DD)조회 시작 날짜
toDateString (YYYY-MM-DD)조회 마지막 날짜
orderBy

- default value: .descending
Asleep.Model.OrderBy [.ascending, .descending]DESC: 내림차순 정렬
ASC: 오름차순 정렬
offset

- default value: 0
Int스킵할 Report 개수
limit

- default value: 20
Int최대 받을 Report 개수(0~100)
completionBlockArray<Asleep.Model.SleepSession>?nil이면 에러 발생
Asleep.AsleepError?Error Codes

4. Get average stats

Asleep.Reports.getAverageReport()

  • v2.3.0<=SDK
var reports: Asleep.Reports?
let fromDate: String = "2023-05-01"
let toDate: String = "2023-05-07"

// Closure
reports?.getAverageReport(fromDate: fromDate, toDate: toDate, completionBlock: { (averageReport: Asleep.Model.AverageReport?, error: Asleep.AsleepError?) in
    if let error {
        print(error)
        return
    }
    
    if let averageReport {
    }
})

// Async
Task {
    do {
        let averageReport = try await reports?.getAverageReport(fromDate: fromDate, toDate: toDate)
    } catch {
        print(error)
    }
}
Property NameTypeDescription
fromDateString (YYYY-MM-DD)평균을 확인하고자 하는 기간의 시작 시간
toDateString (YYYY-MM-DD)평균을 확인하고자 하는 기간의 종료 시간
completionBlockArray<Asleep.Model.AverageReport>?nil이면 에러 발생
Asleep.AsleepError?Error Codes

5. Delete report

❗️

세션 데이터 삭제 요청에 따라 에이슬립 서버에서 세션 데이터가 삭제된 경우, 추후 과금 사용량 분석 시 삭제된 세션에 대한 구체적인 근거 제공이 어렵습니다.

Asleep.Reports.deleteReport()

var reports: Asleep.Reports?
let sessionId: String

// Closure
reports?.deleteReport(sessionId: sessionId, completionBlock: { (error: Asleep.AsleepError?) in
    if let error {
        print(error)
        return
    }
})

// Async
Task {
    do {
        try await deleteReport?.deleteReport(sessionId: sessionId)
    } catch {
        print(error)
    }
}
Property NameTypeDescription
sessionIdString삭제할 sessionId의 값
completionBlockAsleep.AsleepError?Error Codes

6. Data Type

Asleep.Model.Report

struct Report {
    let timezone: String
    let peculiarities: [Peculiarity]
    let missingDataRatio: Float
    let session: Session
    let stat: Stat?
}

enum Peculiarity {
    case inProgress
    case neverSlept
    case tooShortForAnalysis
    case tooLongForAnalysis
    case tooManyDefectsInSleepStages
    case noBreathingStability
    case noRealtimePolling
}
Property nameTypeDescription
timezoneString분석 결과의 시간대를 해당 timezone으로 변경해서 반환
예. UTC, Asia/Seoul (Timezone List)
peculiaritiesAsleep.Model.Peculiarity해당 수면 세션의 특이사항이 있을 경우 이를 설명해주는 필드. 해당 필드는 여러 개의 라벨을 포함할 수 있음.

inProgress : 세션이 OPEN, CLOSED인 경우
neverSlept: 분석 결과 세션 측정시간 동안 전혀 잠을 자지 않았다고 판단 되는 경우
tooShortForAnalysis: 측정시간이 너무 짧아 유효한 분석을 할 수 없는 경우 (현재 20분 미만)
tooLongForAnalysis: 분석은 정상적으로 되었지만, 세션 측정 시간이 너무 길어 신뢰하기 어려운 경우 (현재 24시간 초과)
tooManyDefectsInSleepStages: 오디오 업로드 누락 등의 이유로 오류율이 높아 수면 분석 결과가 충분하지 않은 경우
noBreathingStability: 고객의 계약 조건상 호흡 안정 분석을 지원하지 않는 경우
noRealtimePolling: 고객의 계약 조건상 실시간으로 수면 정보를 확인할 수 없는 경우
missingDataRatioFloat오디오 업로드 누락 등의 이유로 인한 수면 분석 결과 오류율 (0~1.0)
sessionAsleep.Model.Session세션 분석 정보
statAsleep.Model.Stat분석 통계 정보

Asleep.Model.Session

struct Session {
    let id: String
    let state: State
    let startTime: Date
    let endTime: Date?
    let unexpectedEndTime: Date?
    let createdTimezone: String
    let sleepStages: [Int]?
    let breathStages: [Int]?
}

enum State {
    case open
    case closed
    case complete
}
Property nameTypeDescriptionVersion
idString세션 Id
stateAsleep.Model.State세션의 상태
OPEN: 진행 중인 세션으로, 오디오 업로드가 가능한 상태
CLOSED: 세션 종료 요청이 보내져 종료된 세션. 오디오 파일 업로드 불가능. 업로드된 수면 오디오에 대한 분석이 계속 진행중인 상태
COMPLETE: 세션 종료 후 모든 수면 분석이 완료된 상태
startTimeDate세션 시작 시각
endTimeDate?세션 종료 시각
unexpectedEndTimeDate?비정상 세션 종료 시각. 앱 크래시 등으로 세션이 정상적으로 진행 및 종료되지 못했을 경우, 나중에 클라이언트가 initConfig 를 실행하여 세션을 종료시킨 시각이 기록됨. 이 경우 end_time은 마지막까지 업로드된 오디오 파일의 순서 번호를 기준으로 계산됨. 따라서 null이 아닐 경우 비정상 세션.2.2.0<=SDK
createdTimezoneString세션이 생성된 타임존 (Timezone List)2.2.0<=SDK
sleepStagesArray<Int>수면 단계 리스트
-1: error (invalid audio, analysis error, etc)
0 : wake
1 : light
2 : deep
3 : rem
breathStagesArray<Int>호흡 안정도 단계 리스트
-1: error (invalid audio, analysis error, etc)
0 : stable
1 : unstable

Asleep.Model.Stat

struct Stat {
    let sleepEfficiency: Float?
    let sleepLatency: Int?
    let sleepTime: Date?
    let wakeupLatency: Int?
    let wakeTime: Date?
    let lightLatency: Int?
    let deepLatency: Int?
    let remLatency: Int?
    let timeInWake: Int?
    let timeInSleepPeriod: Int?
    let timeInSleep: Int?
    let timeInBed: Int?
    let timeInRem: Int?
    let timeInLight: Int?
    let timeInDeep: Int?
    let timeInStableBreath: Int?
    let timeInUnstableBreath: Int?
    let timeInSnoring: Int?
    let timeInNoSnoring: Int?
    let wakeRatio: Float?
    let sleepRatio: Float?
    let remRatio: Float?
    let lightRatio: Float?
    let deepRatio: Float?
    let stableBreathRatio: Float?
    let unstableBreathRatio: Float?
    let snoringRatio: Float?
    let noSnoringRatio: Float?
    let unstableBreathCount: Int?
    let breathingPattern: BreathingPattern?
    let breathingIndex: Float?
    let sleepCycle: Int?
    let sleepCycleCount: Int?
    let sleepCycleTime: [Date]?
    let wasoCount: Int?
    let longestWaso: Int?
    let sleepIndex: Int?
    let snoringCount: Int?
}

enum BreathingPattern {
    case stableBreath
    case mildlyUnstableBreath
    case moderatelyUnstableBreath
    case severelyUnstableBreath
}
Property nameTypeDescriptionVersion
sleepEfficiencyFloat?수면 측정 시간 중 실제로 잠든 시간의 비율
sleepLatencyInt?잠들때까지 걸린 시간
sleepTimeDate?수면 측정 시작 후 잠들기까지 걸린 시간
wakeupLatencyInt?잠에서 깨어난 후 수면 측정을 종료하기까지 걸린 시간
wakeTimeDate?잠에서 깨어난 시각
lightLatencyInt?첫 수면 시작으로부터 첫 번째 light가 발생하기까지의 시간2.2.0<=SDK
deepLatencyInt?첫 수면 시작으로부터 첫 번째 deep이 발생하기까지의 시간2.2.0<=SDK
remLatencyInt?첫 수면 시작으로부터 첫 번째 rem이 발생하기까지의 시간2.2.0<=SDK
timeInWakeInt?수면 도중에 깬 시간
timeInSleepPeriodInt?수면 측정 시간 중 수면 측정 시작으로부터 잠들기 까지 걸린 시간과 잠에서 깨어난 후로부터 수면 측정을 종료하기까지 걸린 시간을 제외한 시간
timeInSleepInt?수면 측정 시간 중 실제로 수면 중이었던 시간
이 시간이 deep, light, rem의 3단계로 구분됨
timeInBedInt?수면 측정 시작 시각부터 수면 측정 종료 시각 까지의 시간
timeInRemInt?수면 단계가 rem 으로 진행된 총 시간
timeInLightInt?수면 단계가 light 로 진행된 총 시간
timeInDeepInt?수면 단계가 deep로 진행된 총 시간
timeInStableBreathInt?호흡 안정 구간이었던 총 시간
timeInUnstableBreathInt?호흡 불안정 구간이었던 총 시간
timeInSnoringInt?코골이가 발생한 총 시간2.4.0<=SDK
timeInNoSnoringInt?코골이가 발생하지 않은 총 시간2.4.0<=SDK
wakeRatioFloat?수면 단계 도중 중간에 깬 시간의 비율
sleepRatioFloat?수면 단계 도중 깨지 않고 잔 시간의 비율
remRatioFloat?수면 단계 도중 REM 수면의 비율
lightRatioFloat?수면 단계 도중 light 수면의 비율
deepRatioFloat?수면 단계 도중 deep 수면의 비율
stableBreathRatioFloat?수면 단계 도중 호흡 안정 구간이었던 시간의 비율
unstableBreathRatioFloat?수면 단계 도중 호흡 불안정 구간이었던 시간의 비율
snoringRatioFloat?수면 단계 도중 코골이었던 시간의 비율2.4.0<=SDK
noSnoringRatioFloat?수면 단계 도중 코골이가 아니었던 시간의 비율2.4.0<=SDK
unstableBreathCountInt?불안정 호흡이 발생한 횟수2.2.0<=SDK
breathingPatternAsleep.Model.BreathingPattern?호흡 불안정의 단계
STABLE_BREATH: 안정
MILDLY_UNSTABLE_BREATH: 조금 불안정
MODERATELY_UNSTABLE_BREATH: 불안정
SEVERELY_UNSTABLE_BREATH: 심한 불안정
breathingIndexFloat?호흡 불안정 레벨을 판단하기 위한 값
sleepCycleInt?수면 주기 1회당 평균 시간2.2.0<=SDK
sleepCycleCountInt?수면 주기의 횟수2.2.0<=SDK
sleepCycleTime[Date]?수면 주기 전환 기준 시각
예) [첫번째 수면 주기 시작 시각, 첫번째 수면 주기 종료 시각, 두번째 수면 주기 종료 시각, ..., 마지막 수면 주기 종료 시각]
2.2.0<=SDK
wasoCountInt?수면 구간 중 wake가 발생한 횟수2.2.0<=SDK
longestWasoInt?수면 구간 중 가장 긴 wake의 시간2.2.0<=SDK
sleepIndexInt?수면 데이터 분포를 학습하여 정의된 수면의 질을 종합적으로 대표하는 지표 (수면 점수)2.3.0<=SDK
snoringCountInt?코골이 구간의 발생한 횟수2.4.0<=SDK

Asleep.Model.SleepSession

struct SleepSession {
    let sessionId: String
    let state: State
    let sessionStartTime: Date
    let sessionEndTime: Date?
    let createdTimezone: String
    let unexpectedEndTime: Date?
    let lastReceivedSeqNum: Int
    let timeInBed: Int
}

enum State {
    case open
    case closed
    case complete
}
Property nameTypeDescriptionVersion
sessionIdString수면 세션 ID
stateAsleep.Model.State세션의 상태
OPEN: 진행 중인 세션으로, 오디오 업로드가 가능한 상태
CLOSED: 세션 종료 요청이 보내져 종료된 세션. 오디오 파일 업로드 불가능. 업로드된 수면 오디오에 대한 분석이 계속 진행중인 상태
COMPLETE: 세션 종료 후 모든 수면 분석이 완료된 상태
sessionStartTimeDate세션 시작 시각
sessionEndTimeDate?세션 종료 시각
createdTimezoneString세션이 생성된 타임존 (Timezone List)2.2.0<=SDK
unexpectedEndTimeDate?비정상 세션 종료 시각. 앱 크래시 등으로 세션이 정상적으로 진행 및 종료되지 못했을 경우, 나중에 클라이언트가 initConfig 를 실행하여 세션을 종료시킨 시각이 기록됨. 이 경우 end_time은 마지막까지 업로드된 오디오 파일의 순서 번호를 기준으로 계산됨. 따라서 null이 아닐 경우 비정상 세션.2.2.0<=SDK
lastReceivedSeqNumInt마지막으로 업로드한 오디오 파일의 순서 번호
timeInBedInt수면 측정 시작 시각부터 수면 측정 종료 시각까지의 시간

Asleep.Model.AverageReport

  • v2.3.0<=SDK
struct AverageReport {
    let period: Period
    let peculiarities: [Peculiarity]
    let averageStats: AverageStats?
    let neverSleptSessions: [NeverSleptSession]
    let sleptSessions: [SleptSession]
}
Property nameTypeDescription
periodAsleep.Model.Period타임존 (Timezone List)
peculiarities[Asleep.Model.Peculiarity]수면 세션들의 평균을 구할 때 특이사항.

NO_BREATHING_STABILITY: 고객의 계약 조건상 호흡 안정 분석을 지원하지 않는 경우
averageStatsAsleep.Model.AverageStats?slept_sessions의 수면 메트릭들의 평균들을 가지는 객체
neverSleptSessions[Asleep.Model.NeverSleptSession]세션 측정시간 동안 전혀 잠을 자지 않았다고 판단 되는 세션들의 목록
sleptSessions[Asleep.Model.SleptSession]세션 측정시간 동안 잠을 잤다고 판단 되는 세션들의 목록

Asleep.Model.Period

  • v2.3.0<=SDK
struct Period {
    let timezone: String
    let startDate: Date
    let endDate: Date
}
Property nameTypeDescription
timezoneString요청한 타임존
예. UTC, Asia/Seoul
startDateDate요청한 시작 시간
endDateDate요청한 종료 시간

Asleep.Model.AverageStats

  • v2.3.0<=SDK
struct AverageStats {
    let startTime: String
    let endTime: String
    let sleepTime: String
    let wakeTime: String
    let sleepLatency: Int
    let wakeupLatency: Int
    let timeInBed: Int
    let timeInSleepPeriod: Int
    let timeInSleep: Int
    let timeInWake: Int
    let timeInLight: Int?
    let timeInDeep: Int?
    let timeInRem: Int?
    let timeInStableBreath: Int?
    let timeInUnstableBreath: Int?
    let timeInSnoring: Int?
    let timeInNoSnoring: Int?
    let sleepEfficiency: Double
    let wakeRatio: Double
    let sleepRatio: Double
    let lightRatio: Double?
    let deepRatio: Double?
    let remRatio: Double?
    let stableBreathRatio: Double?
    let unstableBreathRatio: Double?
    let snoringRatio: Double?
    let noSnoringRatio: Double?
    let breathingIndex: Double?
    let wasoCount: Int
    let longestWaso: Int
    let unstableBreathCount: Int?
    let sleepCycleCount: Int?
    let snoringCount: Int?
}
Property nameTypeDescription
startTimeString(hh:mm:ss)세션 시작 시각
endTimeString(hh:mm:ss)세션 종료 시각
sleepTimeString(hh:mm:ss)잠들때까지 걸린 시각
wakeTimeString(hh:mm:ss)잠에서 깨어난 시각
sleepLatencyInt잠들때까지 걸린 시각
wakeupLatencyInt잠에서 깨어난 후 수면 측정을 종료하기까지 걸린 시간
timeInBedInt수면 측정 시작 시각부터 수면 측정 종료 시각 까지의 시간
timeInSleepPeriodInt수면 측정 시간 중 수면 측정 시작으로부터 잠들기 까지 걸린 시간과 잠에서 깨어난 후로부터 수면 측정을 종료하기까지 걸린 시간을 제외한 시간
(timeInBed - sleepLatency - wakeupLatency)
timeInSleepInt수면 측정 시간 중 실제로 수면 중이었던 시간
이 시간이 deep, light, rem의 3단계로 구분됨
timeInWakeInt수면 도중에 깬 시간
timeInLightInt?수면 단계가 light 로 진행된 총 시간
timeInDeepInt?수면 단계가 deep로 진행된 총 시간
timeInRemInt?수면 단계가 rem 으로 진행된 총 시간
timeInStableBreathInt?호흡 안정 구간이었던 총 시간
timeInUnstableBreathInt?호흡 불안정 구간이었던 총 시간
timeInSnoringInt?코골이가 발생한 총 시간
timeInNoSnoringInt?코골이가 발생하지 않은 총 시간
sleepEfficiencyDouble수면 측정 시간 중 실제로 잠든 시간의 비율
wakeRatioDouble수면 단계 도중 중간에 깬 시간의 비율
sleepRatioDouble수면 단계 도중 깨지 않고 잔 시간의 비율
lightRatioDouble?수면 단계 도중 light 수면의 비율
deepRatioDouble?수면 단계 도중 deep 수면의 비율
remRatioDouble?rem sleep 비율
stableBreathRatioDouble?수면 단계 도중 호흡 안정 구간이었던 시간의 비율
unstableBreathRatioDouble?수면 단계 도중 호흡 불안정 구간이었던 시간의 비율
snoringRatioDouble?수면 단계 도중 코골이었던 시간의 비율
noSnoringRatioDouble?수면 단계 도중 코골이가 아니었던 시간의 비율
breathingIndexDouble?호흡 불안정 레벨을 판단하기 위한 값
wasoCountInt수면 구간 중 wake가 발생한 횟수
longestWasoInt수면 구간 중 가장 긴 wake의 시간
unstableBreathCountInt?불안정 호흡이 발생한 횟수
sleepCycleCountInt?수면 주기의 횟수
snoringCountInt?코골이 구간의 발생한 횟수

Asleep.Model.NeverSleptSession

  • v2.3.0<=SDK
struct NeverSleptSession {
    let id: String
    let startTime: Date
    let endTime: Date
    let completedTime: Date
}
Property nameTypeDescription
idStringsession id
startTimeDate세션 시작 시각
endTimeDate세션 종료 시각
completedTimeDate세션 분석 완료 시각

Asleep.Model.SleptSession

  • v2.3.0<=SDK
struct SleptSession {
    let id: String
    let createdTimezone: String
    let startTime: Date
    let endTime: Date
    let completedTime: Date
    let sleepEfficiency: Double
    let sleepLatency: Int?
    let wakeupLatency: Int?
    let lightLatency: Int?
    let deepLatency: Int?
    let remLatency: Int?
    let sleepTime: Date?
    let wakeTime: Date?
    let timeInWake: Int
    let timeInSleepPeriod: Int
    let timeInSleep: Int
    let timeInBed: Int
    let timeInRem: Int?
    let timeInLight: Int?
    let timeInDeep: Int?
    let timeInStableBreath: Int?
    let timeInUnstableBreath: Int?
    let timeInSnoring: Int?
    let timeInNoSnoring: Int?
    let wakeRatio: Double
    let sleepRatio: Double
    let remRatio: Double?
    let lightRatio: Double?
    let deepRatio: Double?
    let stableBreathRatio: Double?
    let unstableBreathRatio: Double?
    let snoringRatio: Double?
    let noSnoringRatio: Double?
    let unstableBreathCount: Int?
    let breathingPattern: BreathingPattern?
    let sleepCycle: Int?
    let sleepCycleCount: Int?
    let wasoCount: Int?
    let longestWaso: Int?
	  let snoringCount: Int?
}
Property nameTypeDescription
idStringsession id
createdTimezoneString세션이 생성된 타임존 (Timezone List)
startTimeDate세션 종료 시각
endTimeDate세션 종료 시각
completedTimeDate세션 분석 완료 시각
sleepEfficiencyDouble수면 측정 시간 중 실제로 잠든 시간의 비율
sleepLatencyInt?잠들때까지 걸린 시각
wakeupLatencyInt?잠에서 깨어난 후 수면 측정을 종료하기까지 걸린 시간
lightLatencyInt?첫 수면 시작으로부터 첫 번째 light가 발생하기까지의 시간
deepLatencyInt?첫 수면 시작으로부터 첫 번째 deep이 발생하기까지의 시간
remLatencyInt?첫 수면 시작으로부터 첫 번째 rem이 발생하기까지의 시간
sleepTimeDate?수면 측정 시작 후 잠들기 까지 걸린 시간
wakeTimeDate?잠에서 깨어난 시각
timeInWakeInt수면 도중에 깬 시간
timeInSleepPeriodInt수면 측정 시간 중 수면 측정 시작으로부터 잠들기 까지 걸린 시간과 잠에서 깨어난 후로부터 수면 측정을 종료하기까지 걸린 시간을 제외한 시간
(time_in_bed - sleep_latency - wakeup_latency)
timeInSleepInt수면 측정 시간 중 실제로 수면 중이었던 시간
이 시간이 deep, light, rem의 3단계로 구분됨
timeInBedInt수면 측정 시작 시각부터 수면 측정 종료 시각 까지의 시간
timeInRemInt?수면 단계가 rem 으로 진행된 총 시간
timeInLightInt?수면 단계가 light 로 진행된 총 시간
timeInDeepInt?수면 단계가 deep로 진행된 총 시간
timeInStableBreathInt?호흡 안정 구간이었던 총 시간
timeInUnstableBreathInt?호흡 불안정 구간이었던 총 시간
timeInSnoringInt?코골이가 발생한 총 시간
timeInNoSnoringInt?코골이가 발생하지 않은 총 시간
wakeRatioDouble수면 단계 도중 중간에 깬 시간의 비율
sleepRatioDouble수면 단계 도중 깨지 않고 잔 시간의 비율
remRatioDouble?rem sleep 비율
lightRatioDouble?수면 단계 도중 light 수면의 비율
deepRatioDouble?수면 단계 도중 deep 수면의 비율
stableBreathRatioDouble?수면 단계 도중 호흡 안정 구간이었던 시간의 비율
unstableBreathRatioDouble?수면 단계 도중 호흡 불안정 구간이었던 시간의 비율
snoringRatioDouble?수면 단계 도중 코골이었던 시간의 비율
noSnoringRatioDouble?수면 단계 도중 코골이가 아니었던 시간의 비율
unstableBreathCountInt?불안정 호흡이 발생한 횟수
breathingPatternBreathingPattern?호흡 불안정의 단계

STABLE_BREATH: 안정
MILDLY_UNSTABLE_BREATH: 조금 불안정
MODERATELY_UNSTABLE_BREATH: 불안정
SEVERELY_UNSTABLE_BREATH: 심한 불안정
sleepCycleInt?수면 주기 1회당 평균 시간
sleepCycleCountInt?수면 주기의 횟수
wasoCountInt?수면 구간 중 wake가 발생한 횟수
longestWasoInt?수면 구간 중 가장 긴 wake의 시간
snoringCountInt?코골이 구간의 발생한 횟수