pythonを使ってnetatmoのapiを叩く

## netatmoとは？

室温とか湿度とかを計測するIoTの機械です。
この機械の中央管理のServerがあり、APIが生えており、こちらのAPIを利用します。
本記事ではAPIをpythonで叩くところまでを実施します。

https://www.netatmo.com/en-us

## どのようなデータが取れるのか？

まずは管理画面のスクリーンショットを添付します。

![スクリーンショット 2021-08-13 18.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/7ceaddf9-29bf-b533-e059-d2fbd6f48fd3.png)

上の画像はnetatmoの管理画面のスクリーンショットです。
左枠にある、気温、湿度、気圧、CO2濃度、騒音を取得できます。
またこれら追加してAPIの場合には、緯度経度のデータも取得できます。

## データ取得の方法

認証はOAuth2が使われているため、[Netatmo ウェザーステーションのAPIを使ってみる - Part1: Node.jsのサンプル](https://qiita.com/masato/items/6c8c4b5202c065ffc818)を参考にしてプログラムを組みます。
[netatomの管理画面](https://dev.netatmo.com/)からアクセスし、My appsからアプリ環境構築を作成し、ここで設定値を入力することで、アクセスキーとシークレットキーを取得することができます。

![スクリーンショット 2021-08-17 9.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/c2401f9c-632e-9e09-9415-2dc73472db3b.png)


今回はアクセスキーとシークレットキーを取得し、この設定値を使ってAPIを叩きます。
redirectURIとwebhookURIの設定もできますが、今回は利用しません。

![スクリーンショット 2021-08-16 12.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/3f885708-1acd-ea00-5ef0-6aa30ddfcaad.png)

## python3のサンプル：認証の取得

[プログラムの仕様はこちらの公式HPを参考にプログラムを組みます。](https://dev.netatmo.com/apidocumentation/oauth)
今回必要な権限は配置しているステーションの情報読み取りのため、scopeにread_stationのみ許可します。

```python
import requests

headers = {'Content-Type': 'application/x-www-form-urlencoded', 'charset': 'UTF-8'}
url = 'https://api.netatmo.com/oauth2/token'
data = {
    'grant_type': 'password',
    'client_id': 'クライアントID',
    'client_secret': 'シークレットID',
    'username': 'トップページログインEmail',
    'password': 'トップページログインパスワード',
    'scope': 'read_station'
}

resp = requests.post(url=url, headers=headers, data=data)

print(resp.text)
```

レスポンスは以下のjsonとなりますが、このうちaccess_tokenを利用します。

```json
{
　"access_token":"アクセストークン",
　"refresh_token":"リフレッシュトークン",
　"scope":["read_station"],
　"expires_in":10800,
　"expire_in":10800
}
```

## python3のサンプル：ステーションデータの取得

[プログラムの仕様はこちらの公式HPを参考](https://dev.netatmo.com/apidocumentation/oauth)に従って、getstationsdataのAPIを叩きます。


```python
import requests

headers = {'Content-Type': 'application/x-www-form-urlencoded', 'charset': 'UTF-8'}
url = 'https://api.netatmo.com/api/getstationsdata'
data = {
    "access_token": "アクセストークン"
}

resp = requests.post(url=url, headers=headers, data=data)

print(resp.text)
```

レスポンスの一部必要な部分のみを抽出して下に記載します。
以上よりnetatomのデータを取得することができていることがわかります。

```json
{
  "body": {
    "devices": [
          ----------
      {
        "dashboard_data": {
          "time_utc": 1629083539,
          "Temperature": 22.8,
          "CO2": 551,
          "Humidity": 75,
          "Noise": 52,
          "Pressure": 1013.5,
          "AbsolutePressure": 1012.6,
          "min_temp": 22.3,
          "max_temp": 23.2,
          "date_max_temp": 1629080519,
          "date_min_temp": 1629075987,
          "temp_trend": "down",
          "pressure_trend": "stable"
        },
      }
    ],
          ----------
}
```

## 今後

今後はこのデータを使ってAWS Elasticsearch Serverへデータを流すことを実施します。
それはまた別の記事を使って記載いたします。

## 参考
[netatomの管理画面](https://dev.netatmo.com/)
[Netatmo ウェザーステーションのAPIを使ってみる - Part1: Node.jsのサンプル](https://qiita.com/masato/items/6c8c4b5202c065ffc818)
[AMAZON / NETATMO(ネタトモ) ウェザーステーション USB付属・ACアダプター無し スマホ対応 温度・湿度・気圧・二酸化炭素・騒音を測定 [並行輸入品]](https://www.amazon.co.jp/NETATMO-%E3%82%A6%E3%82%A7%E3%82%B6%E3%83%BC%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-USB%E4%BB%98%E5%B1%9E%E3%83%BBAC%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E7%84%A1%E3%81%97-%E3%82%B9%E3%83%9E%E3%83%9B%E5%AF%BE%E5%BF%9C-%E6%B8%A9%E5%BA%A6%E3%83%BB%E6%B9%BF%E5%BA%A6%E3%83%BB%E6%B0%97%E5%9C%A7%E3%83%BB%E4%BA%8C%E9%85%B8%E5%8C%96%E7%82%AD%E7%B4%A0%E3%83%BB%E9%A8%92%E9%9F%B3%E3%82%92%E6%B8%AC%E5%AE%9A/dp/B07TXD3QQ5/ref=pd_sbs_1/358-7248065-1586857?pd_rd_w=YD0E1&pf_rd_p=133595aa-365a-4ded-92cd-226dcfd5ea4f&pf_rd_r=NFT9F6GYEACS23C5G1SW&pd_rd_r=fd8cd38c-5f44-431d-9923-d767e3117c82&pd_rd_wg=tEdCM&pd_rd_i=B07TXD3QQ5&psc=1)