RaspberryPi3 de I2c SPI ZABBIX

Raspberry Pi3と秋月電子通商で調達した温度・温湿度センサをI2C SPIで接続をしてZABBIXサーバに記録する手順の備忘録。BME280で温湿度/気圧まで取得し完結をはかろうとしたけど値が暴れて断念。なにか構成に問題があるのかも、、

うまくいったらZeroで温湿度ロガーを作ろうと思う。 🙂 

準備編

・I2C/SPIの有効化

# uname -a
Linux ApplePi3 4.4.13-v7+ #894 SMP Mon Jun 13 13:13:27 BST 2016 armv7l GNU/Linux

# raspi-config

raspi_0000

raspi_0003

raspi_0004
raspi_0001

raspi_0002

raspi-configでi2cとspiを有効にするとconfig.txtも書き換わっている

# vi /boot/config.txt
# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on

# vi /etc/modules に追記
i2c-dev
ここで再起動

# apt-get install i2c-tools
# apt-get install wiringPi
# apt-get install python-smbus

構成

型番 購入先 接続 参考金額
本体 Raspberrypi3 ツクモロボット --- 5000以下
温度センサ ADT7420 秋月電子通商 I2C 500
温湿度センサ AM2320 秋月電子通商 I2C 600
温度センサ LM35DZ 秋月電子通商 SPI 120
ADコンバータ MCP3002 秋月電子通商 180
ブレッドボード EIC-801 秋月電子通商 --- 270
ジャンプワイヤ   秋月電子通商 ---  

raspi_board

ブレッドボード上に3個のセンサーを設置している

BoardLayout

Fritzing AM2320のデータが無いので代用している(白いセンサ)ブレッドボードの向きが180度違っている。Fritzingで書いて初めて気がついた。。。。

fritzing

デバイスアドレスが取得出来ていることを確認する

root@ApplePi3:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@ApplePi3:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- 5c -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

温湿度センサは休止モードとなっているため1回目では出現していない。目覚めた後の2回目で認識が確認できた。

・単体センサとしての値をとってみる(すべて先人のコピーです 多謝!)
ADT7420(温度センサー)

#vi adt7410.sh
/usr/sbin/i2cget -y 1 0x48 0x00 w | sed 's/0x\(..\)\(..\)/0x\2\1/g' | xargs printf "(%d/8)*0.0625\n" | bc | cut -c 1-5
# chmod +x adt7420.sh
# ./adt7410.sh
30.3750

LM35DZ+MCP3002(温度センサ+ADコンバータ)
ラズパイマガジンのソースをコンパイルしています 2015年春号項目21から

# ./adc_oneshot
30.937500

AM2320(温湿度)
こちらのam2321.cをコンパイルして使わせていただきました。多謝 温度 湿度の順で表示されます。

# gcc -o am2302 am2302.c
# ./am2320 -s
30.3 51.3
# ./am2320 -r
Temperature 30.6 [C]
Humidity 56.1 [%]

ZABBIXに取り込むためのデータ準備(数値だけにする)

# echo `./am2320`| cut -d' ' -f1
29.6
# echo `./am2320`| cut -d' ' -f2
47.6

ここまでに参考にさせていただいたサイト

RaspberryPi i2cgetでADT7410の温度を取得するコマンド

 

Zabbixへの送信 
エージェントを使わずにzabbix-senderをつかってZabbixサーバに送り込んでやる方法とした。ラズパイは極力シンプルにしておきたいことも理由の一つ。

ラズパイのCPUアーキテクチャ用バイナリプログラムはないのでソースからコンパイルする方法

http://www.zabbix.com/
http://www.zabbix.com/download.php

zabbix_source
https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.0.4/zabbix-3.0.4.tar.gz/download

zabbixユーザグループの作成

# groupadd zabbix
# useradd -g zabbix zabbix

https://www.zabbix.com/documentation/3.2/manual/installation/install

zabbix-3.0.3.tar.gz
ダウンロードしたSourceを/usr/local/srcに移動し解凍

# tar zxvf zabbix-3.0.3.tar.gz
# cd zabbix-3.0.3

マニュアルより zabbix_senderを使うときは--enable-agentのオプションをつかいますとある

Command-line utilities zabbix_get and zabbix_sender are compiled if --enable-agent option is used.

# ./configure --enable-agent
# make

makeのみでzabbix_senderが出来るのでmake installはやらないでおこう

マニュアルよりmake installするとzabbix_senderは/usr/local/binに格納される
Running make install will by default install the daemon binaries (zabbix_server, zabbix_agentd, zabbix_proxy)
in /usr/local/sbin and the client binaries (zabbix_get, zabbix_sender) in /usr/local/bin.

なのでバイナリを手動で上記フォルダ任意のフォルダにCopyする

# cd /usr/local/src/zabbix-3.0.3/src/zabbix_sender
# cp zabbix_sender /usr/local/bin
# cd /usr/local/bin/
# ls
 zabbix_sender

ZABBIXに送るための各種センサー値取得スクリプト(Webの切り貼り)
BME280の測定データは暴れるのでコメントアウト
zabbix_sender_cron.shとした

#!/bin/sh

#VariantSet
sv=192.168.1.19
cl="ApplePi3"

#LM+ADcon_Temperature
temp=$(echo `/usr/local/bin/adc_oneshot`)
echo "- SenderRoomTemperatureLM " $temp | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#ADT7240_Temperture
echo "- SenderRoomTemperatureADT "`/usr/sbin/i2cget -y 1 0x48 0x00 w | sed 's/0x\(..\)\(..\)/0x\2\1/g' | xargs printf "(%d/8)*0.0625\n" | bc | cut -c 1-5` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#AM2320_Temperature
echo "- SenderRoomTemperatureAM2320 " `/usr/local/bin/am2320 | cut -f1 -d ' '` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#AM2320_Humidity
echo "- SenderRoomHumidityAM2320 " `/usr/local/bin/am2320 | cut -f2 -d ' '` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#CPU CpuLoad 1min Ave
echo "- SenderCpuLoad01 "`cut -f1 -d ' ' < /proc/loadavg` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#CPU CpuLoad 5min Ave
echo "- SenderCpuLoad05 "`cut -f2 -d ' ' < /proc/loadavg` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#CPU CpuLoad 15min Ave
echo "- SenderCpuLoad15 "`cut -f3 -d ' ' < /proc/loadavg` | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#CPU Temperture
cputemp=$(echo `vcgencmd measure_temp` | sed -e 's/[^0-9,.]//g')
echo "- SenderCpuTemperature " $cputemp | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#CPU Clock
cpuclock=$(echo `vcgencmd measure_clock arm | sed -e "s/frequency(45)=//"`)
echo "- SenderCpuClock " $cpuclock | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -


#BME280_Pressure
#pressurebme=$(echo `/usr/local/bin/getBME -p` | sed s/Pa//g)
#echo "- SenderRoomAirPressureBME " $pressurebme | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#BME290_Humidty
#humiditybme=$(echo `/usr/local/bin/getBME -h` | sed s/%//g)
#echo "- SenderRoomHumidityBME " $humiditybme | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

#BME280_Temperature
#tempbme=$(echo `/usr/local/bin/getBME -t` | sed s/C//g)
#echo "- SenderRoomTemperatureBME " $tempbme | /usr/local/bin/zabbix_sender -z $sv -s $cl -vv -i -

Cronで1分間毎にZABBIXサーバに送る

# crontab -e


# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
#Zabbix
* * * * * /usr/local/bin/zabbix_sender_cron.sh 1>/dev/null 2>/dev/null

cronが正常に動いているか
# tail -f /var/log/syslog

Aug  1 15:41:01 ApplePi3 CRON[7533]: (root) CMD /usr/local/bin/zabbix_sender_cron.sh 1>/dev/null 2>/dev/null)

ZABBIXのグラフ設定後 AM2320による温湿度をグラフ化している
008

リアルタイムにグラフ作成してくれるのでとてもぃぃ。MRTGはたしかバッチ処理だったかと思う。

コメント