あなたのラズベリーパイ温度を保存するためにADonisjs APIを構築する方法



導入
私は家でいくつかのラズベリーパイ装置を持っています、そして、私は定期的に彼らの温度センサーからデータを集めて、Postgresデータベースにそのデータを格納することができたかったです.その後、私はいくつかの分析のためにそのデータを使用することができましたMaterialize .
このチュートリアルでは、adonisjsを使用して、センサーからデータを収集し、次の画像に示すようにPostgresデータベースに格納する簡単なAPIを構築します.

これは、多数のラズベリーPi装置の温度データを集めるのに用いられることができます.

必要条件
始める前に、以下のようにインストールされていることを確認する必要があります.
  • Install Node.js
  • Install Postgres

  • アドニス社とは
    adonisjsはノードです.フルスタックのWebアプリケーションと一緒にRESTful APIを作成するために使用されるJSフレームワーク.これは、任意のプラットフォームに展開できるWebアプリケーションを構築するための素晴らしいツールです.それはLaravelのように感じますが、それはノードに基づいています.PHPよりむしろ.
    あなたはadonisjs、心配していない場合は、まだ従うことができるだろう!しかし、adonisjsについてもっと知りたいなら、ここでこのチュートリアルをチェックしてください.
    AdonisJS for Beginners

    Adonisjsをインストールする方法
    adonisjsをインストールするには、次のコマンドを実行する必要があります.
    npm init adonis-ts-app@latest raspberry-pi-adonisjs-app
    
    一度実行すると、プロジェクト構造を選択するように求められます.あなたはAPI、Webアプリケーション、および最小限の可能なADonisJSアプリの間で選択することができます:
    CUSTOMIZE PROJECT
    ❯ Select the project structure …  Press <ENTER> to select
    ❯ api   (Tailored for creating a REST API server)
      web   (Traditional web application with server-rendered templates)
      slim  (A smallest possible AdonisJS application)
    
    このチュートリアルでは、APIオプションで行きましょう!矢印キーを使用してWebを選択し、Enterキーを押します.
    その後、プロジェクトの名前を選択するように求められますraspberry-pi-adonisjs-app しかし、別の名前を選択して自由に感じる.
    次に、Enterキーを押して、残りの設定にyesと答えます.
    ❯ Enter the project name · raspberry-pi-adonisjs-app
    ❯ Setup eslint? (y/N) · y
    ❯ Configure webpack encore for compiling front-end assets? (y/N) › y
    
    これが完了したら、新しいプロジェクトディレクトリに切り替えます.
    cd raspberry-pi-adonisjs-app
    
    そしてそこに一度、Webサーバを起動します.
    node ace serve --watch
    
    The ace コマンドはartisan laravelコマンドこれはadonisjsコマンドを実行するためのコマンドラインインターフェイスです.The node ace serve コマンドはウェブサーバを起動し、コードの変更を監視します.
    ACEコマンドの全てをチェックするには、次のコマンドを実行します.node ace .

    インストール
    ラーヴォエル雄弁に似て、ADonisjsはormを提供します.orlはlucidと呼ばれ、今日使用されます.
    明快なレコードのORM、クエリビルダ、移行、種子、工場が付属しています.
    Lucidをインストールするには、次のコマンドを実行します.
    npm i @adonisjs/lucid
    
    一度完了すると、簡単な設定を行う必要があります.

    Lucidの設定
    Lucidを設定するには、以下のACEコマンドを実行する必要があります.
    node ace configure @adonisjs/lucid
    
    使用するデータベースドライバを選択するように求められます.ここでは、PostgreSQLを選択してください!

    次に、設定手順を表示する場所を選択するように求められます.選んだIn the terminal , 必要な環境変数を出力します..env ファイル.
    確認してくださいDB_DATABASE and DB_USERNAME and DB_PASSWORD あなたの変数.env データベースに接続できるようにファイルを指定します.

    モードと移行を加えます
    モデルと移行を追加するには、次のコマンドを実行します
    node ace make:model Sensor -m
    
    これにより、新しいモデルとマイグレーションが作成されます.
    CREATE: database/migrations/1639847090390_sensors.ts
    CREATE: app/Models/Sensor.ts
    
    移行ファイルを開き、ファイルを更新します.
    import BaseSchema from '@ioc:Adonis/Lucid/Schema'
    
    export default class Sensors extends BaseSchema {
      protected tableName = 'sensors'
    
      public async up () {
        this.schema.createTable(this.tableName, (table) => {
          table.increments('id')
          table.string('device')
          table.string('temperature')
          table.string('timestamp')
          /**
           * Uses timestamptz for PostgreSQL and DATETIME2 for MSSQL
           */
          table.timestamp('created_at', { useTz: true })
          table.timestamp('updated_at', { useTz: true })
        })
      }
    
      public async down () {
        this.schema.dropTable(this.tableName)
      }
    }
    
    我々は基本的には、データの記録されたときに、デバイスの名前、温度、タイムスタンプを格納する3つの余分な列を追加しました.
    移行を実行するには、次のコマンドを実行します.
    node ace migration:run
    
    指定した列を使用してデータベースにセンサーテーブルを作成します.

    コントローラの作成
    次に、コントローラを作成します.これは、我々が我々のPostgresデータベースにラズベリーパイデータを保存できる機能を加えるところです.
    再び、我々は使用していますace 新しいコントローラを作成するコマンド
    node ace make:controller SensorsController
    
    これによりコントローラファイルが作成されます.
    app/Controllers/Http/SensorsController.ts
    
    次に、必要なルートを作成しましょう!

    メソッドの追加
    我々のRaspberry PI装置からデータを保存するためにこのAPIを使用するつもりで、我々はちょうど我々のコントローラに一つの方法を加えます.
    お気に入りのテキストエディタでSensorsController.ts ファイルを追加し、次のメソッドを追加します
    import Route from '@ioc:Adonis/Core/Route'
    import Database from '@ioc:Adonis/Lucid/Database'
    
    // import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
    
    export default class SensorsController {
        public async store ({ request }) {
    
            let name = 'raspberry-1';
            if (request.qs().name != null) {
                name = request.qs().name;
            }
    
            let timestamp = '2021-11-21 19:52:49';
            if (request.qs().timestamp != null) {
                timestamp = request.qs().timestamp;
            }
    
            let temperature = '41.1';
            if (request.qs().temperature != null) {
                temperature = request.qs().temperature;
            }
    
            console.log(name, timestamp, temperature)
    
            await Database
            .insertQuery()
            .table('sensors')
            .insert({ device: name, timestamp: timestamp, temperature: temperature})
    
            return {
                message: 'Successfully added sensor data'
            }
        }
    })
    
    ここで注意することはいくつかあります.
  • The import ステートメントはRoute and Database から@ioc:Adonis/Core/Route and @ioc:Adonis/Lucid/Database パッケージ.
  • The await キーワードを使用してデータベースクエリの終了を待機します.
  • The request.qs() メソッドからクエリ文字列パラメータを取得するために使用します.そのようにすれば、ラズベリーpiデバイスによって送られた名前、タイムスタンプ、および温度を得ることができます.

  • ADonisjsルートの作成
    あなたのルートファイルはstart/routes.ts . そこに我々のアプリケーションのURLを指定することができますし、さまざまなコントローラやメソッドにそれらをマップ!
    我々はまだ準備ができていません、しかし、我々は我々が以下のルートを必要とするということを知っています:
  • GET /temperature : このルートは、ラズベリーパイデバイスによって送られたデータを格納します.
  • ルートファイルをオープンしますstart/routes.ts そして、以下の内容を持つように更新します.
    import Route from '@ioc:Adonis/Core/Route'
    
    Route.get('/temperature', 'SensorsController.store')
    

    認証の追加
    このチュートリアルのために、APIが私のネットワーク上でローカルに動いていて、どんな敏感なデータも持っていないので、私は完全な認証を実装していないでしょう.
    しかし、この手順をさらに実行したい場合は、次の手順を実行します.
    AdonisJS Authentication Docs

    Raspberry PI装置へのcron仕事の追加
    我々はコントローラとルートを持っている今、我々は、APIにデータを送信し、我々のデータベースに格納するラズベリーパイデバイスにcronジョブを追加することができます.
    毎分実行する小さなbashスクリプトを作りましょう.
    #!/bin/bash
    
    # AdonisJS API URL - Make sure to change this to your API URL
    api_url="http://localhost:3333/temperature"
    
    # Specify the name of the Raspberry Pi device:
    name="raspberry-1"
    
    if [[ -z ${NAME} ]] ; then
        name="raspberry"
    fi
    
    # Get the temperature from the Raspberry Pi device:
    function temperature(){
        temperature=$(/opt/vc/bin/vcgencmd measure_temp | tr -d temp=\'C)
        echo ${temperature}
    }
    
    # Get the current time
    function timestamp(){
        time=$(date +%s)
        echo ${time}
    }
    
    echo ${name},$(timestamp),$(temperature)
    
    curl -X GET "${api_url}?name=${name}-${i}&timestamp=$(timestamp)&temperature=$(temperature)"
    
    あなたのadonisjs APIにURLを変えるようにしてください.あなたが同じラズベリーパイでこれを実行しているならば、あなたはそれを残すことができますlocalhost , そうでなければ、あなたはAPIを実行しているデバイスのIPを使用できます.
    スクリプトを保存するtemperature.sh 実行可能にします:
    chmod +x temperature.sh
    
    次に、あなたの編集crontab :
    sudo crontab -e
    
    次の行をあなたのcrontab :
    * * * * * /home/pi/temperature.sh
    
    スクリプトは毎分スクリプトを実行し、データをAPIに送ります.

    結論
    このチュートリアルのコードは、次のとおりです.
    AdonisJS API - Raspberry Pi Temperature
    このチュートリアルの2番目の部分として、APIによって収集されたデータについてのストリーミングSQLクエリを実行するには、Materializeを使用します.次の設定を行います.

    adonisjsについてもっと知りたいなら、ここでこのチュートリアルをチェックアウトすることをお勧めします.
  • Building a real-time web application with Materialize and AdonisJS
  • このチュートリアルをチェックしてください.
    Learn Materialize by running streaming SQL on your nginx logs
    希望がこれを助ける!