- サーバールームの温度測って、遠隔で確認したい。
- アラームとかあると助かる。
- AWS無料枠でできる(はず)?
必要なもの
- Raspberry Pi
- インターネットにつながる程度にはセットアップしておくこと
- 温度センサー
- DS18B20。アマゾンで五個で1,500円しないくらい
- 正しく接続できると、
/sys/bus/w1/devices/28-XXXXXXXXXXXX/temperature
で温度x1,000が読める - raspi-configで1-wireドライバを有効にして接続。詳細はググろう。
- AWSアカウント
前準備
RasPiにboto3(AWS SDK for Python)をインストールしておく
pip3 install boto3
AWS上にユーザーを作る
- IAMでユーザー作って、APIキーを取得しておくこと
- 以下のアクセス権限が必要
- AmazonAPIGatewayPushToCloudWatchLogs
- cloudwatch:PutMetricData
AWS CloudWatch APIを使うための、設定ファイルを作る
cronで回すので、回すユーザーのhomeに下記の内容のファイルを作ること
~/.aws/credentials
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = 秘密キー
~/.aws/config
東京リージョン。
[default]
region=ap-northeast-1
温度測定結果をAWS CloudWatchのメトリックとして放り込む
Python慣れてない。エラーハンドリングは適宜足して。
devsに温度計のデバイス名を辞書にして突っ込んでおく。
import boto3
import pathlib
def readTemp(id):
devpath="/sys/bus/w1/devices/"+id+"/temperature"
p=pathlib.Path(devpath)
temp=float(p.read_text())/1000
return temp
devs = {
"Temp1":"28-3c01d6072f18",
"Temp2":"28-3c01d6077511",
"Temp3":"28-3c01b6079c8d",
"Temp4":"28-3c01b607eb45",
"Temp5":"28-3c01b607b648",
"Temp6":"28-3c01b607cdb1"
}
metrics=[]
namespace="ROOM_TEMP"
for k in devs:
temp=readTemp(devs[k])
metric={'MetricName':k, 'Unit':'None', 'Value':temp}
metrics.append(metric)
cloudwatch = boto3.client('cloudwatch')
cloudwatch.put_metric_data(MetricData=metrics, Namespace=namespace)
RasPiのcronで回す
詳細は割愛。
とりあえず毎分更新にしてみた。
CloudWatch側で、メトリクスからグラフを作る
センサーがつながってスクリプトが正しく動いていたら、CloudWatch側で見えるようになる。
("Temp"は実験データの残骸。Pythonで放り込んだのはTemp1~6)
これを、ダッシュボードのウィジェットで可視化すると、こんな感じになる。
いいんじゃないでしょうか
宿題
- アラームでメール飛ばす方法を調べる
- AWS SNSとか使えばいいっぽい。