前回でRaspberry Pi2に接続した水温計から温度を拾えるようになりました。
このデータをネット経由で確認することがゴールですが、ひとまずお手軽に
datadogでグラフを描画したいと思います。
datadogは本来はサーバ監視向けのサービスですが、任意の値を送ればそれもグラフ化してくれる上に、Web APIからも取得可能と、公開を考えなければグラフツールとしてもかなり使い勝手がよいです。
|
エージェントを導入するだけでこれだけのグラフが見られる。 |
datadog-agentの導入
datadogにデータを送信するため、datadog-agentをRaspberry Piにインストールします。
https://app.datadoghq.com/account/settings#agent/source
~/.datadog-agent/ に一式がインストールされますが、上記ページの説明によれば適当に移動できるとのこと。
エージェントの起動
cd ~/.datadog-agent
bin/agent start
この時点でCPUやメモリの使用率など、基本的なメトリクスはdatadogに送信されるようになりますが、流石に温度計のデータは拾ってくれません。
datadog公式のサンプルと、前回の温度を拾うスクリプトを組み合わせて、スクリプトをでっち上げます。
(thermo.py)
import os
import glob
import time
from datadog import initialize
from datadog import statsd
os.system('modprobe w1-gpio');
os.system('modprobe w1-therm');
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
# datadog client
options = {
'api_key':'API_KEY',
'app_key':'APP_KEY'
}
initialize(**options)
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
while True:
temperature = read_temp()
statsd.gauge('temperature', temperature)
print(temperature)
time.sleep(1)
このスクリプトを走らせることで、おおよそ1.2秒ごとに"temperature"という名前でdatadogに水温計から拾った値が送信されるようになります。
python thermo.py &
実際の表示
好きなdashboardにグラフを追加し、このようにグラフを設定します。
|
ホストとプロットしたい値を選択する。 |
至極いいかげんな説明ですが、直感的に操作できますので、迷うところはないと思います。
実に簡単にグラフができてしまいました。スマートフォンからdatadogを開けば、もう当初の目標、「遠隔地から水槽の水温を確認する」が達成できてしまいます。
datadog agentの自動起動設定
datadogをコマンド手打ちで起動するのは普段使いには辛いため、datadog agentをdaemon化しよう…と思い、~/.datadog-agent/bin/agentの中身を見たところ、もともとsupervisorで走るようになっていました。
PIDファイルの取扱なども公式の起動スクリプトがやってくれるので、initは非常に単純になります。
(/etc/init.d/datadog-agent)
#! /bin/sh
### BEGIN INIT INFO
# Provides: datadog-agent
# Short-Description: Start and start datadog-agent
# Description: datadog-agent is the monitoring Agent component for Datadog
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
DD_BASE="/home/hoge/.datadog-agent/"
case $1 in
start)
cd $DD_BASE
bin/agent start
;;
stop)
cd $DD_BASE
bin/agent stop
exit 0
;;
restart)
cd $DD_BASE
bin/agent stop
bin/agent start
exit 0
;;
esac
exit 0
起動時にこのスクリプトを走らせるように設定し、Raspberry Pi側の作業は一旦完了です。
sudo update-rc.d datadog-agent defaults
ついでに水温を収集するスクリプトもsupervisorを使ってdaemon化しておきました。
[program:thermometer]
command=python /home/hoge/thermo.py
redirect_stderr=true
priority=1000
これで電源を投入すれば温度が取れる、というところまではこぎ着けました。
コメント
コメントを投稿