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

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

*

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

  関連記事

Node.jsでRaspberryPiのGPIOを使う(その1)デバイスドライバでLED

Node.jsでRaspberryPiのGPIOを使ってみます。今回はデバイスド …

温度センサADT7410(その1)i2C通信とは

温度センサのADT7410を使ってみます。ADT7410はアナログ・デバイセズ社 …

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

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

no image
ASP.NETユーザ管理(その8) 2要素認証

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

ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは

ASP.NET Web APIを利用してデータを蓄積する機能を実装してみたいと思 …

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

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

Raspberry Piでwifiに接続する

Raspberry Pi(Raspbian)でwifiを使って無線LANに接続し …

Raspberry Piでタッチスクリーン付3.5インチTFTを使ってみた

Raspberry Piでタッチスクリーン付モニタを使ってみました。PiScre …

ASP.NET Web APIでデータ蓄積の続き(その1)データ表示ページ

ASP.NET Web APIでデータ蓄積というテーマで以下から始まるシリーズを …

Node.jsでRaspberryPiのGPIOを使う(その2)ブラウザからの操作

Node.jsでRaspberryPiのGPIOを使うの2回目です。前回はGPI …