株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。新規開発案件のご依頼をお待ちしております。

*

ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

      2015/08/07

ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度データが登録出来るASP.NET Web APIが出来ました。今回はRaspbery Piに実際に温度センサを接続して温度データを蓄積してみます。今回使用する温度センサについては以下で書きました。
温度センサADT7410(その1)i2C通信とは
温度センサADT7410(その3)Raspbery Piでの利用

今回はRaspbery Pi上で動作するプログラムを書きます。pythonで取得した温度センサのデータをPostする部分を書きます。Raspbery Pi側は以下のような構成です。もちろん、ASP.NET Web APIのPCと同一ネットワークで通信出来ることが前提です。
IMG_0405

pipとrequetsのインストール
まずは、Raspbery Pi側での作業です。requestsをインストールするために先にパッケージマネージャのpipをインストールしました。以下がマニュアルです。
Installation pip 7.1.0 documentation
私の場合は結局は以下のページの方法を使いました。ありがとうございます。
いつの間にかpipのインストールが楽になってた件

以下です。
$ sudo curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
0001

このpipを使ってrequetsパッケージのインストールをします。requetsパッケージを利用してHTTPのPost通信を行います。他にもpythonでHTTP通信を実行する方法はありますが、このrequetsが簡単かと思いましたので使ってみます。
$ sudo pip install requests
0004

requestsでの動作確認
簡単なHTTPのGETでrequestsの動作確認します。以下のようなスクリプトを書きました。

import requests

def main():
    res = requests.get('http://www.example.com/')
    print res.text

if __name__ == '__main__':
    main()

以下のような結果が確認出来ました。
0003

要するにブラウザで表示すると以下のように表示されるページをGETしてレスポンスを表示するという処理です。
http://www.example.com/
0004

以上は簡単な例ですが、同様に前回のAPIのURLにJSON形式の温度データのパラメータと共にPOSTすればいいだろうということです。

IIS Expressでの外部からのアクセス
実際に温度データを取得してPOSTするスクリプトを書く前にASP.NET Web APIが動作するWindows側での作業です。

ASP.NET Web API開発時に利用出来るIIS Express(テスト用のWEBサーバ)はデフォルトでは他のコンピュータからはアクセス出来ないです。これをアクセス出来るように設定します。

以下のページを見ながら作業をしました。ありがとうございます。
IIS Express で localhost 以外からアクセスする方法

以下のファイルを編集します。
C:\Users\ユーザ名\Documents\IISExpress\config\applicationhost.config

Visual Studioで作成して実行したプロジェクトのサイト名になるURLが定義されています。これを探して外部からアクセス出来るホスト名を追加します。

<site name="ASPNETWebApiTemperature" id="16">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
         <virtualDirectory path="/" physicalPath="c:\users\nishi_000\documents\visual studio 2013\Projects\ASPNETWebApiTemperature\ASPNETWebApiTemperature" />
            </application>
                <bindings>
                    <binding protocol="http" bindingInformation="*:62205:localhost" />
                    <binding protocol="http" bindingInformation="*:62205:isydell.local" />
                </bindings>
</site>

追加したのは以下の行の部分です。

<binding protocol="http" bindingInformation="*:62205:isydell.local" />

次にVisual Studioでこのサイト名になるように設定します。Visual Studioのメニューから、[プロジェクト] の[(プロジェクト名)のプロパティ]で以下のように設定しました。
0005

以下のように権限を追加します。コマンド プロンプトを「管理者として実行」して実行します。(ここでのホスト名はAvahiでのホスト名です。)そのコマンドプロンプトで以下のようにを入力します。ホスト名とポート番号は私の場合です。必要な場合は読み替えて下さい。
netsh http add urlacl url=http://isydell.local:62205/ user=everyone

以上で私の環境では外部からアクセス出来るようになりました。

Raspberry PiからのPOST
温度センサを以下のページのように接続して温度が表示出来るか確認しておきます。
温度センサADT7410(その3)Raspbery Piでの利用

これを利用してrequestsとjsonを組み合わせて以下のようなスクリプトにしました。(※エラー処理等細かい部分は書いていません。動作は一切無保証です。)

#!/usr/bin/python
# -*- coding: utf-8 -*-

import smbus
import time
import requests
import json

def tempDataPost(tval):

    url = 'http://isydell.local:62205/api/TemperatureDatas'

    dtInit = '2015-01-01 00:00:00'

    tmpdata = {'DeviceId':100, 'TemperatureValue':tval, 'CreatedDateTime':dtInitt
}
    headers = {'content-type': 'application/json'}

    res = requests.post(url, data=json.dumps(tmpdata), headers=headers)

    #print res.json()
    
def adt7410():

    i2c = smbus.SMBus(1)
    address = 0x48

    block = i2c.read_i2c_block_data(address, 0x00, 2)

    val = block[0] << 8         #上位ビットをシフトしてセット
    val = val | block[1]        #下位ビットをORでセット
    val = val >> 3              #右へシフトで13ビット化

    # 以下プラス、マイナス判定をして温度を計算する

    if(val >= 4096):
        val = val - 8192

    print("Temperature:%6.2f" % (val / 16.0))

    return val

def main():

    while True:
        try:
            val = adt7410()
            tempDataPost(val/16.0)

        except:
            pass

        time.sleep(30)

if __name__ == '__main__':
    main()

30秒ごとに温度センサのデータを取得してASP.NET Web APIにPOSTしています。これで何とか動作しました。試しに2時間ほどですが蓄積してみました。開発用のデータベースから単純にExcelにコピーアンドペーストでデータをコピーしてチャート表示しました。
tmpchart1

2015年7月22日の23:30ごろから翌日の1:30ごろまでです。少しですが下降していくのが確認出来ました。これで何とか今回の大きなテーマであるASP.NET Web APIでデータ蓄積が確認出来ました。

応用的な内容はここからになると思いますが今回のシリーズはここまでです。また応用的な内容や関連する内容等書けたら書きます。
※2015/08/07 以下を書きました。
ASP.NET Web APIでデータ蓄積の続き(その1)データ表示ページ
ASP.NET Web APIでデータ蓄積の続き(その2)グラフ表示

今回のシリーズの一覧です。
ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは
ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築
ASP.NET Web APIでデータ蓄積(その3)ASP.NET ApiControllerクラス
ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView
ASP.NET Web APIでデータ蓄積(その5)ASP.NET Web APIテンプレートからの構築
ASP.NET Web APIでデータ蓄積(その6)ASP.NET Web APIでの動作確認
ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

その他関連サイト
Getting Started with ASP.NET Web API 2 (C#)
Using Web API 2 with Entity Framework 6
Entity Framework Code First の規約
Entity Framework Code First のデータ注釈
Entity Framework での新しいデータベース向けの Code First

Amazon関連商品


 - ASP.NET, Raspberry Pi

AdSense

AdSense

  関連記事

Raspberry Pi 3でモニタとキーボードなしで設定する方法

Raspberry Pi 3でモニタとキーボードなしで設定する方法についてです。 …

ASP.NET Web APIでデータ蓄積の続き(その2)グラフ表示

ASP.NET Web APIでデータ蓄積の続きの2回目です。前回は温度データを …

Raspberry PiでAvahi を使ってホスト名でアクセスする

Raspberry PiでAvahiを使ってホスト名でのアクセスを可能にする方法 …

no image
Microsoft AzureでASP.NETサイトを公開してみる(その3)Visual Studio EEからの公開

Microsoft AzureでASP.NETサイトを公開してみるの3回目です。 …

no image
ASP.NETユーザ管理(その4)ユーザ情報の追加

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の4回 …

無線マイコン ToCoStickのシリアル通信専用アプリを使ってみた

無線マイコンの ToCoStick(トコスティック)のシリアル通信専用アプリを使 …

no image
Microsoft AzureでASP.NETサイトを公開してみる(その2)ASP.NETサイトの作成

Microsoft AzureでASP.NETサイトを公開してみるの2回目です。 …

Raspberry Piでタッチアプリ開発(その2)Kivyの導入と動作確認

Raspberry Piでタッチアプリ開発の2回目です。前回はハードウェア構成や …

no image
Microsoft AzureでASP.NETサイトを公開してみる(その1)概要と開発環境

Microsoft Azureのサイト上で、ローカル環境で開発したASP.NET …

無線マイコン ToCoStick(トコスティック)をRaspberry Piで使ってみた

無線マイコンの ToCoStick(トコスティック)をRaspberry Piで …