11.Amazon AWS DynamoDB にセンサの計測値を記録

前へ 目次 次へ

Raspberry Pi から Amazon AWS DynamoDB にセンサの計測値を記録するPHPプログラムを作成します。

今回はセンサの値にプラスして、Raspberry Pi 機器の稼働環境情報も一緒に記録します。

CPUの使用率を計算するシェルプログラムを作成します。

$ nano /home/pi/pgm/awsphp/cpu.sh

</code>
#!/bin/bash
CUR=/proc/stat
USER=$(whoami)
PRE=/tmp/${USER}-prestat
if [ ! -f $PRE ]; then
  head -1 $CUR > $PRE
  exit 1
fi
awk '
  /cpu /{
        if (match(FILENAME,"prestat")) {
                pretotal = $2+$3+$4+$5; preidle = $5;
        } else {
                ctotal = $2+$3+$4+$5; cidle = $5;
        }
  }
  END {
        dtotal = ctotal - pretotal
        didle = cidle - preidle
        printf("%d",(((dtotal - didle) * 100) / dtotal),37)
  }
' $PRE $CUR
head -1 $CUR > $PRE
<code>


データを DynamoDB にアップするPHPプログラムを作成します。

$ nano /home/pi/pgm/awsphp/DataUp.php

</code>
#!/usr/bin/php
<?php

// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');
use Aws\Common\Aws;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// データ取得
$cputemp   = "999";        // CPU温度
$cputempky = "99999";
$com = "cat /sys/class/thermal/thermal_zone0/temp";
exec($com, $res1);
if(isset($res1[0])){
    $cputempky = trim($res1[0]);
    $cputemp = intval($cputempky) / 1000;
}

$cpuused = "0";        // CPU使用率
$com = "/home/pi/pgm/awsphp/cpu.sh";
exec($com, $res2);
if(isset($res2[0])) $cpuused = $res2[0];

$memused = "0";        // メモリ使用率
$com = "cat /proc/meminfo | awk '/MemTotal/ {printf($2)}'";
exec($com, $res3);
$com = "cat /proc/meminfo | awk '/MemFree/ {printf($2)}'";
exec($com, $res4);
if(isset($res3[0]) && isset($res4[0])) $memused = round((($res3[0] - $res4[0]) / $res3[0] * 100), 1);

$airtemp = "999";        // 温湿度
$airhum  = "999";
$res5    = array();
$com = "sudo /home/pi/pgm/awsphp/temp_hum2";
exec($com, $res5);
if(isset($res5[1])) $airhum  = trim($res5[1]);
if(isset($res5[3])) $airtemp = trim($res5[3]);

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-CPU-TEMP";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;    // Range Key(時日)
$RangeKey02 = $cputempky.$RangeKey;                                                                // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;                    // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                        // Range Key(データID+時刻)

// Dynamo へのデータ保管処理
$data = array();
try{
    
    // Key
    $data['HashKey']    = $HashKey;            // Hash Key(データID)
    $data['RangeKey']   = strval($RangeKey);   // Range Key(日時)
    $data['RangeKey01'] = strval($RangeKey01); // Range Key(時日)
    $data['RangeKey02'] = strval($RangeKey02); // Range Key(結果値順)
    
    $data['HashKey01']  = strval($HashKey01);  // Hash Key(データID)
    $data['RangeKey03'] = $RangeKey03;         // Range Key(日時)
    
    // Data
    $data['datetime']  = $datetime;
    $data['cpu_temp']  = "".$cputemp;
    $data['cpu_unit']  = "*C";
    $data['cpu_used']  = "".$cpuused;
    $data['cpu_unit2'] = "%";
    $data['mem_used']  = "".$memused;
    $data['mem_unit']  = "%";
    
    // Save
    $result = $dynamo->putItem(array(
        'TableName'              => $dynamoTbl,
        'Item'                   => $dynamo->formatAttributes($data),
        'ReturnConsumedCapacity' => 'TOTAL'
    ));
    
    if($airtemp != "999" || $airhum != "999"){
        $data = array();
        
        // Key
        $data['HashKey']    = "D001-AIR-TEMP";     // Hash Key(データID)
        $data['RangeKey']   = strval($RangeKey);   // Range Key(日時)
        $data['RangeKey01'] = strval($RangeKey01); // Range Key(時日)
        $data['RangeKey02'] = $airtemp.$RangeKey;  // Range Key(結果値順)
        
        $data['HashKey01']  = strval($HashKey01);                                  // Hash Key(データID)
        $data['RangeKey03'] = $data['HashKey'].strval($h * 10000 + $i * 100 + $s); // Range Key(日時)
        
        // Data
        $data['datetime']   = $datetime;
        $data['air_temp']   = "".$airtemp;
        $data['temp_unit']  = "*C";
        $data['air_hum']    = "".$airhum;
        $data['hum_unit']   = "%";
        
        // Save
        $result = $dynamo->putItem(array(
            'TableName'              => $dynamoTbl,
            'Item'                   => $dynamo->formatAttributes($data),
            'ReturnConsumedCapacity' => 'TOTAL'
        ));
    
    }
    
// エラー発生時はSQSに保管
} catch (DynamoDbException $exc2) {
    $sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}
?>
<code>


後は cron で実行するだけです。

前へ 目次 次へ

広告

About Yukihito Kataoka
@ykataoka

現在コメントは受け付けていません。

%d人のブロガーが「いいね」をつけました。