(94) 【連載1-4】初ラズパイ: 温度データをSCPで周期転送

(94) 【連載1-4】初ラズパイ: 温度データをSCPで周期転送

1. やりたいこと

「はじめてのラズパイ!」をメモして行きたい。この連載の最終目標は、
ラズパイで周期温度報告端末装置(WiFi経由)を作る
こと。

(91) 【連載1-1】初ラズパイ: 選定&入手編 では、ラズパイを入手した。
(92) 【連載1-2】初ラズパイ: WiFiで繋ぐ では、ラズパイに WiFi経由でSSH接続した。
(93) 【連載1-3】初ラズパイ: 温度センサーをつなぐ では、ラズパイで温度値を取得した。

今回は、ラズパイで取得した温度値を、WiFi経由で周期的に SCP送信できるようにする。

2. 方針

今回は実装方針で少々迷っている。

(1) 実装方法の候補

候補1) 周期的に取得した温度値を単発で送信する。
候補2) 周期的に取得した温度値を記録した今日一日分の温度データを送信する。
候補3) 周期的に取得した温度値を記録したデータを基に作ったグラフデータ or 画像を送信する。

どれにしようか…

候補1)はあんまりにも単純で不親切か?
候補3)は過剰サービスか?
候補2)ぐらいがよいのか?

(2) 方針を決定

1) 1日 1ファイルを作成する。
2) 周期処理では、このファイルに「時刻、温度」を追記していく。
3) 周期処理では、このファイルを更新後に SCP転送する。

まずはこれでやってみよう。

3. やってみる

(1) シェルスクリプトを作成

crondで周期実行するシェルスクリプトを書く。

処理フローは以下の通り。
1) 最新温度を取得する。 (Shell)
2) 今日の温度記録ファイルに情報を追記する。(Python)
3) このファイルを SCP転送する。 (Shell)

update_temp.sh

#!/bin/sh
cd /home/piuser/temperature

TEMPFILE=/sys/bus/w1/devices/28-0000086e3f47/w1_slave
DATETIME=`date +%Y_%m%d_%H%M`
 
# 1) measurement (Shell)
TEMPRAW=`cat $TEMPFILE | grep -e "t=" | awk -F "t=" '{print $NF}'`
TEMPDEG=`echo $TEMPRAW | awk '{printf("%.1f", $1 / 1000)}'`
 
# 2) update file (Python)
python update_temp.py $DATETIME $TEMPDEG
 
# 3) send (Shell)
for FILE in `find . -type f | sort -r`; do
  scp -i ./.my_private_key.ppk $FILE hoge@example.com:~/temperature
  break
done
#end

(2) Pythonプログラムを書く

Pythonでは、周期起動時に最新の温度情報を 1日分の温度記録ファイルに保存する処理を実装する。

update_temp.py

import sys
import os
import numpy as np

#---------------------------------
# argv[1] : date "yyyy_mmdd_hhmm"
# argv[2] : temperature "sxxxxxx.x"
if __name__ == '__main__':
    ary_argv = sys.argv
    a_datetime = ary_argv[1].split('_')
    a_date = '%s_%s' % (a_datetime[0], a_datetime[1])
    a_time = a_datetime[2]
    a_temp = ary_argv[2]

    fpath = a_date + ".csv"

    if True == os.path.isfile(fpath) :
        tempData = np.loadtxt(fpath, delimiter=',', dtype='|S8', ndmin=2)
        tempData = np.append(tempData, [[a_time, a_temp]], axis=0)
    else :
        tempData = np.array([[a_time, a_temp]], dtype='|S8')

    np.savetxt(fpath, tempData, delimiter=',', fmt='%s')

(3) 単発で実行してみる

$ ./update_temp.sh

OKだ!
意図した通りに CSVファイルがアップロードされていた。

(4) crondで周期実行する

$ crontab -e

10分ごとに実行する。

*/10 * * * * /home/piuser/temperature/update_temp.sh

4. 所感

ひとまず…
ラズパイで収集した温度データを、周期的に別マシンに転送するところまでは出来た。

これで本連載は終わりでよいのか?
やけに尻すぼみな終わり方になってしまうが…

意図せず 1-Wireのおかげでデバイス制御プログラムの実装工数がゼロになってしまった。
デバイス制御を Pythonでガリガリ書くつもりだったがこれが叶わず、最後のファイル出力処理で無理やり Pythonの出番を作ったかのようになってしまった。

これが教育用デバイスであるラズパイの長所なのであろう。
とにかく敷居が低くとっつきやすいと感じた。

センサー等のいろいろなデバイスを容易に接続できる。
Linuxベースの OSを使えば無数のソフトウェア資源も使える。
きっと少ない工数でやりたいことを実現できるのだろう。

坂村さんが 「T-Engineでユビキタスコンピューティング」と盛んに仰っていた頃を思い出す。
IoTと名前を変え、今まさにそんな時代が本当に近づいているのだと感じる。

今回は尻すぼみで今一つ達成感の無い終わり方になってしまったが、またいつかラズパイに別のデバイスを接続して遊んでみようと思う。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*