Laravel5.3による環境センサー「BME280」の情報保存

Laravel5.3による環境センサー「BME280」の情報取得」で、raspberry pi 3からのBME280のセンサー情報をLaravel5.3で受け取れることが確認できました。今回はこの情報をDB「MySQL」に保存し、その保存したデータを一覧表示させます。

Eloquentモデルの定義

次のArtisanコマンドを使用して、Eloquentモデルを定義します。また同時に、データベースマイグレーションも生成します。

>php artisan make:model Senser -m
Model created successfully.
Created Migration: 2017_02_02_222021_create_sensers_table

次のモデル「Senser」がModelを拡張して、「\app\Senser.php」に作成されます。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Senser extends Model
{
    //
}

Eloquentモデルでは、テーブルは次のように想定して処理が行われます。

テーブル名
他のテーブル名を明示的に指定しない限り、「sensers」が使用されます。
主キー
Eloquentは更にテーブルの主キーがidというカラム名であると想定しています。主キーを自動増分される整数値であるとも想定しています。
タイムスタンプ
デフォルトでEloquentはデータベース上に存在するcreated_at(作成時間)とupdated_at(更新時間)カラムを自動的に更新します。

データベースのマイグレーションの生成

マイグレーションはデータベースのバージョンコントロールをします。前記の「Eloquentモデルの定義」でパラメータ「-m」を付けることにより、データベースマイグレーションがフォルダ「database/migrations」に生成されます。作成されたマイグレーション「2017_02_02_222021_create_sensers_table」は、実行順をフレームワークに知らせるために、名前にタイムスタンプが含まれ、次のようにupとdownの2メソッドを含みます。

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateSensersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('sensers', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('sensers');
    }
}

センサー情報を保存するために、upメソッドに次のカラムを追加します。

$table->float('pressure');
$table->float('temperature');
$table->float('humidity');

マイグレーションを実行するには、つぎのArtisanコマンドを使用します。マイグレーションを実行していないテーブルのみ実行されます。

>php artisan migrate
Migrated: 2017_02_02_222021_create_sensers_table

次のようにsensersテーブルがDBに作成されました。

sensersテーブルの作成

次のコマンドで、最後に実行したマイグレーションをロールバックできる。

>php artisan migrate:rollback

環境センサー「BME280」のセンサ情報の保存

Laravel5.3による環境センサー「BME280」の情報取得」で作成したController「SensersController」のアクション「saveInfo」を次のように変更し、json形式で受け取った環境センサ情報を、上記で作成したsensersテーブルに保存します。

use App\Senser;
   ...
public function saveInfo(Request $request) {
        Log::debug('saveInfo');
        var_dump($request->input());

        $senser = new Senser;
        $senser->pressure = $request->Pressure;
        $senser->temperature = $request->Temperature;
        $senser->humidity = $request->Humidity;
        $senser->save();

        $headers = [
            'Access-Control-Allow-Origin' => ' *',
        ];
        $response["status"] = "OK";
        return \Response::json($response, '200', $headers);
}

Chromeアプリ「DHC」でjson形式のセンサ情報の発生」で作成した「BME280」設定をsendして、json形式の環境データをLaravelに送信します。次のように、sensersテーブルに保存されます。

環境データのDBへの保存

保存したセンサ情報の一覧表示

Controller「SensersController」にアクション「index」を次のように追加して、アクション「index」で、DBに保存したセンサー情報を取得して表示します。

    public function index() {
        Log::debug('index');
        $sensers = Senser::all();

        foreach ($sensers as $senser) {
            echo "id:".$senser->id;
            echo " pressure:".$senser->pressure;
            echo " temperature:".$senser->temperature;
            echo " humidity:".$senser->humidity;
            echo " created_at:".$senser->created_at;
            echo " updated_at:".$senser->updated_at;
            echo "\n";
        }
        $headers = [
            'Access-Control-Allow-Origin' => ' *',
        ];
        $response["status"] = "OK";
        return \Response::json($response, '200', $headers);
    }

次のように、Controller「SensersController」にアクション「index」に対応するルートをroutes\web.phpに定義します。

Route::get(‘sensers/control’, ‘SensersController@index’)

ブラウザからURL「http://localhost/myjosh1/public/sensers/control」をアクセスすると、次のデータがブラウザに表示されます。

id:1 pressure:1011.01 temperature:20.03 humidity:47.44 created_at:2017-02-03 01:42:33 updated_at:2017-02-03 01:42:33
id:2 pressure:1011.01 temperature:20.03 humidity:47.44 created_at:2017-02-03 01:43:55 updated_at:2017-02-03 01:43:55
{“status”:”OK”}