温度データをAWS CLIでDynamoDBに書き込む


概要

RaspberryPiに温度センサーを接続し、センサーデータをAWS CLIを使ってDynamoDBに書き込んで、IoT.kyoto VISで可視化します。
temp-dynamo

必要な機材

  • PC
  • RaspberryPi 2または3
  • micro USB電源
  • micro SDカード (8GB以上)
  • 温度センサーセット
    • DS18B20
    • 2.2kΩカーボン抵抗
    • ブレッドボード
    • ジャンパワイヤ オスーメス 3本

前提条件

  • AWSアカウントをもっていること。アカウント開設手順はこちら
  • RaspberryPiにRaspbianがインストール済みで、PCからSSHでログインまたはHDMI接続のモニタでターミナル操作ができること。手順はこちら。Raspbianは[Release date:2017-01-11]で動作確認しています
  • RaspberryPiがインターネットに接続できていること

[ToDo 0] RaspberryPiの準備

インターネット接続確認

RaspberryPiをインターネットに接続し、PCから有線LANまたはWi-Fi経由でSSH接続します。
RaspberryPiのIPアドレスが分からない場合は、こちらを参考にGUIやifconfigコマンド等で調べてください。下記の場合、192.168.0.209がRaspberryPiのIPアドレス(Wi-Fi)であることが分かります。
Wi-Fiを利用するのにwlan0にIPアドレスが割り当てられていない場合は、こちらを参考にWi-Fiアクセスポイントへの接続設定を行って下さい。

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr cc:e1:d5:4d:59:5e
          inet addr:192.168.0.209  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 2001:268:d006:d652::2/128 Scope:Global

wgetコマンドで適当なURLを打ってみればインターネットに接続できているか確認ができます。

 $ wget https://google.co.jp

--2016-03-23 17:53:19--  https://google.co.jp/
Resolving google.co.jp (google.co.jp)... 2404:6800:4003:809::2003, 106.162.198.104, 106.162.198.123, ...
Connecting to google.co.jp (google.co.jp)|2404:6800:4003:809::2003|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.google.co.jp/ [following]
--2016-03-23 17:53:30--  https://www.google.co.jp/
Resolving www.google.co.jp (www.google.co.jp)... 2404:6800:4007:805::2003, 106.162.192.173, 106.162.192.167, ...
Connecting to www.google.co.jp (www.google.co.jp)|2404:6800:4007:805::2003|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

index.html              [ <=>                  ]  18.90K  --.-KB/s   in 0.1s

2016-03-23 17:53:32 (130 KB/s) - ‘index.html’ saved [19358]

アップデートとvimのインストール

インターネット接続が確認できたら、下記を実行します。

$ sudo apt-get update
$ sudo apt-get install -y vim

[ToDo 1] APIアクセス用のKeyを作成する(AWS)

DynamoDBにAPIでアクセスするために、IAM Access Keyを作成します。 今回作成するのは下記にある2つのユーザーおよびそれにひも付くKeyです。

ユーザー名 アクセス権 使用箇所
dynamo-full AmazonDynamoDBFullAccess RaspberryPiからDynamoDBへの書き込み
dynamo-read AmazonDynamoDBReadOnlyAccess IoT.kyotoからDynamoDBへの読み出し
  • AWSにサインインする
  • Identity and Access Management(IAM)コンソールを開く
    ※ 英語画面で説明するので日本語表示になっている場合は、画面左下の言語選択を「English」に変更する

    AWS Management Console 2017-02-05 15-21-17.png


  • 「dynamo-full」という名前でProgrammatic accessユーザーを作成する

    IAM Management Console 2017-02-05 15-25-26.png



    IAM Management Console 2017-02-15 22-18-07.png


  • [Attach existing policies directly]をクリックし、[dynamo]で検索して、[AmazonDynamoDBFullAccess]にチェックを入れる
  • [Next: Review]をクリックする

    IAM Management Console 2017-02-15 22-20-06.png


  • [Create user]をクリックする

    IAM Management Console 2017-02-05 15-38-24.png


  • 認証情報の書かれたCSVをダウンロードし、[Close]をクリックする

    IAM Management Console 2017-02-05 15-41-43.png


  • 同様に「dynamo-read」ユーザーを作成してIDとKeyを取得し、[AmazonDynamoDBReadOnlyAccess]の権限をアタッチする

[ToDo 2] DynamoDBのテーブルを作成する

ここで設定した値は、[ToDo 5]で使うので、控えておいてください。

  • DynamoDBコンソールを開く
    ※ 英語画面で説明するので日本語表示になっている場合は、画面左下の言語選択を「English」に変更する

AWS Management Console 2017-02-15 22-15-58.png

  • リージョンが「Asia Pacific (Tokyo)」でない場合は変更する

DynamoDB · AWS Console 2016-04-02 16-55-11.png

  • [Create table]をクリックする

DynamoDB · AWS Console 2016-04-01 23-02-21.png

  • [Table name]に任意のテーブル名を入力する
  • [Partition key]にデバイスを識別するKey(今回は「ID」)を入力する
  • [Add sort key]にチェックを入れ、タイムスタンプのKey(今回は「time_sensor」)を入力する
  • [Create]をクリックする
    2cac7303-9534-19cf-1dd3-35c4a1a5cb98.png

[ToDo 3] AWS CLIをインストールする(RaspberryPi)

AWS CLIのインストール

pipコマンドでRaspberryPiにAWS CLIをインストールします。

$ sudo pip install awscli
(途中省略)
Successfully installed awscli botocore PyYAML docutils rsa s3transfer jmespath python-dateutil futures
Cleaning up...

AWS CLIの設定

CLIを実行する際のリージョンや認証情報を設定します。認証情報は[ToDo 1]でダウンロードした「dynamo-full」のCSVを参照します。

項目 入力内容
AWS Access Key ID (CSV参照)
AWS Secret Access Key (CSV参照)
Default region name ap-northeast-1
Default output format json
$ aws configure
AWS Access Key ID [None]: ************                    
AWS Secret Access Key [None]: ************
Default region name [None]: ap-northeast-1
Default output format [None]: json

[ToDo 4] 温度センサー回路を組み立てて温度を計測する(RaspberryPi)

1-wireデジタル温度センサーとは

RaspberryPiのGPIOはデジタル信号しか受け付けませんが、多くのセンサー類はアナログ信号を出力しますので、ADコンバーターを使って信号を変換する必要があります。今回使うデジタル温度センサーDS18B20は、1-wire規格に準拠しており、1本の信号線だけで低速なデジタルデータ転送を行うことができるので、回路が非常にシンプルになります。

温度センサー回路の組み立て

念のため、RaspberryPiをシャットダウンして回路を接続して下さい。
下記のパーツを図の通り配線し、RaspberryPiの電源をONにします。ジャンパワイヤの色は図の通りでなくてかまいません。

  • DS18B20
  • 2.2kΩカーボン抵抗
  • ブレッドボード
  • ジャンパワイヤ オスーメス 3本

DS18B20.png

RaspberryPiの設定

  • 1-wireデバイス用のモジュールを起動時に読み込むようにする
$ sudo vim /etc/modules

(最後尾に下記2行を追記する)
w1-gpio
w1-therm
  • 1-wireデバイスのGPIOに関する設定を記述する
$ sudo vim /boot/config.txt

(最後尾に下記1行を追記する)
dtoverlay=w1-gpio-pullup,gpiopin=4
  • リブート後、再度ログインする
$ sudo reboot

温度を読み出す

DS18B20は温度をファイルに書き込む仕様となっています。再起動すると/sys/bus/w1/devices/28-************/ (28-************は個体により異なるデバイスID)というディレクトリが作成されており、その中にw1_slaveというファイルが見つかるはずです。t=に続く5桁の整数を1000で割った数が温度(摂氏)です。
デバイスID 28-************[ToDo 5]で使うので控えておいてください

$ cd /sys/bus/w1/devices/
$ ls -l
total 0
lrwxrwxrwx 1 root root 0 Feb  6 01:28 28-************ -> ../../../devices/w1_bus_master1/28-************
lrwxrwxrwx 1 root root 0 Feb  6 01:28 w1_bus_master1 -> ../../../devices/w1_bus_master1
$ cd 28-************
$ cat w1_slave 
a7 01 55 00 7f ff 0c 10 22 : crc=22 YES
a7 01 55 00 7f ff 0c 10 22 t=26437

pi@raspberrypi: :sys:bus:w1:devices:28-0214642802ff — ssh pi@192.168.0.3 — 90×11 2017-02-06 01-32-30.png

[ToDo 5] シェルスクリプトで温度データをDynamoDBにput-itemする(RaspberryPi)

シェルスクリプトで一定時間ごとに温度を読み出し、AWS CLIを叩いてDynamoDBにput-itemします。
本スクリプトはエラー処理を考慮していません。プロダクションの場合は、当然エラー処理を考慮する必要がありますので、fluentdなどのミドルウェアを使うとよいでしょう。

スクリプトを実行する

$ cd ~
$ vim temp-dynamodb.sh
  • deviceid=のあとの28-************には、[ToDo 4]で控えた28-から始まるDS18B20のデバイスIDを入力する
  • tablename=のあとの*********には、DynamoDBのテーブル名を入力する

↓temp-dynamodb.sh↓

#!/bin/bash

# 第1引数がデータの送信間隔となる(デフォルトは15秒)
if [ "$1" = "" ]
then
        interval=15
else
        interval=$1
fi

# DS18B20のデバイスIDをdeviceidにセット
deviceid=28-************
# DynamoDBのテーブル名をtablemnameにセット
tablename=*********
# ノードのデバイスIDをidにセット
id=id001

while [ 1 ]
do
        (
                # 日時をtimeにセット
                time=`date '+%F %T'`
                # 温度を読み取り、tempにセット
                temp=$(awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/$deviceid/w1_slave)
                # 送信するJSON文字列を作る
                payload='{"ID": {"S":"'$id'"},"time_sensor": {"S":"'$time'"},"temperature": {"N":"'$temp'"}}'
                # JSONを画面に表示
                echo $payload
                # AWS CLIでput-itemする(消費キャパシティのレスポンスなし)
                aws dynamodb put-item --table-name $tablename --item="$payload"
                # AWS CLIでput-itemする(消費キャパシティのレスポンスあり)
                #aws dynamodb put-item --table-name $tablename --item="$payload" --return-consumed-capacity TOTAL
        ) &
        sleep $interval
done

シェルスクリプトを実行します。停止する場合はctrl + C。第1引数(下記では1)が送信間隔で、省略した場合は15秒間隔で送信されます。下記のようにエラーメッセージが表示されず、JSONが連続して表示されていたら成功です。

$ sh temp-dynamodb.sh 1
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:48"},"temperature": {"N":"30.437"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:49"},"temperature": {"N":"29.937"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:50"},"temperature": {"N":"29.562"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:51"},"temperature": {"N":"29.312"}}

DynamoDBのテーブルに書き込まれていることを確認する

スクリーンショット 2017-02-12 14.14.51.png

[ToDo 6] IoT.kyoto VISでグラフ表示する

ブラウザはChrome(Win/Mac)またはSafari(Mac)をお使い下さい。
vis.png

サインアップ

https://vis.iot.kyoto にアクセスし、「新規登録」をクリックします。

設定

IoT.kyoto VIS公式マニュアルの3~4章を参照してください。
AWSアクセス設定には、[ToDo 1]で作成した「dynamo-read」ユーザーのIAM Keyを使用します。
また、「AWS IoT連携」はOFFにしてください。(AWS IoT(という名前のサービス)から直接DynamoDBにデータを送る場合だけONにします)