IoTクラウドAmbientを使ってみる
はじめに
AmbientはESP32などに接続されたセンサのデータをクラウド上のサーバに蓄積し、グラフなどで可視化するサービスを提供しています。
この記事ではESP32とMicropythonを使用してAmbientにセンサーで取得したデータをアップロードし、グラフを描画する手順について解説します。
なお、使用するセンサは温度・湿度・気圧センサのBME280やESP32-C3M-TRYのAHT20(温度・湿度センサ)を使用します。
Ambientについて
8個のチャネルまでは無料で使用でき、1チャンネルあたり8種類のデータを送信できます。
それを超えると有償となります。
諸元/制限では次のようになっています。
- 1ユーザーあたり8個までチャネルを生成できる。
- 1チャネルあたり8種類のデーターを送信できる。
- 送信間隔は最低5秒とし、それより短い間隔で送信したものは無視される。
- 1チャネルあたり1日3,000件までデーターを登録できる。平均すると28.8秒に1回のペース。
- 1チャネルあたり8個までチャートを生成できる。
- 無償ユーザのデータ保存期間は4ヶ月、有償ユーザのデータ保存期間は1年間。
図は https://ambidata.io/ より引用
Ambientを利用するには次の手順で行います。
- ユーザ登録
- チャンネル生成
- Pythonライブラリのインストール
- 送信するデータ形式
- プログラムの作成
- 可視化(グラフ化)
- 公開
以下、順に解説します。
ユーザ登録
「Ambient利用規約」をよく読んでから
https://ambidata.io/usr/signup.htmlのページからユーザ登録を行います。
登録すると認証メールが来るので、24時間以内に、メールにあるURLをクリックすると登録が完了します。
URLをクリックして開いたページの
ログインしてお使いください。
ログイン
のログインのリンク(https://ambidata.io/usr/login.html)をクリックする。
ログインが完了すると下のような画面が表示されます。
Ambient初回ログイン画面
チャンネル登録
先のAmbient初回登録画面にある「チャンネルを作る」ボタンをクリックします。
しばらくすると、チャネル名、チャネルID、リードキー、ライトキーの各項目にデータがセットされます。
データをAmbientに送信するにはチャンネルIDとライトキーが必要になるので、ここに表示されるものをプログラムに埋め込みます。
Pythonライブラリのインストール
AmbientのPythonライブラリーにはAmbientにデーターを送信する機能と、Ambientに蓄積されたデーターを読み込む機能があり、以下のGitHubで公開されています。
https://github.com/AmbientDataInc/ambient-python-lib
このページのambient.pyをクリックするとライブラリのソースコードが表示されます。
下図の赤丸のボタンをクリックするとソースコードがクリップボードにコピーされるので、Thonnyで「新規ファイル」を開いてペーストします。
ESP32開発ボードをUSBケーブルでPCと接続します。
メニューバーの「ファイル」から「名前を付けて保存」をクリックすると「どこに保存しますか?」のダイアログが表示されるので、「MycroPythonデバイス」のボタンをクリックします。
画面の一番したにファイル名を入力する欄があるので、ambient.pyという名前にし、「OK」ボタンをクリックします。
これにより、プログラムから
import ambient
としてライブラリを使用できるようになります。
送信するデータ形式
Ambientに送信するデータは、JSON形式で構成されます。具体的には、以下のような形式でデータを送信します。
この例ではデータ取得日時を2025-09-02T08:30:00.000Zとし、第1フィールドに温度の23.5を第2フィールドに湿度の56.2をセットしています。
{
"created": "2025-09-02T08:30:00.000Z",
"d1": 23.5,
"d2": 56.2
}
createdのフィールドは日時の情報を与えますが、省略した場合はambientのサーバがデータを受信した日時を自動で付与します。
データはd1からd8のJSONキーの値として与え、チャンネル設定で温度や湿度のようなラベルを付けます。
カスタムキーの使用はできません。
プログラムの作成
温度・湿度・気圧センサのBME280
BME280についてはこちらの記事を参照してください。
# BME280で測定したデータをambidata.ioにアップロードする
# Sep. 2nd 2025
import network
from machine import Pin, SoftI2C
from time import sleep
from BME280 import BME280
import ambient
WIFI_SSID = "ここにWiFiのSSIDを記述"
WIFI_PASS = "ここにWiFiのパスワードを記述"
CHANNEL_ID = "ここにAmbientのチャンネルIDを記述"
WRITE_KEY = "ここにAmbientのライトキーを記述"
# BME280が接続されているGPIOポート(必要に応じて変更する)
SCL = 26
SDA = 27
# Make i2c instance
i2c = SoftI2C(scl=Pin(SCL), sda=Pin(SDA))
# Make bme instance
bme = BME280(i2c=i2c)
# Make instance for ambidata.io
am = ambient.Ambient(CHANNEL_ID, WRITE_KEY)
# WiFi接続関数
def connect_wifi():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
sleep(0.5)
while not wifi.isconnected():
print("Connecting to WiFi", end="")
wifi.connect(WIFI_SSID, WIFI_PASS)
sleep(1)
while not wifi.isconnected():
print(".", end="")
sleep(1)
pass
ip = wifi.ifconfig()[0]
rssi = wifi.status('rssi')
return ip, rssi
# ここからメイン
if __name__ == '__main__':
# WiFi接続
ip, rssi = connect_wifi()
print("IP:", ip, "RSSI:", str(rssi))
# データ測定と送信
while True:
temp = bme.temperature
humi = bme.humidity
pres = bme.pressure
print(temp, humi, pres)
# 26.96C 69.12% 985.27hPaのように、末尾にデータの単位が付加されているので取り除く
temperature = float(temp[:-1]) # Cを取り除く
humidity = float(humi[:-1]) # %を取り除く
pressure = float(pres[:-3]) # hPaを取り除く
# 送信データ作成
data = {'d1': temperature, 'd2': humidity, 'd3': pressure}
# データを送信
response = am.send(data)
print('送信結果:', response.status_code)
# 5分毎に測定してアップロードする
sleep(5 * 60)
ESP32-C3M-TRYとAHT20
ESP32-C3M-TRYとAHT20についてはこちらの記事を参照してください。
# ESP32-C3M-TRYのAHT20で測定したデータをambidata.ioにアップロードする
# Sep. 2nd 2025
import network
from machine import Pin, I2C
from aht21 import AHT21
from time import sleep
import ambient
WIFI_SSID = "ここにWiFiのSSIDを記述"
WIFI_PASS = "ここにWiFiのパスワードを記述"
CHANNEL_ID = "ここにAmbientのチャンネルIDを記述"
WRITE_KEY = "ここにAmbientのライトキーを記述"
# Use hardware I2C bus 0
i2c = I2C(0)
# Make instance
aht21 = AHT21(i2c)
# Make instance for ambidata.io
am = ambient.Ambient(CHANNEL_ID, WRITE_KEY)
# WiFi接続関数
def connect_wifi():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
sleep(0.5)
while not wifi.isconnected():
print("Connecting to WiFi", end="")
wifi.connect(WIFI_SSID, WIFI_PASS)
sleep(1)
while not wifi.isconnected():
print(".", end="")
sleep(1)
pass
ip = wifi.ifconfig()[0]
rssi = wifi.status('rssi')
return ip, rssi
# ここからメイン
if __name__ == '__main__':
# WiFi接続
ip, rssi = connect_wifi()
print("IP:", ip, "RSSI:", str(rssi))
# データ測定と送信
while True:
temp = aht21.temperature
humi = aht21.relative_humidity
print(f"温度: {temp:.1f}°C, 湿度: {humi:.1f}%")
# 送信データ作成
data = {'d1': temp, 'd2': humi}
# データを送信
response = am.send(data)
print('送信結果:', response.status_code)
# 5分毎に測定してアップロードする
sleep(5 * 60)
グラフのカスタマイズ
グラフのカスタマイズについてはこちらにAmbientの解説ページがあります。
先ほどのコードを実行してエラー等でプログラムが停止しなかった場合は、5分毎にデータを測定しアップロードが行われるので、しばらく(1時間程度)放置します。
Thonnyのシェルに
温度: 29.3°C, 湿度: 64.7%
送信結果: 200
のように、送信結果が200となっていれば正常にアップロードができています。
チャンネル一覧のチャンネル名のリンクをクリックすると、例えば、次のようなグラフが描画されています。
チャネルページの右上の「チャネル設定」ボタンをクリックすると次の画面が表示されるので、ボード名を設定し、「ボード属性を設定する」のボタンをクリックします。
グラフ上部のチャート番号が表示されている部分をクリックするとプルダウンメニューが表示されるので、「設定変更」をクリックすると次の画面が表示されるので、必要な項目を変更します。
チャンネル一覧で表示される画面の該当チャンネルの一番右側にある「設定」欄にあるプルダウンから「設定変更」をクリックすると下のような画面に遷移し、チャンネル名やd1からd8のデータ名を必要に応じて変更し、最後に画面下部にある「チャンネル属性を設定する」ボタンをクリックします。
メータの追加
下図のようなメータを追加することもできます。
メータの追加方法
グラフが表示されている画面上部にあるオレンジ色の+ボタンをクリックします。
次のような「チャート作成中」の小さな画面が他のグラフに重なって表示されるので、適切な場所にドラッグして移動させた後、画面内の「チャンネル/データ設定」ボタンをクリックします。
表示された画面の「チャートの種類」を「メーター」に設定します。
表示させたいd1からd8のいずれかで「表示」を選択します。
画面右下の「設定する」ボタンをクリックします。
他のデータのメータについても同様に追加できます。
気圧などの場合、デフォルトで設定されているデータの範囲を超えているので、チャート名のプルダウンメニューから「設定変更」をクリックし、例えば、「最小値」を900、「最大値」を1100のように変更し、「設定する」ボタンをクリックすると適切な表示になります。
公開
チャネルページの右上の「チャネル設定」ボタンをクリックして表示されるページの「公開ボード?」にチェックを入れるとグラフが公開され他の人も閲覧できるようになります。
Discussion