ラズパイでオフィス環境をセンシングしてグラフ化する【簡易グラフ化編】(4/4)

[ラズパイでオフィス環境をセンシングしてグラフ化する](https://qiita.com/tnagao3000/private/8ccebfb955f42d8138a3)の簡易グラフ化編です。

前回取得したセンサー値を [Ambient](https://ambidata.io/docs/gettingstarted/) というグラフを作ってくれる
SaaSに送り、次のようなグラフを１つ作ってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/87e49c14-679f-0407-3ff5-e6c24993874d.png)

手順は次の通り。

- [ユーザー登録(無料)](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)
- [チャネル生成](#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)
- [マイコン側プログラミング](#%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E5%81%B4%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
- [データー送信](#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BC%E9%80%81%E4%BF%A1)
- [可視化(グラフ化)](#%E5%8F%AF%E8%A6%96%E5%8C%96%E3%82%B0%E3%83%A9%E3%83%95%E5%8C%96)

## ユーザー登録する

さきほどのリンクから行います。

## チャネルを生成する

チャネルはデバイスからセンサー値を受信する単位です。
１つのチャネルで最大８つのセンサー値を受信できます。

チャネルとグラフは１：Ｎで対応します。
今回は次のようにしてみます。

|項目|数|
|:--|:--|
|デバイス（ラズパイ)|１つ|
|センサー値|５種|
|チャネル|１つ|
|グラフ|１つ|

ひとまず上記リンクからチャネルを生成し、適当な名前を
付けてチャネルIDとライトキーを取得してください。

チャネルIDとライトキーはデータ送信時に必要になります。

## マイコン側プログラミング

前回までの方法でセンサー値を取得してAmbientに送信します。
次項を参照してください。

## データー送信

取得したセンサー値をAmbientの [Pythonライブラリー](https://ambidata.io/refs/python/) で送信します。

ライブラリのインストールと用法はリンク先に
記載の通りですが、ざっくりと次の通り。

### ライブラリのインストール

```bash
pip install git+https://github.com/AmbientDataInc/ambient-python-lib.git
```

### 送信

Pythonでざっくり作ってみます。
次のような感じです。

```python:send_to_ambient.py
# -*- coding: utf-8 -*-
#
# https://github.com/adafruit/Adafruit_Python_BME280
# https://github.com/sim0nx/tsl2561
# https://github.com/UedaTakeyuki/slider/blob/master/mh_z19.py
# https://ambidata.io/refs/python/
#
from Adafruit_BME280 import *
from tsl2561 import TSL2561
import serial
import ambient

def send():

    # 気温(℃)、湿度(%)、気圧(hPa)
    bme280 = BME280(t_mode=BME280_OSAMPLE_8, p_mode=BME280_OSAMPLE_8, h_mode=BME280_OSAMPLE_8)

    temperature = bme280.read_temperature()
    humidity = bme280.read_humidity()
    pressure = bme280.read_pressure() / 100

    # 照度(lx)
    illuminance = TSL2561().lux()

    # co2濃度(ppm)
    mhz19 = serial.Serial('/dev/ttyS0',
                          baudrate=9600,
                          bytesize=serial.EIGHTBITS,
                          parity=serial.PARITY_NONE,
                          stopbits=serial.STOPBITS_ONE,
                          timeout=1.0)

    mhz19.write("\xff\x01\x86\x00\x00\x00\x00\x00\x79")
    res = mhz19.read(9)
    co2 = ord(res[2])*256 + ord(res[3])

    # 送信
    # ここにチャネルIDとライトキーをセット
    amb = ambient.Ambient( 9999, "xxxxxxxxxxxxxxxx")

    amb.send({"d1": temperature,
              "d2": humidity, 
              "d3": pressure, 
              "d4": illuminance, 
              "d5": co2 })

if __name__ == "__main__":
    send()
```

上記の実行には Adafruit_BME280.py が必要なので同じ場所にコピーします。
正しく動作すると、Ambientで送信値がダウンロードできます。

動作確認できたらcronに仕込みます。

## 可視化(グラフ化)

グラフ作成は画面をいじってみるとすぐわかると思います。
画面右上にある次の２つのボタンから行います。

|No.|ボタン|主な設定項目|
|:--:|:--|:--|
|(1)|チャネル設定|送信データの名前|
|(2)|チャート設定|グラフの種類 ( 折れ線、棒グラフなど )<br>表示対象データの選択|

**画面右上にあるボタン**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/7ebdc151-1119-c26d-7cb0-a1373cedd90c.png)

今回は次の通り設定しました。

**チャネル設定**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/875ddfcc-34dd-b41d-97be-596cc9545473.png)

**チャート設定**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/624d2a02-24bc-fe20-2fa1-0bad744d3623.png)


ここまで行うと、次のようなグラフが出てきます。
https://ambidata.io/ch/channel.html?id=2813

以上で完成です。