Rasberry Pi 2で定期的に温湿度センサーの情報を送信する

/etc/crontabと/etc/cron.d設定ファイルの書き方を参考にプログラムの実行をスケジュール化する。
/etc/cron.d/send_temp
と登録し、下記を保存する。
#8~17時を除いた6~23時に毎時0時に送信する
0 6-7,18-23 * * * pi /home/pi/iot_source/send_temp.py 12> /home/pi/debug.txt
#土日は8~17時も毎時0時に送信する
0 8-17 * * 0,6 pi /home/pi/iot_source/send_temp.py 12> /home/pi/debug.txt
#5分ごとにセンサデータを収集する
*/5 * * * * pi /home/pi/iot_source/get_temp.py 12> /dev/null

Rasberry Pi 2で温湿度センサーの情報をZabbixサーバに送信する

Rasberry Pi 2で収集した情報をZabbixサーバに送信するためには大きくは2つの方法がある。
・Zabbixエージェントをインストールしてデータを送信(サーバから見ると収集)する方法(パッシブチェックとアクティブチェックというデータの収集のトリガーが異なる2つの方式がある。詳しくはこちら
・zabbix_senderコマンドを利用してデータをサーバに送信する方法
前者の方式は、エージェントを利用するので、サービスを常に起動しておかなければならないということと、ポートを待ち受けしないといけないことから、IoTディバイスとして節電して長く使いたい要求と、セキュリティを担保したい(エージェントの脆弱性によって問題が起こり得るか、DoS攻撃の対象になりうる)ことから後者を採用することにした。
ただ、zabbix_senderはRasberry Pi2を動かしているRaspianOSではちょっと導入が面倒。
Zabbix Server側の設定はこちらを参考にしてみるとよい。
これから始めるZabbix Sender(2) Raspberry Pi の温度データを送るには?
作成したソースはこんな感じ
配列に一度格納してまとめて1回のコマンドで実行することで通信回数を減らしてみた。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import dht11
import time
import subprocess
from datetime import datetime
now=time.time()
Zabbix_Server=”(ZabbixサーバのIPアドレス)”
Host_Name=”(Zabbixサーバに登録したホスト名)”
#Zabbixサーバに下記アイテムを2つ登録している必要がある
Temp_KeyName=”sender_temperature”
Humi_KeyName=”sender_humidity”
#define GPIO 14 as DHT11 data pin
Temp_sensor=14
try:
GPIO.setmode(GPIO.BCM)
instance = dht11.DHT11(pin = Temp_sensor)
while not ‘result’ in locals() or result.humidity==0:
result = instance.read()
if result.is_valid():
print(“Tem:”+str(result.temperature)+” C Hum:”+str(result.humidity)+”%”)
send_data = []
send_data.append(Host_Name + ” ” + Temp_KeyName + ” ” + str(int(now)) + ” ” + str(result.temperature))
send_data.append(Host_Name + ” ” + Humi_KeyName + ” ” + str(int(now)) + ” ” + str(result.humidity))
check = subprocess.check_call(‘echo “‘ + “\n”.join(send_data) + ‘” | zabbix_sender -z ‘ + Zabbix_Server + ” -T -i -“, shell=True)
except KeyboardInterrupt:
pass
finally:
print check

SSDドライブを最適化する

SSD(ソリッドステートドライブ)は、ハードディスクよりも高速にアクセスできるが、書き込み、消去頻度が高いとアクセス速度が落ちてしまう。
Linuxでは、fstrimコマンドを使用することでWindowsでいうところのデフラグを実行することが出来、アクセス速度向上が見込める。
コマンド例)
fstrim /dev/sda

パスワードを移行する

UNIXのパスワードはハッシュ化して保存されているので、利用者の人に再度登録をしてもらうか、パスワードファイルを移行するしかない。
今回、Fedore Core6(32bit)からCent OS5 (64bit)へ以下の手順で行ったところ、正しく移行ができた。
1. /etc/shadow は直接編集できないため、 /usr/sbin/pwunconv を実行して、shadowファイルを無効化する。
2. /etc/passwd にある :で区切られた2フィールド目(未設定の場合には!!が設定されている)の箇所を移行元のサーバーにある /etc/shadow の2フィールド目と同じ指定とする。
3. /usr/sbin/pwconv を実行して、shadowファイルを有効化する。(/etc/passwdで指定したパスワード設定が/etc/shadowに反映される)

時間が9時間進んで表示される

Linuxのタイムゾーンの指定は /etc/sysconfig/clock にある。
ZONE=”Asia/Tokyo”
UTC=false
ARC=false
ではなく、UTC=true となっているとハードウエアクロックがUTCだと認識して、システムクロックの時間をハードウエアクロックに9時間足して表示してしまう。
変更後はシステムを再起動する必要がある。