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

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

ASP.NET Raspberry Pi

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

投稿日:2015年7月24日 更新日:

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関連商品


AdSense

AdSense

-ASP.NET, Raspberry Pi

執筆者:

関連記事

Raspberry Piでセンサネットワーク稼働試験(AWS SORACOM編)構成・課題等

Raspberry Piでセンサネットワークを構築して実際に稼働してみます。今回は、AWS SORACOM編として通信モジュールにSORACOMの3G対応データ通信端末 AK-020を使用してAWSに …

no image

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

Microsoft AzureでASP.NETサイトを公開してみるの2回目です。今回は、前回インストールした Visual Studio Express 2013 for Web を使ってローカル環境 …

Raspberry PiでIoT(温度・湿度・気圧データ編 その3)データ表示とグラフ表示

Raspberry PiでIoT 温度・湿度・気圧データ編の3回目です。前回までで、Raspberry Piから温度、湿度、気圧データをWebサーバへ送信してそのデータを蓄積出来るようになりました。今 …

Raspberry Piをモニターとキーボードなしで導入する(その2)初期設定とリモートデスクトップ

(※2021/05/02追記 現時点で最新版のRaspberry PI OSでモニターとキーボードなしで導入する手順を書きました。ぜひこちらを見て下さい。) Raspberry Piをモニターとキーボ …

Raspberry Piでタッチアプリ開発(その3)Kivyでレイアウト・ボタン作成

Raspberry Piでタッチアプリ開発の3回目です。前回はKivyの導入について書きました。今回は具体的なレイアウトとボタンを配置してみます。以下のレイアウトについて順番に書きます。Kivyでのレ …