INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

LINE Messaging APIでLINE botを作る(4) センサー連携

estrellita.hatenablog.com

の続き。

スマート家電コントローラRS-WFIREX3には気温・湿度・照度をGoogleスプレッドシートに記録してくれるIFTTTアプレットがある。せっかくなのでこれらのセンサーデータをリプライするようにechoman()を修正する。


センサーデータの記録

RATOC SystemsからセンサーデータをGoogleスプレッドシートに記録するアプレットが公開されているのでそのまま利用する。

  1. IFTTTのトップページ検索欄に「ratoc」を入力
    • f:id:tak95:20190531165636p:plain
  2. 検索結果から「センサー情報をスプレッドシートへ記録」を選択
    • f:id:tak95:20190531165742p:plain
  3. 歯車アイコンを選択
    • f:id:tak95:20190531165759p:plain
  4. 計測するリモコンを選択し、記録するスプレッドシートのフォルダ・ファイル名を設定し「Save」
    • f:id:tak95:20190531165818p:plain


node参照用のGoogleスプレッドシートの作成

node.jsからGoogleスプレッドシートを参照する際にあらかじめセルの範囲を把握しておく必要があるようだが、上記の設定だとシートに行が追加されていくため、入力されているセル範囲がわからない。そのため上記で作成したスプレッドシートに行が追加されたら別のシートに追加された行の値を保持するIFTTTアプレットを作成する。

  1. 「+this」を選択
    • f:id:tak95:20190531002346p:plain
  2. 検索欄に「sheets」を入力し「Google Sheets」を選択
    • f:id:tak95:20190531172932p:plain
  3. 「New row added to spreadsheet」を選択
    • f:id:tak95:20190531172948p:plain
  4. 前節で設定したスプレッドシートのフォルダ・ファイル名を入力し、「Create trigger」を選択
    • f:id:tak95:20190531173005p:plain
  5. 「+that」を選択
    • f:id:tak95:20190531173020p:plain
  6. 検索欄に「sheets」を入力し「Google Sheets」を選択
    • f:id:tak95:20190531173032p:plain
  7. 「Update cell in spreadsheet」を選択
    • f:id:tak95:20190531173052p:plain
  8. 最新データのみ保持するシートのフォルダ・ファイル名を入力し、「Which cell?」には"A1", 「Value」には"{{ColumnA}},{{ColumnB}},{{ColumnC}},{{ColumnD}},{{ColumnE}}"
    • f:id:tak95:20190531173103p:plain
  9. 「Finish」を選択して設定完了
    • f:id:tak95:20190531173120p:plain


Googleスプレッドシートへのアクセス設定

node.jsからGoolgeスプレッドシートにアクセスするにはあらかじめアクセス権の設定などが必要となる。リンク先を参考に鍵ファイルの作成およびシートの共有設定を行う。

techblog.lclco.com


echoman()の更新

node.jsからGoogleスプレッドシートが参照できるようになったのでメッセージに「何度」「温度」といった単語が含まれる場合、センサーデータを返すように更新する。

センサーデータを取得するgetSensorValue()は以下の通り。

const GoogleSpreadsheetAsPromised = require('google-spreadsheet-as-promised')
const CREDS = require('./credentials.json')
const sheetId = process.env.SHEET_ID // id from sheet URL

async function getSensorValue () {
  const sheet = new GoogleSpreadsheetAsPromised()
  await sheet.load(sheetId, CREDS)
  const worksheet = await sheet.getWorksheetByName('シート1')
  const cell = (await worksheet.getCells('A1:A1')).getAllValues()

  return cell[0].split(',')
}


最終的にechoman()は以下のようになりました。

async function echoman (ev) {
  // const pro = await client.getProfile(ev.source.userId)
  let msg = ''
  if (ev.message.text.includes('おやすみ')) {
    goodNight()
  }
  if (ev.message.text.includes('掃除') | ev.message.text.includes('片付け')) {
    tidyMyRoom()
  }
  if (ev.message.text.includes('何度') | ev.message.text.includes('温度')) {
    const sensorValues = await getSensorValue()
    msg = await `${sensorValues[0]} ${sensorValues[1]}計測\n 温度: ${sensorValues[2]}\n 湿度: ${sensorValues[3]}%\n 照度: ${sensorValues[4]} lx\nです。`
  }

  if (msg === '') {
    msg = await conversation(ev.message.text)
  }
  console.log(`[in]echoman(): msg = ${msg}`)

  return client.replyMessage(ev.replyToken, {
    type: 'text',
    text: msg
  })
}

我が家のエアコンのリモコンはBluetoohのためRS-WFIREX3から操作できないのが残念だが部屋を擬人化したbotとしてだいたいやりたいことはできた。


試してると愛着が湧いてきて引越しするのが辛くなるなと思って試しにメッセージ送ってみたら

f:id:tak95:20190531201506p:plain

速攻で新しい家人探し始めた。。。orz