pythonでjsonから値を取り出す。

たとえば、TwitterAPIで使うkeyたちをjsonファイルで管理したい。

こんな感じのjsonファイルを作成する。

{
"api_key": {
"CONSUMER_KEY": "xxxxxxxxxx",
"CONSUMER_SECRET": "xxxxxxxxxx",
"ACCESS_TOKEN": "xxxxxxxxxx",
"ACCESS_TOKEN_SECRET": "xxxxxxxxxx"
}
}

下記のようにすると、jsonから値を取り出せる。

# モジュールのインポート
import json

# ファイルを開く
json_file = open('config.json', 'r')
# JSONとして読み込む
json_obj = json.load(json_file)

# 値の取り出し
CONSUMER_KEY = json_obj['api_key']['CONSUMER_KEY']
CONSUMER_SECRET = json_obj['api_key']['CONSUMER_SECRET']
ACCESS_TOKEN = json_obj['api_key']['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = json_obj['api_key']['ACCESS_TOKEN_SECRET']

個人の趣味とかだと設定値系はついつい直書きしてしまうので、ちゃんと外だしするくせをつけたい。

経緯

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


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


今回 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を設定する。

おうむ返し

メッセージをそのまま返してくれる。
repeat

▼ほぼ公式ドキュメントのまま

'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}`);

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

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

const moment = require('moment-timezone');

// 省略 //

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

本題
温度を問い合わせる


センサー接続

こんな感じ
raspberrypi

配線は、次のスライド記載のライブラリのREADMEから。


センサーからデータ取得

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

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 'わかんない';
}
}
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;
}

いざ「いまなんど」


きた

temperature1


にぎってみる

temperature2


ちょっと上がった

temperature3


まとめとか

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

おわり。