2021년 4월 9일 금요일

샤오미 밴드로 구한 수면 패턴

샤오미 밴드 53만원대 저렴한 가격에 개인 심박수, 활동 및 수면에 관한 자료를 저장해 제공합니다.  특히 이 블로그에서는 수면 상태에 관한 정보를 모아서 후에 수면 상태에 따른 알람을 만드는데 쓸려고 합니다.


샤오미 밴드는 mi fit이라는 앱과 같이 사용합니다.  mit fit는 밴드를 통해 얻은 정보를 화면에 표시하기는 하지만 RAW 데이터는 휴대폰으로 저장하지 않고 샤오미가 별도로 관리하는 서버로 보내는 것 같습니다. 그래도 각 개인은 샤오미 밴드가 저장한 RAW 데이터를 구할 수 있습니다.  여기에 몇 가지 방법이 있습니다.


1) 샤오미 웹에서 신청하기

mifit.huami.com/t/account_mifit  에 접속해서 데이터 내보내기를 클릭하면 email로 보내준다고 합니다. 테스트를 해보았는데 메일이 오는 경우도 있고 오지 않는 경우도 있었습니다.  메일이 와도 zip 압축 푸는데 에러가 발생해서 이 방법은 포기했습니다.

 

2) 휴대폰에서 데이터 내보내기 신청

“mi fit -> 프로필 -> 설정 -> 정보 -> 사용자의 권리 행사 -> 데이터 내보내기를 통한 신청도 가능합니다.  mi fit 로그인은 SSOgoogle id를 사용했는데 내보내기과정에 암호를 넣으라는 요구가 이상해서 이 방법도 포기했습니다.

 

3) 샤오미에서 제공하는 API

Android iOS용 앱을 구상하고 있기 때문에 언젠가는 사용해야 하는 방법입니다. 사용법은 아래 link에 소개되어 있지만 일단 복잡하니 다음에 시도하기로 합니다.

https://github.com/huamitech/rest-api/wiki 

 

4) Google fit과 동기화 후에 google에서 데이터 가져오기

샤오미의 mit fit는 다른 앱인 google fit와 동기화도 가능합니다.  mi fit이 모은 데이터를 google에 넘겨 줄 수 있습니다.  자세한 방법은 다른 분의 블로그를 참조하세요. 이렇게 넘긴 정보를 google 사이트 https://takeout.google.com/ 에서 신청하면 메일로 정보를 받습니다이 블로그에서는 이 방법으로 RAW 데이터를 구했습니다.




정확하게는 link 정보를 받아 zip 파일을 다운로드합니다.  수면 데이터는 “All Data” 폴더에 들어있는 raw_com.google.sleep.segment_com.xiaomi.hm.hea.json 이라는 긴 이름의 파일입니다. JSON 형식에 맞게 출력해보면 아래와 같이 보입니다.


{
  "Data Source": "raw:.....r- sleep segments",
  "Data Points": [
    {
      "fitValue": [
        {
          "value": {
            "intVal": 4
          }
        }
      ],
      "originDataSourceId": "",
      "endTimeNanos": 1617463620000000000,
      "dataTypeName": "com.google.sleep.segment",
      "startTimeNanos": 1617460500000000000,
      "modifiedTimeMillis": 1617502049494,
      "rawTimestampNanos": 0
    },
    {
      "fitValue": [
        {
          "value": {
            "intVal": 6
          }
        }
      ],
      "originDataSourceId": "",
      "endTimeNanos": 1617464280000000000,
      "dataTypeName": "com.google.sleep.segment",
      "startTimeNanos": 1617463620000000000,
      "modifiedTimeMillis": 1617502049494,
      "rawTimestampNanos": 0
    },
    {
      "fitValue": [
....


intVal는 수면 상태 종류을 뜻하는데 4는 얕은잠, 6 REM, 5는 깊은잠, 1는 잠에서 깬 상태입니다.  startTimeNanos가 상태를 시작한 시각이고 endTimeNanos가 상태가 끝나는 시각입니다.

아래 화면은 mi fit에서 본 어느 하루 밤의 수면 패턴입니다.



google fit과 동기화 되면 google fit에서 아래 화면을 볼 수 있습니다. 위 그림보다 보기가 편합니다.



“All data”에 들어 있는 *.sleep.*.json에서 intVal 값이 높다고 잠의 깊이 정도를 의미하지 않습니다.  x축을 잠들기 시작한 시간(초단위), y축을 잠의 깊이로 표현해서 그래프를 그리려면 intVal에 따라 y축을 다시 정의해야 google fit와 비슷한 아래 그래프를 얻습니다.   




댓글 없음:

댓글 쓰기