LoginSignup
17
15

More than 5 years have passed since last update.

LINEでラズパイさんから家の温度を教えてもらう

Last updated at Posted at 2017-12-20
1 / 18

経緯

※この資料は、社内発表用に作成したものです。


そんな気がしたので
やってみた。


今回 RaspberryPiでやりたいこと

  • Node.js & センサーモジュールで室温しらべる。

環境

  • Raspbian GNU/Linux 8.0 (jessie)
  • 温度湿度センサー DHT11

準備

前出のハンズオン資料に従って準備。

RaspberryPi側に導入するもの

  • OSインストールとかSSH設定とかは割愛。
  • Node.js(今回は v9.2.0)
  • npm(今回は 5.5.1)
  • ngrok(RaspberryPiで立ち上げたサーバにアクセスする)

その他の準備

  • LINEのプロバイダー登録&ボット作成

RaspberryPiでサーバ起動&アクセス

  1. node server.js(ソースは後述)
  2. ngrok http ポート番号(1. のポートを指定)
  3. LINEのWebhookURLに 2. のURLを設定する。

おうむ返し

メッセージをそのまま返してくれる。
IMG_2521.PNG
▼ほぼ公式ドキュメントのまま

server.js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');

const PORT = process.env.PORT || 3000;

const config = {
    channelAccessToken: 'CHANNEL_ACCESS_TOKEN',
    channelSecret: 'CHANNEL_SECRET'
};

const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

function handleEvent(event) {
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    } 

    let mes = '';
    mes = event.message.text;

    return client.replyMessage(event.replyToken, {
        type: 'text',
        text: mes
    });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);


 キーワードごとに処理を分ける

「いまなんじ」で時間を教えてもらう。
IMG_2523.PNG

server.js
const moment = require('moment-timezone');

省略

if(event.message.text === 'いまなんじ') {
    mes = '現在の時刻は'+moment().tz("Asia/Tokyo").format('HH時mm分ss秒')+'です';
} else {
    mes = event.message.text;
}

本題
温度を問い合わせる


センサー接続

こんな感じ
PNG
配線は、次のスライド記載のライブラリのREADMEから。


センサーからデータ取得

node-dht-sensorというライブラリを使用。

raspi.js
const sensorLib = require('node-dht-sensor');

const sensor = {
    sensors: [ {
        name: "DHT11",
        type: 11,
        pin: 4
    } ],
    read: function() {
        const readout = sensorLib.read(this.sensors[0].type, this.sensors[0].pin);
        return '室内の温度は'+readout.temperature.toFixed(1)+'℃、'+'湿度は'+readout.humidity.toFixed(1)+'%です。';
    }
}

exports.getData = function() {
    try {
        return sensor.read();
    } catch (error) {
        return 'わかんない';
    }   
}
server.js
const raspi = require('./raspi');

省略

if(event.message.text === 'いまなんじ') {
    mes = '現在の時刻は'+moment().tz("Asia/Tokyo").format('HH時mm分ss秒')+'です';
} else if(event.message.text === 'いまなんど') {
    mes = raspi.getData();
} else {
    mes = event.message.text;
}

いざ「いまなんど」


きた

IMG_2524.PNG


にぎってみる

PNG


ちょっと上がった

IMG_2525.PNG


まとめとか

  • Node.js × LINE × IoT 良さげ。
  • ngrok便利。RaspberryPiのアクセス超簡単。
  • 次はエアコンつける機能もつけたい。
  • Node学園祭楽しかった。

おわり。

17
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15