はじめに
grafanaを触ってみたいなーってずっと思ってたので、たまたま家にあるNature Remoからリビングの室温を取得し、grafanaで可視化してみた。って記事です。
作ったもの
作ったものはこんな感じです。
構成図
サーバレスかつ、ほぼコードレスな仕組みにしてみました。
本当は室温データはAmazon Timestream for LiveAnalyticsで実現してみたかったのですが、すでに新規受付終了してましたので、今回はカスタムメトリックスで実現してみます。
処理概要
- 30分おきにStep Functionsのステートマシンを呼び出し
- Step Functionsでは以下を実施
- Nature Remo Cloud APIから室温を取得
- 室温をCloudWatchのメトリックスへ送信
- 送信したMetricをMacBook上のコンテナ内で動作しているGrafanaで表示
説明
各モジュール毎に工夫したことや、苦労したことを少しまとめておきます。
Nature Remo Cloud API
Nature Remoは、センサーから取得したデータを取得するAPIが公開されています。
認証はWEB上から取得したAPIキーをベアラトークンに指定する方法です。
詳細な仕様は以下に公開されています。
今回はhttps://api.nature.global/1/devicesを使います。
以下のようなレスポンスが取得でき、私が持っている端末(Remo-mini)では温度のみ取得可能です。
[
{
"name": "living",
"id": "xxxxxxx-1b43-4a3f-9b04-6e121a54104d",
"created_at": "2020-11-29T05:48:58Z",
"updated_at": "2025-08-30T05:43:08Z",
"mac_address": "f4:cf:a2:dd:78:ff",
"serial_number": "2S0924603",
"firmware_version": "Remo-mini/2.0.62-gf5b5d27",
"temperature_offset": 0,
"humidity_offset": 0,
"users": [
{
"id": "xxxxxxx-7dd0-4beb-9bb4-6efd3f22ed78",
"nickname": "hoge",
"superuser": true
}
],
"newest_events": {
"te": {
+ "val": 25.5,
"created_at": "2025-08-31T02:47:42Z"
}
}
}
]
なお、温度はリアルタイムでは取得できず、0.5°くらいの変化がないとデータが更新されないみたいでした。
Step Functions
とってもシンプルです。API叩いてその結果をカスタムメトリックスに送信するだけです。
Call NatureRemo API
JSONataを利用し、レスポンスボディを変数に格納しています。
便利〜!
{
"name": "{% $states.result.ResponseBody[0].name %}",
"temperature": "{% $states.result.ResponseBody[0].newest_events.te.val %}"
}
なお、ベアラ認証が必要なので、EventBridgeのAPIの送信先を登録しておきます。
今回のケースだけでいうと、少し面倒な感じもしますが、このAPIを複数システムから呼び出すときなどは、EventBridgeのに一度登録しておけば認証周りを意識しなくて良いので、楽かもです。
また、認証情報はきちんとAWS Secrets Managerに保管してくれてそうです。
PutMetricData
名前空間とメトリックス名が冗長な感じもしますが、以下のようにメトリックスを送信しています。
変数便利。
{
"Namespace": "MyHome/Temperature",
"MetricData": [
{
"MetricName": "RoomTemperature",
"Value": "{% $temperature %}",
"Dimensions": [
{
"Name": "Room",
"Value": "{% $name %}"
}
]
}
]
}
Grafana on MacBook Container
AWSにはAmazon Managed Grafanaってサービスが存在しますが、コストの関係で今回はローカル環境で構築してみることにしました。
また今回は、dockerではなく、macOSで今後搭載予定のContainerで構築します。
containerインストーラ
まずはインストールから。
Homebrew、またはGithubのページからインストールします。
私が試したバージョンは0.4.1でした。
% container --version
container CLI version 0.4.1 (build: release, commit: 4ac18b5)
あと、使いそうなコマンドもまとめておきます。
| 用途 | コマンド |
|---|---|
| コンテナの停止 | container stop grafana |
| コンテナの破棄 | container rm grafana |
| コンテナ内のターミナル操作 | container exec -it grafana bash |
Grafana構築
Grafanaは以下のコマンドで構築してみました。
% container run -d -p 3000:3000 --name=grafana \
--volume "$PWD/grafana-data:/var/lib/grafana" \
--volume "$HOME/.aws:/usr/share/grafana/.aws:ro" \
-e "AWS_PROFILE=xxxx" \
-e "AWS_DEFAULT_REGION=ap-northeast-1" \
grafana/grafana-enterprise
ホストマシンの$HOME/.awsを/usr/share/grafana/.awsにコピーさせることで、ホストマシンのIAM Identity Centerで取得した一時的な認証情報を利用して、AWSにアクセスできる仕組みとしてみました。
うまく起動できれば、http://localost:3000でログイン画面が表示されるはず。
後は必要に応じて日本語にしておきます。
CloudWatch連携
次にCloudWatchと連携してみます。
データソースからCloudwatchを選択します。
各種設定をしていきます。
Authentication ProviderはAWS SDK Defaultを選択しておきます。
自動的にマウントした/usr/share/grafana/.awsを見てくれて認証してくれるみたい。
Assume Roleでは、Grafanaが利用するロールを指定しておきます。
IAM Identity Centerの一時的な認証情報そのままでは強いadministrator権限があるためです。
付与するポリシーはマネージドのCloudWatchReadOnlyAccessのみです。
Additional Settingでは、リージョンや、カスタムメトリックスの名前を指定しておきます。
特にカスタムメトリックスはここで指定しておかないと、ダッシュボード作成時に選択肢として表示されません。
最後に保存してテストを選択し、成功すればOKです!
後はダッシュボード作成時にCloudwatchのデータソースを選択し、namespaceからカスタムメトリックスを選択したりするだけです。
少し見た目もいじって、こんな感じになりました。
リビングの室温の遷移が見られるようになりましたねー。
なお、マネコンでみるとこんな感じ。
機械学習した期待値まで表示されていて、メトリックスの場合だと別にGrafana使わなくても良いですね。
まとめ
ということで、Grafana初体験でした。
今回は視覚化するだけでしたが、Nature Remo Cloud APIは機器の操作もできるので、室温に応じてエアコンの操作とかもできそうですね!














