Nature Remo + AWS Lambda + Mackerel で室温を記録してみた

暑くなってきたのでスマートホーム化していきたいなと思い、ひとまずNature RemoのAPIで遊んでみるか〜と、Nature Remo + AWS Lambda + Mackerel で室温を記録していくようにしてみたところ、以下のようなグラフになった。

f:id:TAKEmaru:20190608014237p:plain

冷房をかけたときに温度が下がったところ以外は常時27.4度前後で遷移していて、あまり変化がなくおもしろくはないグラフになったが、日中暑いときも全く室温に影響なくて、「鉄筋コンクリート造はさすがだなー!」と思った。 Nature Remoから室温を取得しMackerelにPOSTする関数を、Lambdaにアップロードし、CloudWatch Eventsをトリガーに10分毎に実行している。

f:id:TAKEmaru:20190608014440p:plain

コードは以下のようになった。Nature RemoとMackerelにはあんまりいいかんじのAPIクライアントがなさそうだったので、requestsライブラリを使ってがんばってAPIを叩いている。APIトークンは環境変数として出してあるので、コードを貼っても安心。

github.com

#!/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回リクエストを飛ばすくらいだと無料で使えるので、スマートホーム化していくに当たってバンバン活用していきたい。