OK Google, FitBit에 체중을 기록하고

이 기사의 목적



Google Home Mini를 몇 달 전에 구입했는데, 스마트 홈화를 하고 있는 것도 아니고 단순한 입상이 되어 있었습니다. 또 건강이 신경이 쓰이는 연령이므로 FitBit Charge2는 매일 끼워 보수계나, 수면 시간, 심박 등의 정보는 항상 있는데 집에 있는 체중계는 Bluetooth 대응이 아니고 귀찮아서 지금까지 기록은 하고 있지 않습니다 했다.

처음에는 체중계의 수치를 카메라로 찍어 화상 인식으로 수치 읽을까라고 생각했습니다만, 그런 것보다 말하는 편이 빠르다고는 스마트 스피커를 사용한 구조 만들어 보면 생각외 간단하게 실현할 수 있다 했다는 기록입니다.

개요



체중을 FitBit에 기록





대부분의 흐름은 위의 그림과 같습니다.
Google이 내놓고 있는 IFTTT의 Applet Connect Google Assistant to Fitbit이 있으므로 이것 사용하면 한 번에 실현할 수 있습니다.

음성인식의 정밀도는 과연 Google에만 딱 맞습니다만, 조금만 요령이 있었습니다.

Google Home에 말을 건 구 문구의 등록입니다만, 「체중은 xx 킬로」라고 말할 생각으로 처음. 활동을 확인한 결과 Google이 体重は xx キロキロ로 변환했으며 등록 문구와 일치하지 않는 것 같습니다.
그래서 대체 문구로 Kg를 등록하면 현재 100% 성공하고 있습니다.


체지방률을 FitBit에 기록





불행히도 체중계에 나오는 체지방률에 대해서는 공개된 레시피가 없기 때문에 스스로 작성할 필요가 있습니다.
그렇다고 해도 IFTTT에는 Google AssistantWebHooks이 준비되어 있기 때문에 WebHook에 FitBit의 Fitbit Web API Basics을 설정해 주면 좋겠다고 생각했습니다.

하지만 여기서 문제가 ...

FitBit에 체지방률을 기록하는 API에는 기록할 날을 넣어야 합니다. Google Assistant에서는 말했을 때의 일시를 {{CreatedAt}} 라는 파라미터로 가지고 있습니다만 이것이 体重は xx Kg 와 같은 포맷이 되어 있어 API 로 필요한 포맷 September 4, 2018 at 10:04PM
불행히도 직접 FitBit에 기록할 수 없었기 때문에 Google 스프레드시트에 기록하고 Google Apps Script에서 FitBit API를 두드리기로 결정했습니다.

첫째, IFTTT에서 Google Assistant로 말한 체지방률을 Google 스프레드 시트에 기록하는 부분입니다.

Google Assistant를 IFTTT로 연결  이나 IFTTT, Google Assistant, Google Sheets에서 아기 모유 수유 기록  라는 기사를 참고로 했습니다.



결국 날짜와 시간 형식을 변환하는 것은 어렵고 Google Assistant의 {{CreatedAt}}을 사용하는 것은 포기하고 스프레드 시트에 추가 된 날짜와 시간을 Google Apps Script로 가져 오기로 결정했습니다.



이 문서 IFTTT에서 Google 스프레드 시트에 날짜와 시간을 쓸 수없는 경우의 해결 방법이 도움이되었습니다.

그리고는 FitBit의 API를 부르는 부분입니다.
보안상 필요한 토큰은 직접 코드에 쓰지 않고 속성으로 저장하고 참조하는 것이 좋을 것 같습니다.
UserProperties는 화면에서 입력할 수 없었기 때문에 한 번 코드로 작성해야 하는 것 같습니다.

또한 체지방률을 등록하는 FitBit API에서는 파라미터로서 시간(time)도 있습니다만, 이것을 사용하면 Fut Bit의 대시보드에 반영할 수 없다는 현상이 있었으므로, 날에만 등록하기로 했습니다 .
function addDate(e) {
    var lr = SpreadsheetApp.getActiveSheet().getLastRow();
    var now = new Date();
    var createDate = Utilities.formatDate( now, 'Asia/Tokyo', 'yyyy-MM-dd');

    SpreadsheetApp.getActiveSheet().getRange(lr, 2).setValue(createDate);
    SpreadsheetApp.getActiveSheet().getRange(lr, 3).setValue(createTime);
    var fat = SpreadsheetApp.getActiveSheet().getRange(lr, 4).getValue();

    pushFat(createDate, fat);
}

// FitBit に体脂肪率を登録する
function pushFat(date, fat) {
  var url = "https://api.fitbit.com/1/user/[ユーザーID]/body/log/fat.json";
  var userProperties = PropertiesService.getUserProperties();
  var token = userProperties.getProperty('FITBIT_TOKEN');

  var payload =
  {
    "date" : date,
    "fat" : fat
  };
  // オプション指定
  var options =
  {
    "method"  : "post",
    "payload" : payload,
    "headers" : {"Authorization" : "Bearer "+ token},
    "contentType" : "application/x-www-form-urlencoded",
  };
  //通知を送る
  var response = UrlFetchApp.fetch(url,options);
  Logger.log(response);
}

이런 느낌으로 무사히 FitBit의 대시보드에 체중과 체지방률을 기록해 나갈 수 있을 것 같습니다.

좋은 웹페이지 즐겨찾기