Raspberry Piで水温計を作る(2)



前回で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

これで電源を投入すれば温度が取れる、というところまではこぎ着けました。

コメント

このブログの人気の投稿

Raspberry Piで水温計を作る(1)