AWS IoTボタンで赤ちゃんのトイレを記録する

アドベントカレンダー

注意

このブログでは、「ウンチ」「おしっこ」といったワードが複数回出てきます。
このような表現が苦手な方、またはお食事中の方は、本ブログをご覧にならないようにお気をつけください。

友達の家にお邪魔したときの話

先日、もうすぐ1歳になる子どもをもつ友達の家に遊びに行きました。
その時に、赤ちゃんという生き物は毎日毎日ウンチやおしっこの回数を数えておいて
検診のたびに報告しないといけないんだよ〜、という話を聞きました。
さらに、世間には「うんこボタン」なる製品があることも教えてもらいました。
https://unkobtn.com/ (※すでに販売終了の模様)
このブログは、これなんだか作れそうだなーと思ったACALL社員のお話になります。
興味のある方は、最後までお付き合いください。

お詫び

世の中には、同じ発想をもった方が大勢いて、、、
今回のAWS IoTボタンで赤ちゃんのボタンを!!という内容も例外ではなく
既に発信している方がいらっしゃいました。

アイデアはもろかぶりですが、実装方法、使用言語、アウトプット方法が違うということで、
今回はご容赦いただきたく。

ではさっそく

  1. AWS IoTボタンをおす
  2. Lambda上でGoogle Apps Scriptで書いたAPIをコール
  3. Googleカレンダーにイベント作成

こんな感じで。

AWS IoTボタン を購入

AWS IoTボタンの設定は、AWS マネジメントコンソール画面と専用アプリから行いましたが
詳細はここでは割愛します。(いろんな人がいろんなところで丁寧に説明してくれてます)

AWS IoT 1-Click - Google Play のアプリ
AWS IoT 1-Click を使用すると、すぐに使用できるサポート対象の IoT デバイスから簡単に Lambda 関数をトリガーできます。このアプリを使用して、購入したデバイスをアカウントで要求し、それを設定できます

AWS IoTボタンのイベントは、「1回押した」「2回押した」「長押しした」の3種類とれるので、
それぞれ
・1回ボタン押す→おしっこの記録
・2回ボタン押す→ウンチの記録
・長押し→おっぱいの記録(おまけ)
にしようと思います。

Lambda の準備

今回ランタイムはNode.jsを選択しています。

// index.js

const axios = require('axios');

// IoTボタンを押すと event が渡されるー①
exports.handler = async (event) => {
  let status;
  // clickType を取得して status を変更
  switch(event.deviceEvent.buttonClicked.clickType) {
    case "SINGLE":
      status = '1';
      break;
    case "DOUBLE":
      status = '2';
      break;
    case "LONG":
      status = '3';
      break;
  }
  // GAS API に status を POST
  await axios.post(process.env.URL, { clickType: status })
    .then(res => console.log(res))
    .catch(err => console.error(err))
};

AWS IoTボタンを押すと、event が渡されます。
event には以下のような情報が含まれます。

{
  "deviceInfo": {
    "deviceId": "**************",
    "type": "button",
    "remainingLife": 98.75,
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "baby_health",
      "placementName": "home",
      "deviceTemplateName": "BabyCalendarRequest"
    }
  },
  "deviceEvent": {
    "buttonClicked": {
      "clickType": "SINGLE",
      "reportedTime": "2019-11-30T06:12:46.805Z"
    }
  },
  "placementInfo": {
    "projectName": "baby_health",
    "placementName": "home",
    "attributes": {},
    "devices": {
      "BabyCalendarRequest": "**************"
    }
  }
}

ちなみに、placementInfo の attributes はカスタマイズ可能です。(今回は使ってません)

AWS IOT 1-CLICK プロジェクト作成の際、プレイスメントの属性で設定した key と value が placementInfo の attributes に反映されます。

Google Apps Script の準備

// index.gs

function doPost(e){
  // Lambda から POST されたパラメータを整形
  const params = JSON.parse(e.postData.getDataAsString())
  const clickType = params.clickType
  createEvents(clickType)
}

function createEvents(clickType) {
  // Googleカレンダーの取得
  const calendar = CalendarApp.getDefaultCalendar()
  const startTime = new Date()
  const endTime = new Date()
  var title = null
  var color = null
  // clickType によってタイトルとイベントの色を振分け
  switch(clickType) {
    case '1':
      title = 'おしっこ'
      color = CalendarApp.EventColor.PALE_BLUE
      break;
    case '2':
      title = 'ウンチ'
      color = CalendarApp.EventColor.RED
      break;
    case '3':
      title = 'おっぱい'
      color = CalendarApp.EventColor.YELLOW
      break;
   }
  // イベントを作成する
  calendar.createEvent(title, startTime, endTime).setColor(color)
}

予定通り
・1回ボタン押す→おしっこの記録
・2回ボタン押す→ウンチの記録
・長押し→おっぱいの記録
にしました。

実践

1回PUSH!

2回PUSH!

LONG PUSH!

本来カレンダーは未来の予定を管理するものですが、今回は過去を記録する目的で使う結果となりました。
スマホで Googleカレンダー を同期しておけば簡単に記録が見られるので
わざわざ専用アプリを入れる必要がないのでいいんじゃないかと、個人的に思ってます。

まとめ

制作時間は2時間程度。(ボタンの注文から到着は除きます)
そして気になるお値段は・・・
・AWS IoTボタン:2500円
・AWS IoT 1-Click:月額約110円(14,999デバイスまではこのお値段)
・Lambda:無料(100万リクエスト/月まで)
ということで、初期費用は2610円でした。
今回は赤ちゃんの健康管理という点から発想を得ましたが、自分自身やペットの管理にも使えそうです。

個人的に初めて IoT なるものと触れ合ったので、楽しい時間が過ごせました。
(ブログがないとやってなかった。ブログに感謝しています。)

ACALL は、さまざまな IoTモジュールと iPad を組み合わせることにより、
自動ドア・フラッパーゲート・電子錠・エレベーターとの連携を可能にします。

ACALLの機能紹介 | ACALL[アコール]WorkstyleOS|「どこでも安心・安全・快適にはたらく」を実現する
利用シーンに合わせて柔軟にカスタマイズ。多彩な機能を組み合わせて、自分らしいワークスタイルを作り上げましょう。

うちのビル、もっとスマートにしたいわ〜と思っているそこのあなた、
是非、ACALLの導入をご検討くださいませ。
そして、そんな ACALL を一緒に開発してみたい!と思っているそこのあなた、
今すぐ、下記リンク先からエントリーしましょう!!

それでは、最後まで読んでいただきありがとうございました。
また会う日まで。さようなら。