概要
データを簡単に可視化できるサービス「Ambient」にシェルスクリプトからデータを送信する方法を示します。(あまり需要はなさそうですが)
背景
ベランダのプランターでオクラとバジルを育て始めたので、自動で水やりをするシステムをRaspberry Pi Zero W(以下RPi)とポンプを使って作りました。
ところで、「日中に水やりをすると、土の中の温度が上がり植物に良くない」とよく言われますが、「水を撒けば水そのものの温度や気化熱で、かえって温度は下がるのでは?」と疑問を持ったので、実際に測定してみることにしました。
ついでにRPiのCPUコア温度もモニタリングし、RPi自身の状態の参考にします。
使った機材
- Raspberry Pi Zero W
- DS18B20の温度計
https://www.aliexpress.com/item/32676135779.html
方法
以下にシェルスクリプトを示します。
# !/bin/bash
# チャネルID
channelId="*****"
# ライトキー
writeKey="*****"
url="http://ambidata.io/api/v2/channels/${channelId}/dataarray"
# 1-Wire温度センサから温度を取得
soil_temp="$(grep -m1 "t=" /sys/bus/w1/devices/28*/w1_slave | sed -r 's/.*t=([0-9]{2})([0-9]+)$/\1\.\2/')"
# CPUコア温度を取得
cpu_temp="$(awk '{print $1 / 1000.0}' /sys/class/thermal/thermal_zone0/temp)"
data_text='[{"d1":"'${soil_temp}'","d2":"'${cpu_temp}'"}]'
curl -H 'Content-Type:application/json' \
-d '{"writeKey":"'${writeKey}'", "data":'${data_text}'}' \
${url}
処理の流れ:
-
channelId
,writeKey
,url
を設定します。 - 1-Wire接続の温度センサDS18B20から温度を取得して
soil_temp
に格納します。1-Wireのデバイスは/sys/bus/w1/devices
以下にデバイス毎のディレクトリとして認識されますが、温度センサであればディレクトリ名は28から始まります。grep
で28から始まるディレクトリにある、w1_slave
中のt=
の行を抜き出します。-m1
は、結果が複数あっても1行だけ結果を返すオプションです。sed
ではt=
以降の温度部分を抜き出しています。温度は5桁の整数で渡されるので、先頭2桁とそれ以降に分けて、間に.
をつけることで擬似的に小数に変換しています。
3.CPU温度を取得してcpu_temp
に格納します。awkコマンドで/sys/class/thermal/thermal_zone0/temp
から取得したCPU温度を1000で割って小数にしています。
4.取得したsoil_temp
とcpu_temp
をjsonフォーマットに整形してdata_text
に格納します。 - curlコマンドでambient宛にデータをPOSTします。
writeKey
でライトキーを渡してやります。
実行した結果
以下で確認出来ます。
https://ambidata.io/bd/board.html?id=15241
上記のスクリプトをcronで定期実行しています。