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

LINE Messaging APIでLINE botを作る(3) リモコン連携

estrellita.hatenablog.com

の続き。

部屋をIoT化するのが楽しくなってきたので今回はメッセージに「おやすみ」を含む場合、部屋の照明を消すようにする。

使用する機器はラトックシステム株式会社のスマート家電コントローラRS-WFIREX3

現在は後継機が発売されているのでこれから買うのであればこちらの方が良いかもしれない。

LINE Messaging APIとRS-WFIREX3は直接連携することはできないがスマート家電リモコン Webマニュアルにある通りIFTTTのアクションとして設定することができる。


続きを読む

LINE Messaging APIでLINE botを作る(2) Habitica連携

estrellita.hatenablog.com

の続き。

掃除を習慣化するため習慣化をゲーミフィケーションするHabiticaを活用する。Habiticaについては以下を参照。

habitica.com

yutoreba.com


Habiticaの良い点としてはAPIが充実しているところ。

Habitica V3 API Documentation


メッセージに「掃除」や「片付け」といったキーワードを含む場合、Habiticaの掃除タスクのスコアを上げるといったことができるようになる。


続きを読む

LINE Messaging APIでLINE botを作る(1) 対話実装

ビール片手にLT大会 vol.3 (at WeWork日比谷) - connpassでLTした通り、自分の部屋を擬人化したLINE botを作った。

f:id:tak95:20190530211520p:plain
アヤメ(俺の部屋bot

もともと掃除・片付けが苦手で部屋を擬人化することで掃除後に「きれいになったね」とメッセージすると「ありがとう」などのリプライがあることで掃除のモチベーションを上げたいというのがbot作成のきっかけ。

botの機能としては以下の通り。

  • メッセージに対してUserlocalの全自動会話APIのレスポンスをリプライする
  • メッセージに「掃除」「片付け」が含まれているとHabiticaの「部屋の掃除」タスクのスコアを上げる
  • メッセージに「おやすみ」が含まれていると消灯する
  • メッセージに「気温」「何度」が含まれていると部屋の気温/湿度/照度をリプライする

f:id:tak95:20190530213056p:plain

f:id:tak95:20190530213124p:plain

f:id:tak95:20190530213202p:plain


続きを読む

Shinyで家計調査viewer作りました。

就職で上京する前、京都に住んでいた頃は毎週ラーメンを食べていたので京都はラーメン大国だと思い込んでいたけどリンク先のランキングではワースト3位という結果だった。。。(天下一品とかラーメン横綱とか行かないのか?)

ラーメン(外食)の消費量の都道府県ランキング(平成29年) | 地域の入れ物


おそらく以下が出典元で2人以上の世帯が対象となっているため学生はサンプルに含まれていないのかもしれない。

統計局ホームページ/家計調査(二人以上の世帯)<品目分類>各年の都道府県庁所在市別支出金額及び購入数量


一方、ぎょうざの消費量は宇都宮を抑えてトップ。(餃子の王将には行くのか?)

ぎょうざの消費量の都道府県ランキング(平成29年) | 地域の入れ物


他の支出にも興味が出たので上記の家計調査のデータをShinyで可視化してみた。各都道府県の県庁所在地毎の経年データを{geofacet}で表示することも考えたけど今回は平成29年分の結果を以下を参考にシンプルに可視化してみる。

qiita.com


結果はこちらから。 → https://kashitan.shinyapps.io/pref_stat/

ビールやワイン、日本酒、焼酎、ウイスキーを並べてみると以下のような結果に。

f:id:tak95:20190518224845p:plain:w300
ビール

f:id:tak95:20190518224951p:plain:w300
ワイン

f:id:tak95:20190518225018p:plain:w300
日本酒

f:id:tak95:20190518225044p:plain:w300
焼酎

f:id:tak95:20190518225105p:plain:w300
ウイスキー


福岡のワイン支出が個人的に意外。



本来は地域毎の物価の差なども考慮する必要があるかと思うが、簡易に作ってみたところ京都はコーヒーの支出もトップなど知らない発見があり意外と面白かったのでとりあえず公開してみる。対応分析などで似ている県庁所在地を探すのも興味深いかもしれない。

shiny::selectInput()の選択メニューを動的にしたり、shinyapps.ioでggplot2の日本語が化けたり色々ハマったところもあったけど機会があれば別に書く。

Coursera Machine Learningを修了しました。

とても今更なのですがAndrew Ng先生のMachine Learning | Courseraを修了しました。


社内SEからジョブポスティングでデータ分析に携わるようになり、機械学習についても独学で学んできたけど、理論についてきちんと学んでおきたいというのが受講のモチベーションとなります。


英語が不自由な自分にとっては5週目くらいまでは試行錯誤しながら進めていたため当初の計画よりも時間を要し、ネット上の評判ほど分かりやすいとも思えなかったのですが6週目意向、取り組み方が安定してからは周囲の評判に納得できました。先生の説明が悪いのではなく自分の要領が悪かったわけですね・・・


ということで自分の進め方を以下にメモしとくのでこれから受講される方の参考になれば。

  1. 講義ビデオを見る前に日本語字幕を読む
    • 講義ビデオの再生速度は変更できるとはいえ、字幕を見ながら板書?や数式を理解するのは厳しい。理解が曖昧なまま見終わってReview Quizで回答できず、またビデオを見直すという悪循環。。。あらかじめ日本語字幕を一通り目を通していれば字幕の切り替わりが早くても講義が理解しやすくなる。
  2. プログラミング課題に取り組む前に参考資料のLecture Notes, Errata, Programmingを読む
    • 第5週限定かもしれないが課題の指示通りに実装しているつもりでもなかなかパスできないことがある。一方、Errata, Programmingのヒントを一読してから取り組むとあっさりパスできたりする。



  • 第6週のバイアス・バリアンスは以前からTokyo.Rや朱鷺の杜Wikiでも見ていたものの、それぞれが高い場合どのような対応をとるべきか改めて知ることができた。
  • 第11週の機械学習パイプラインのCeiling分析も非常に参考になる。このようなことを教えてくれる機会はなかなかないのでは。
  • Octaveの良さは最後まで分からなかった。。。課題のPythonの実装はよく見るけど気が向いたら復習がてらRで実装してみる。

Uber H3のRインタフェース{h3forr}を試す

緯度・経度といった座標情報を集計して可視化するには総務省が定めた標準地域メッシュに加工することが多いが、Uberは矩形ではなく六角形グリッドを使用しているとのこと。


ドコモのAIタクシーは矩形のメッシュだが中国の配車サービスDiDiでも六角形グリッドが使用されているようで六角形グリッドの方が見た目がカッコいい。


Uberの六角形グリッドシステムH3はオープンソースで公開されており、Rのインタフェースについてもいくつか公開されている。


ここでは六角形グリッドを{sf}のポリゴンに変換までしてくれる{h3forr}を試してみる。


続きを読む