My Note

自己理解のためのブログ

AWS Lambda ( Go )でNatureRemoのセンサー情報をMackerelで可視化・監視して、アラートをLINEに通知してみた

やったこと

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

  • AWS Lambda + Mackerel + Go でNatureRemoのセンサー情報を可視化する
    • 気温・湿度・照度をグラフ化する
  • メトリクスを監視してLINEにアラート通知をする

ソースコード ( GitHub )

github.com

NatureRemoについて

  • NatureRemoとは

nature.global

  • API (swagger)について

swagger.nature.global

local.swagger.nature.global

home.nature.global

  • NatureRemoのAPI-Keyを取得する

f:id:yhidetoshi:20190621081632p:plain

まずは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でデバイスのセンサー情報を取得する

■ 以前のブログで記載済み

yhidetoshi.hatenablog.com

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

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

github.com

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

yhidetoshi.hatenablog.com

■ 気温を指定したサービスに投稿する部分を抜粋 ( 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にデータを投稿する

AWS 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を確認する。

f:id:yhidetoshi:20190621081907p:plain

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

f:id:yhidetoshi:20190621081934p:plain

■ 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) を設定する

f:id:yhidetoshi:20190621082005p:plain

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にメトリクスを投稿した結果

f:id:yhidetoshi:20190621082039p:plain

NatureRemoの値をMackerelで監視・LINE通知した結果

■ LINEに通知するチャンネルを作成

f:id:yhidetoshi:20190621082110p:plain

■ Mackerelで監視ルールを作成

f:id:yhidetoshi:20190621082135p:plain

■ アラートを発生させてLineに通知を送った結果

f:id:yhidetoshi:20190621082201p:plain

まとめ

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