IoT機器のNatureRemoを購入した。このデバイスはテレビやエアコンなどの家電を登録すると赤外線通信で制御ができる。私の場合は、主にテレビの操作をスマホでしたかった & NatureRemoを利用してGoで開発するために買ってみた。

やったこと

  • AWS Lambda + Mackerel + Go でNatureRemoのセンサー情報を可視化する
    • 気温・湿度・照度をグラフ化する

ソースコード ( GitHub )

NatureRemoについて

natureremo-key

まずはAPI ( curl ) でデバイスのセンサー情報を取得してみる

  • APIのエンドポイント(URL)

    • https://api.nature.global/1/devices
  • curlで取得する

    • curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer <TOKEN>"
  • response結果

[
    {
        "name":"リビング",
        "id":"XXXXX",
        "created_at":"2019-04-20T12:49:11Z",
        "updated_at":"2019-04-26T14:35:59Z",
        "mac_address":"XXXXX",
        "serial_number":"XXXXX",
        "firmware_version":"Remo/1.0.77-g808448c",
        "temperature_offset":0,
        "humidity_offset":0,
        "users":[
            {
                "id":"XXXXX",
                "nickname":"XXXXX",
                "superuser":true
            }
        ],
        "newest_events":{
        "hu":{
                "val":40,
                "created_at":"2019-04-27T04:34:06Z"
            },
        "il":{
                "val":234.6,
                "created_at":"2019-04-27T05:20:55Z"
             },
        "te":{
                "val":26.39,
                "created_at":"2019-04-27T04:38:10Z"
             }
        }
    }
]
  • 湿度を取得する
curl -sS -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer <TOKEN>" | jq '.[].newest_events.te.val'

22.79

  • 湿度を取得する
curl -sS -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer <TOKEN>" | jq '.[].newest_events.hu.val'

50

Goでデバイスのセンサー情報を取得する

  • 別記事で記載済み
    • タイトル: GoでnatureRemoのAPIレスポンス ( JSON ) をパースする

Mackerelにカスタムメトリクスを投稿する

  • mackerel-client-goを利用して取得データ(気温・湿度・照度)を投稿する。

  • GoでMackerelにメトリクスを投稿する方法は別の記事で記載済み

    • タイトル: Go ( mackerel-client-go ) を利用してMackerelにカスタムメトリクスをPostする
  • 気温を指定したサービスに投稿する部分を抜粋 ( main.go )

        // Post Temperature
	err_tem := client.PostServiceMetricValues(serviceName, []*mackerel.MetricValue{
		&mackerel.MetricValue{
			Name:  "Temperature.temperature",
			Time:  nowTime.Unix(),
			Value: tem,
		},
	})
	if err_tem != nil {
		fmt.Println("Error post tem")
	}

AWS LambdaにGoコードをデプロイしてMackerelにデータを投稿する

まず、Lambdaを作成する
  • Lambdaの設定

    • ランタイムはGo 1.x
    • メモリ: 128MB
    • タイムアウト: 5s
    • ネットワーク: 非VPC
    • ハンドラ: main
    • CloudWatch-Event連携
    • 環境変数
    • TZ: Asia/Tokyo
    • MKRKEY: mackerel_api_keyをセット
    • REMOTOKEN: natureRemoトークン
  • MackerelのAPI-KEYをLambdaの環境変数にセットする。

    • MackerelのAPI-KEYを確認する。

mackerel-key

Lambdaのランタイム・ハンドラと環境変数

lambda-env

  • main.go ( 一部抜粋 )
var (
	url    = "https://api.nature.global/1/devices"
	token  = os.Getenv("REMOTOKEN")
	mkrKey = os.Getenv("MKRKEY")
	client = mackerel.NewClient(mkrKey)
)

CloudWatch-Eventで定期実行させる

  • スケジュール式: rate(3 minutes) を設定する

lambda-cloudwatch-event

次に、awsコマンドでLambdaにGoコードをデプロイする
$ git clone https://github.com/yhidetoshi/natureRemo-mackerel
$ cd natureRemo-mackerel
$ make setup cross-build
$ zip -j deployment.zip ./build/pkg/main_linux_amd64/main
$ aws lambda update-function-code --function-name ${LAMBDA_FUNCTION_NAME} --zip-file fileb://deployment.zip --region ap-northeast-1

※ aws-cliが実行できる必要があります。/ ${LAMBDA_FUNCTION_NAME} に関数名をセットする。

Mackerelにメトリクスを投稿した結果

natureremo-mackerel

まとめ

NatureRemoのセンサー情報である温度、湿度、照度を AWS LmabdaとMackerelとGoを使って可視化する方法を紹介しました。MackerelはFreeプランなので、24時間までしかデータを残せないですが、監視もできるし、1日の変化を確認できるので十分です。今回はAWSのLambdaを利用しましたが、cloud-functionやGAEなどGoogle Cloudのリソースを利用して実行させてみたいと思います。