部屋の環境をモニタリングしたい!!

〜かっこいいダッシュボードを添えて〜

盛岡版IoT縛りの勉強会!IoTLT盛岡 Vol.11 @オンライン

2021/07/06

自己紹介

  • 門下佳樹(sublimer)
  • 岩手県一関市出身
  • WebRTCプラットフォーム「SkyWay」開発チーム
  • WebRTC / Azure / IoT
  • Twitter:@lz650sss

今日話すこと

  • センサーのデータを取得するには
  • センサーのデータをクラウドにアップロードには
  • かっこいいダッシュボードを作るには

センサーのデータを取得するには

今回使うデバイスなど

  • M5StickC
  • GROVE - 気圧センサ(BMP280)
  • SwitchBot 温湿度計
  • サーバー用コンピューター(ラズパイなど)

気圧センサの値を取得する

GROVEポート(I2C)経由で取得


							void setup()
							{
								while (!bmp280.begin(0x77))
								{
									
								}
							}
							void loop()
							{
								float temperature = bmp280.readTemperature();
								float pressure = bmp280.readPressure() / 100;
							}
						

SwitchBot 温湿度計の値を取得する

BLE経由で取得


							class AdvertisedDeviceCallback : public BLEAdvertisedDeviceCallbacks
							{
							  void onResult(BLEAdvertisedDevice device)
							  {							
								std::string str = device.getServiceData();
								const char *data = str.c_str();
								int batteryLevel = data[2] & 0b01111111;
								float temperature = (data[3] & 0b00001111) / 10.0 + (data[4] & 0b01111111);
								int humidity = data[5] & 0b01111111;
								bool isBelowZero = !(data[4] & 0b10000000);
								if (isBelowZero)
								{
								  temperature = -temperature;
								}
							  }
							};
						

センサーのデータをクラウドにアップロードには

データをサーバー用コンピューターに送る

USB経由でシリアル通信

Q. なんでWiFi経由で送らないの?

A. プログラムがメモリに収まらなかったから

本当はM5StickCだけで完結させたかった…

シリアル通信で送られたデータを受け取る

Node.js


							const SerialPort = require('serialport');
							const Readline = require('@serialport/parser-readline');
							const port = new SerialPort('/dev/ttyUSB0', { baudRate: 115200 });
							const parser = new Readline();
							port.pipe(parser);

							parser.on('data', line => {

							});
							

データをクラウドにアップロード

InfluxDB Cloud 2.0


							const { InfluxDB, Point } = require('@influxdata/influxdb-client');
							const client = new InfluxDB({ url: '', token: '' });
							const writeApi = client.getWriteApi('', '');
							const ts = new Date();
							const point1 = new Point('data');
							point1.timestamp(ts);
							point1.floatField('temperature', receivedObject.temperature);
							point1.floatField('pressure', receivedObject.pressure);
							point1.tag('host', 'm5stickc');
							writeApi.writePoint(point1);
							

かっこいいダッシュボードを作るには

ダッシュボードツールを使う

Grafana

公式ドキュメントがあるので、それに従って設定すればOK

ハマったポイント

database/retention policy (DBRP) mappingを設定しないと動かない


						influx v1 dbrp create \
						--db example-db \
						--rp example-rp \
						--bucket-id 00xX00o0X001 \
						--default
					

グラフを作る

ブラウザからポチポチするだけ!!

注意点

作ったダッシュボードは必ず非公開に!!

公開すると「その成果を発表するための気象の観測」に該当する

→気象観測の届出・検定制度の対象になる

気象庁 | 気象観測施設の届出・気象測器の検定についてよくお寄せいただくご質問集

おわりに

家にいる時間が増えた今日、しっかりモニタリングすることで部屋の環境を快適に保つための良い指標になります。

部屋を快適にして、より良い自粛生活をしていきたいと思っています。

ソースコード

参考サイト等