SORACOM Fluxはどれくらい融通を利かせてくれるのか試してみた

# はじめに

本記事は[SORACOM Advent Calendar 2024](https://qiita.com/advent-calendar/2024/soracom)の3日目の記事です。

2024年のSORACOM Discoveryにて[ローコード IoT アプリケーションビルダー SORACOM Flux](https://soracom.jp/services/flux/)が発表されました。

>デバイスから送信されたセンサーデータ、カメラから送信された画像に対して、ルールを適用し、複数のデータソースや生成 AI を組み合わせて分析/判断し、その結果を IoT デバイスの制御に反映させる IoT アプリケーションをローコードで構築できます。

と紹介されており、センサーやカメラ画像を入力、各種生成AIを処理、Webhookなどの外部連携を出力としたワークフローを簡単に生成することができます。

このサービスを見たとき、センサー値の処理や判定を自然言語で記載すれば細かい式とかあんまり考えなくてもAIがよしなにやってくれるのかな〜と思いましたが、実際にどのくらいよしなにやってくれるのでしょうか。色々試してみたいと思います。(と思いましたが1件しか試せませんでした。)

# 不快指数の計算

GPSマルチユニットでは温度、湿度、加速度、GPSでの位置が取得できます。
温度と湿度が取れれば不快指数が計算できるはずですが、中身全く知らなくても不快指数出してくれ、と伝えるだけで出してくれるものでしょうか？
試してみたいと思います。

まずSORACOM Consoleの左メニューからSORACOM FluxのFluxアプリを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/fe958632-a97f-1965-09aa-300d42baf37d.png)

新しいFluxアプリを作成するをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4e960c10-dd04-0486-72c7-a7d5c1949292.png)

適当な名前をつけて作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/be402d09-0a00-ef16-59ef-29e3a29deabb.png)

アプリ内では、最初にSORACOM FluxにてGPSマルチユニットをイベントソースにしたチャネルを追加しましょう。

チャネルを追加する、をクリックして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/31059fda-ae67-f04c-5adf-fefaace0c1f5.png)

IoTデバイスを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/d4a5f578-4285-b631-e9e8-f9b444e9bbe0.png)

適当なチャネル名をつけ、IoTデバイスを有効にして、GPSマルチユニットの入力が届いているチャネルを選択して、チャネルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/96714981-2159-19d9-5280-ebab127d24f8.png)

次にこのチャネルに送られてきたデータに対し、AIで処理するアクションを追加します。アクションタブを選択してアクションを追加をクリックします。なお、このダイアログを閉じてしまった場合は、画面内のチャネル部分をクリックするとダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/856b9e88-1e8f-124f-4bf5-ee6079e20779.png)

AIを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/994be839-c69b-5071-933d-26c78acdbb09.png)

適当な名前をつけ有効にし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/a2669f31-f19e-dbc9-5dd7-54c9209c52e8.png)

AIモデルを選び、プロンプトを記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2adf3195-0ae3-2451-bcb1-be94f7753a27.png)

AIモデルはひとまずなんでも良いですが、最初に付与されたクレジットを使い切るとクレジットを消費するモデルは使えなくなります。その場合はOpenAIの自分のAPIキーを使った利用になるでしょう。色々試してるとクレジットはすぐになくなるので要注意。

プロンプトはひとまずこんな感じです。

```
#入力についての説明
入力データは以下のようなJSON形式です。temp, humiはそれぞれ気温と湿度を表します。

{"lat":null,"lon":null,"bat":3,"rs":4,"temp":23.0,"humi":56.5,"x":null,"y":null,"z":null,"type":0}

# 入力データ

${payload}

# 指示

上記のデータのtempを温度、humiを湿度として不快指数を計算し、以下のようなJSONを出力して下さい。

{
  "temp": 温度,
  "humi": 湿度,
  "discomfort": 不快指数
}
```

不快指数がどんなもので、どのように計算するのか全く書いてませんが、これでなんとかなるでしょうか。

AIからの返答をJSON形式にする、にチェックを入れておくと、後段で使いやすいです。また、アクションのアウトプットを別のチャネルに送信しましょう。こうすると、通知するなど次の処理に繋げることができます。以上を設定した上で作成するをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/08f968ea-2c0d-30f2-1ad9-821614e0f396.png)

最後にこの計算された結果をなんらかの方法で通知しましょう。メールでも良いですが、今回はLINE Notifyを使用します。(LINE Notifyは来年使えなくなってしまいますが。。)

いったんダイアログを閉じ、先ほど作成されたチャネルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/6ebd20c1-4007-bdee-e2b4-73d4bc8937b2.png)

アクションを追加し、今度はLINE通知を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/e1b5d31e-f4bf-3b0e-79f3-abcfd83b330c.png)

適当な名前をつけ有効にし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/2a8d1ef6-9389-c973-65f5-78eb25640b68.png)

メッセージには前段の入力をそのまま出すため${payload.output}を指定、LINEトークンを認証情報として選択し、作成します。通知が最後の処理なので、アウトプットを別のチャネルに送信することはないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/a423b5b7-21cc-65c0-3035-1fe0589cb71e.png)

これでGPSマルチユニットのセンサー値がアップロードされるのを待っていると、、、届きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/7210255a-13bf-6f4a-99e6-5a96c7a952d4.png)

なんかそれっぽい値は出てますね。このようにセンサー値の入力からAIを使ったデータの加工、メールやLINEなどの通知をサクッと作れるのがSORACOM Fluxのいいところです。

さて、何かの値は出てきましたが、これは不快指数として正しい値なんでしょうか？
調べると不快指数は以下の計算式で求められるようです。
不快指数 = 0.81 * 温度 + 0.01 * 湿度 * (0.99 * 温度 - 14.3) + 46.3

温度22.7℃、湿度49.1%rhの場合の値を計算してみると、、、68.7!(小数点以下第2位を四捨五入)
あれ、なんかそれっぽいけど微妙に合いませんね。

その後いくつか値が届きましたが、いずれもそれっぽいが合わない数字になりました。そもそもどう計算してその値になっているかわからないので説明してもらいましょう。プロンプトの指示部分を以下のように変更します。


```
# 指示

上記のデータのtempを温度、humiを湿度として不快指数を計算し、以下のようなJSONを出力して下さい。
どのように不快指数を計算したかの過程も日本語で記載してください。

{
  "temp": 温度,
  "humi": 湿度,
  "discomfort": 不快指数,
  "process": 計算過程
}
```

再度届いたメッセージを確認すると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/9d2f1a3a-099e-5a64-d2d4-362bce1d582e.png)

まず、不快指数の計算式は正しく理解しているようです。素晴らしい！
次に具体的な計算を示してくれていて、
0.81 * 23 = 18.63 - 合ってる
0.99 * 23 : 14.3 = 8.47 - 合ってる
0.01 * 45.8 * 9.47 = 3.87626 - 間違っている(正確には3.87926)
18.63 + 3.87626 + 46.3 = 68.80626 - 合ってる
68.80626を四捨五入して68.15 - 間違っている(正確には68.81)

途中まではおおよそ合っているのが四捨五入の部分で致命的に間違えてしまっているように見えますが、答えを先に書くとその決まった答えに合わせて途中の計算が捻じ曲がってしまう、という現象が働くと聞いたことがあるので、今度は計算結果を先に出し、結果を後に出すようにしてもらいます。

```
# 指示

上記のデータのtempを温度、humiを湿度として不快指数を計算します。
どのように計算したかの過程も日本語で記載し、その結果として不快指数を算出してください。
その後以下のようなJSONを出力して下さい。

{
  "temp": 温度,
  "humi": 湿度,
  "process": 計算過程,
  "discomfort": 不快指数
}
```

こうすると、次のような結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/550d29a6-3c5a-cdcc-9df6-ddc6b659c4ed.png)

今度は最後の四捨五入の結果も含めてあっています。指示の仕方で結果が変わるんですね。
ただ、やはり0.01 * 45.8 * 8.47は間違えています。3桁同士の掛け算が苦手なんでしょうか。

# おわりに

もうちょっと色々やろうと思っていましたが、思いのほかうまくいかなかったのでとりあえずこの1つを書きました。意外と生成AIは数字の扱いが苦手なのかもしれません。

他にもGPSデータを使って特定地点に近づいたら教えてもらうとか、温度が一定以上になったら教えて欲しいけど1〜2分だけ突発的に上がった場合は送らないで欲しいとか、そういったちょっとめんどくさい要件をAIにそのまま伝えたらどう処理してくれるかを今後試してみたいと思ってます。AIが得意なところとそうでないところをちゃんと理解し、うまく指示を出すことにより正しく使えるようになりたいものですね。