Nature Remo + AWS Lambda + Mackerel で室温を記録してみた
暑くなってきたのでスマートホーム化していきたいなと思い、ひとまずNature RemoのAPIで遊んでみるか〜と、Nature Remo + AWS Lambda + Mackerel で室温を記録していくようにしてみたところ、以下のようなグラフになった。
冷房をかけたときに温度が下がったところ以外は常時27.4度前後で遷移していて、あまり変化がなくおもしろくはないグラフになったが、日中暑いときも全く室温に影響なくて、「鉄筋コンクリート造はさすがだなー!」と思った。 Nature Remoから室温を取得しMackerelにPOSTする関数を、Lambdaにアップロードし、CloudWatch Eventsをトリガーに10分毎に実行している。
コードは以下のようになった。Nature RemoとMackerelにはあんまりいいかんじのAPIクライアントがなさそうだったので、requestsライブラリを使ってがんばってAPIを叩いている。APIトークンは環境変数として出してあるので、コードを貼っても安心。
#!/usr/bin/env python3.7 # coding: UTF-8 import datetime import json import os import requests def get_room_temperature(): headers = { 'accept': 'application/json', 'Authorization': 'Bearer ' + os.environ['REMOTOKEN'], } response = requests.get('https://api.nature.global/1/devices', headers=headers) json = response.json() return json[0]['newest_events']['te']['val'] def post_service_metrics(temperature): headers = { 'accept': 'application/json', 'Content-Type': 'application/json', 'X-Api-Key': os.environ['MACKERELKEY'], } now = datetime.datetime.now() metrics = [ { 'name': 'Temperature.temperature', 'time': int(now.timestamp()), 'value': temperature } ] json.dumps(metrics), response = requests.post('https://api.mackerelio.com/api/v0/services/nature-remo/tsdb', json.dumps(metrics), headers=headers) print(response.json()) def lambda_handler(event, context): temperature = get_room_temperature() post_service_metrics(temperature)
AWS Lambda上で動かす関数で外部ライブラリを使っていた場合、そのライブラリもzipで固めてアップロードしないといけないので少しめんどう。先人のように、Goでやったほうがシングルバイナリになって、アップロードは楽そう。
$ mkdir packages $ cd packages/ $ pip install requests -t . $ zip -r9 ../function.zip . $ zip -g function.zip lambda_function.py
AWS Lambda触ったことなかったので、いい機会になってよかった。1か月に100万件のリクエストまで無料で、今回みたいな10分に1回リクエストを飛ばすくらいだと無料で使えるので、スマートホーム化していくに当たってバンバン活用していきたい。