Blynk の「Device HTTPS API」を使ってデバイスの接続状態・ピンの値を取得する

以下の記事でも書いていた「Blynk」の話です。

●【解決】Raspberry Pi Pico W ＋ MicroPython で BlynkLib.py を使った時のエラーに関する対処メモ #micropython - Qiita
　https://qiita.com/youtoy/items/ac1510b76b43936c33fb

上記の記事では、スマホアプリと Raspberry Pi Pico W を組み合わせて使っていたのですが、今回はスマホアプリと PC を組み合わせてみます。
⇒ PC から Device HTTPS API を使って情報取得などを行ってみます

## この記事の内容をやろうとしたきっかけ
この記事の内容をやろうとしたきっかけについて少し触れておきます。

冒頭の Raspberry Pi Pico W を使ったお試しをやってみた後、Node.js との組み合わせを試そうとしました。そして、検索をしてみると以下の Node.js用ライブラリが見つかりました。

●vshymanskyy/blynk-library-js: Blynk library for JS. Works with Browsers, Node.js, Espruino.
　https://github.com/vshymanskyy/blynk-library-js

それで、サンプルを動かしてみたのですが、その際に以下のエラーがでました。

![エラー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ed597b52-3f76-dcf3-4ad3-3a387bab950f.jpeg)

URL を見た感じ、これは旧バージョンの Blynk用っぽい感じがしました。

それで、新しいバージョンの Blynk で似たようなことをやるとしたら、どんな方法になるかを調べたのがきっかけです。

## APIを使う
上記の続きです。

それで、公式ドキュメントを調べてみていたところ、以下のページを見つけました。

●Device HTTPS API | Blynk Documentation
　https://docs.blynk.io/en/blynk.cloud/device-https-api

どうやら HTTPリクエストで、Blynk を扱えるようです。
そうすると、Node.js でも fetch や HTTPリクエスト用のライブラリを使えば、Blynk との組み合わせを実現できそうです。

### 今回試す API
それでドキュメントをさらに見ていくと、基本的な API でデバイスの接続の有無・ピンの値を取得するものがあるようでした。

具体的には、以下の 2つです。

●Is Device Connected | Blynk Documentation
　https://docs.blynk.io/en/blynk.cloud/device-https-api/is-device-connected

●Get Datastream Value | Blynk Documentation
　https://docs.blynk.io/en/blynk.cloud/device-https-api/get-datastream-value

今回は、これらを試してみようと思います。

### 試す方法
試す方法を検討します。

上記の「[Is Device Connected](https://docs.blynk.io/en/blynk.cloud/device-https-api/is-device-connected)」を見てみると、以下のような仕様になっているようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7e915e71-10d8-5397-5b19-5e24e2a9ada2.png)

つまり、自分のトークンを組み込んだ以下の URL に HTTPリクエストを送れば良い、という感じのようです。

```bash
https://blynk.cloud/external/api/isHardwareConnected?token=【自分のトークン】
```

GETリクエストで大丈夫そうなので、上記をブラウザの URL欄に入れてみたり、curl を使った　GETリクエストなどで動作確認ができそうです。今回、その方法で試してみます。

### 実際に試してみる
それでは、上記 2つを順番に試していきます。

#### 「Is Device Connected」を試す
実際に、デバイスの接続の有無に関し、情報を取得してみます。

とりあえず、アプリ上でデバイス未接続という状態の時の例を掲載します。

ブラウザで試した時のレスポンスは、以下のとおりです。シンプルに「false」というレスポンスが返ってきています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8c18c176-851d-6ee6-74d5-d7907b80edfc.png)

curl で試したものも、以下の通りブラウザで試したのと同様でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b1558c5a-9871-924e-33d2-da7caa205db3.png)

#### 「Get Datastream Value」を試す
次にピンの値の取得を試します。

仕様は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e902720c-cabf-8651-4968-dd3be7d7416f.png)

以下にブラウザでアクセスするか、curl を使った GETリクエストを送れば良さそうです。

```bash
https://blynk.cloud/external/api/get?token=【自分のトークン】&V1
```

ちなみに、上記はピン「V1」を作って利用している前提です（なお、V1 のとる値は true/false にしています）。

それでは、アプリ上で以下のように V1 のピンを ON/OFF にしながら、上記の API のレスポンスを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/66594e80-3b55-2ea9-9045-0388600063df.png)

試した結果を掲載します。ブラウザと curl は同じレスポンスが得られているので、以下には curl を使ったもののみ掲載します。

■ アプリ上で V1 を false にした状態での実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4051f7c7-2b0d-d355-100d-281cf8f6ccbb.png)

■ アプリ上で V1 を true にした状態での実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9d5d19dd-590c-2e98-92c7-96a043ef612c.png)

上記のように、意図通りのレスポンスを得られていることが確認できました。

## 余談： 他に試してみたいこと
今回、「Device HTTPS API」を試しました。

他に、外部連携ができそうな仕組みがないかドキュメントを見ていたところ、MQTT も利用できそうでした。今後は、以下の MQTT も試してみようと思います。

●Device MQTT API | Blynk Documentation
　https://docs.blynk.io/en/blynk.cloud-mqtt-api/device-mqtt-api