SORACOM GPS マルチユニット のデータをノーコードで kintone に保存する

# 1.概要
以前SORACOM GPSマルチユニットからkintoneにデータを保存する方法についてはQiitaにアップしました。

https://qiita.com/yukataoka/items/c07b78f5151c29ac8858

その後、これってノーコードでもできるのでは？と考えていましたが、実際に試せていませんでした。最近のkintone cafe登壇でkintoneに保管したGPSマルチユニットのデータ活用に興味をいただいたので、今回はノーコードで実現する方法を試してみました。
![GPS01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/3030bb2e-0643-49f9-f684-98f6bf5cff2e.png)
※上記GoogleMap表示はkintoneのカスタマイズで対応していますが、地図はプラグインでも対応可能です。

# 2.GPSマルチユニットとkintoeの準備
![GPS マルチユニット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/56b97c39-c806-853f-d1eb-d0cba7cf32a8.jpeg)
以前のQiita記事の以下の章などを参照ください。
* GPS マルチユニットの準備
* kintone の準備
* GPS マルチユニットの設定

https://qiita.com/yukataoka/items/c07b78f5151c29ac8858

https://users.soracom.io/ja-jp/guides/iot-devices/gps-multiunit/

**2023年08月26日 追記**
SORACOM Air forセルラーの「バイナリパーサー」をオンにしてフォーマットに「 @gpsmultiunit 」を入力することで、以下の Obit の設定は不要になります。

# 3.以前の方法とノーコードの比較
以前に試した方法は以下です。
![GPS02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/bdf932d1-b9a7-b7d4-7d4e-164401b4f689.png)
GPSマルチユニットからのデータをSORACOM FuncでAmazon AWSのLambdaに送り、**Lambdaのプログラム**がkintoneにデータを追加していました。

今回ノーコードで試す方法は以下です。
![GPS03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/d9171524-6610-3814-ed74-acf91ce20d5d.png)
GPSマルチユニットからのデータをSORACOM BeemでYoomフローロボットに送り、**Yoomフローロボットが設定した手順に従い**kintoneにデータを追加します。

但し、GPSマルチユニットのデータをそのままSORACOM Beemで送ると、データがテキストでなくBase64エンコードデータで送られます。YoomにはBase64をデコードする機能がありません。苦肉の策としてSORACOM Beemで送る前にSORACOM OrbitにBase64デコード処理するSoralet（WASMモジュール）を設定しています。

詳しい方からは、SORACOM OrbitのSoralet（WASMモジュール）を設定するなら「ノーコードでないでしょ！」という意見もありそうですが、ファイル配布が可能かつAWS Lambdaのように直接プログラムコードを確認しなくても良いので、今回はノーコードと位置づけます。（汗）

# 4.YoomとSORACOM Beem、Orbitの設定

## 4.1.Yoomについて
YoomはSRACOMやkintone、Slack、Googleなどの各サービスをノーコードで連携するツールです。月100回までの実行は無料ですので、今回はこちらを使います。

https://lp.yoom.fun/

上記トップページの「無料で始める」からアカウントを作成し、Yoomが利用できるようにしておきます。

## 4.2.Yoomフローボットの追加
ログイン後の「ホーム」画面に最初から「マイプロジェクト」があるので、今回はこちらを利用します。
「マイプロジェクト」、「フローボット」の順に進み、「新規作成」で「はじめから作成」を選択します。

フローボットの新規作成画面で「特定のアプリイベントが発生したとき」を選択し、SORACOM Beemから受信したデータを受け取り処理を開始するwebhookを追加します。
![Yoom01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/e49d99fb-79c7-5672-24be-b379ef16d052.png)
「カスタムアプリ」を選択します。
![Yoom02b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/5cc89203-dd35-96bd-1373-d61974adc834.png)
トリガーアクションは「カスタムwebhook」を選択します。
![Yoom03b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/c38717c3-1b2a-fb5a-921e-4bb93500af1b.png)
以下の**トリガーアクションのWebhookURLを控えておきます。WebhookURLは後のSORACOM Beemの設定で必要になります。**
![Yoom04b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/ab062984-c57e-5254-35c6-3ce445433cbf.png)
以下の画面で保存が完了しました。
![Yoom05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/3911d0a0-cd52-b11d-092f-11f76cf60b26.png)
Yoomの作業は一旦中断して、SORACOMコンソールの作業に移ります。

## 4.3.SORACOM BeamとOrbitの設定
以降のSORACOM BeamとOrbitの設定は「2.GPSマルチユニットとkintoeの準備」でSORACOM GPSマルチユニットの初期設定と、SIMグループの追加を終えている前提で話を進めます。

### 4.3.1.SORACOM Beamの設定
SORACOMコンソールのメニューから、SORACOM GPSマルチユニットの「SIMグループ」の基本設定を表示します。

SORACOM Beamの設定を開き、以下のように設定します。
**転送先はYoomでトリガーアクションの設定で控えたWebhookURLをホスト名とパスに分けて入力します。**
![beem02b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/17af67c2-7a38-f804-a4bc-84a4502f4a75.png)

### 4.3.2.SORACOM Orbitの設定
SORACOM Beamの設定でGPSマルチユニットからのデータはYoomに転送されますが、データがBase64エンコードされているためそのままではYoomで処理ができません。そこで、SORACOM Orbitで事前にBase64デコード処理を行うように設定し、SORACOM BeamでテキストのJSONデータをYoomに転送します。

SORACOM Orbitの「Soralet管理」を開きます。
![Obit01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/829fe3a0-ddb6-58aa-3220-e45401736337.png)
「新規作成」でSORACOM OrbitのSoraletを追加します。
![Obit02b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/18c355ef-5bf5-5a61-3263-50a35938467e.png)
「SORALET ID」と適当な「概要」を入力して、Soraletを「作成」します。
![Obit03b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/a1ecabcc-a4fc-a220-fb8b-9a50558cc59d.png)

SoraletにはWASMというプログラムモジュールが必要です。今回のBase64デコード処理を行うWASMファイルを準備していますので、以下からダウンロードします。

https://s3.ap-northeast-1.amazonaws.com/demo.ykata.net/download/encodeSoralet.wasm

厳密に言うと今回はWASMプログラムを開発する必要がありましたが、こちらは入手可能という前提でノーコード開発としています。

ダウンロードしたWASMファイルを以下の手順で「アップロード」します。
![Obit05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/34edd967-9784-700f-3612-be6153e98b6b.png)
![Obit06b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/98a6ebc1-9dc7-720a-1173-c186a02422d6.png)

以下の**SRNは、SORACOM GPSマルチユニットのSIMグループ内SORACOM Orbitの設定で必要**なので控えておきます。
![Obit07b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/935041a4-886b-e03f-52de-8927aeceff19.png)

再度、SORACOM GPSマルチユニットの「SIMグループ」の基本設定を表示し、以下のようにSORACOM Orbitの設定を行い保管します。
![Obit08b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/4bdf1893-4990-c8c7-7855-7ba0f2436eba.png)

## 4.4 YoomのSORACOM Beemからの受信とkintoneへの送信設定
「4.2.Yoomフローボットの追加」で途中になっていた設定を再開します。

## 4.4.1 SORACOM Beemからの受信設定の続き
以下の画面に戻り「SORACOM Beemからの受信」アプリトリガーを開きます。
![Yoom05b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/309b93d2-ff26-5430-3b58-316e3c068f72.png)
SORACOM GPS マルチユニットのファンクションボタンを1秒押して、データ転送が完了したら「テスト」を行います。
![Yoom04c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/75973454-5a28-8237-0eea-1eed3ec432af.png)
「4.3.SORACOM BeamとOrbitの設定」に問題がなければ、YoomがJSON形式で受信したデータが以下のように表示されます。
![Yoom06b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/4c737aef-1c23-22b2-771c-a1ad15ab3c8c.png)
kintoneに必要なデータ（今回は全て）を上記で「＋」をクリックすると、アプトプットに自動で追加されます。
![Yoom07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/5cdc15bf-59af-b09a-8cc5-86d636d3559c.png)
以上の設定が完了したら、アプリトリガーを保存します。

### 4.4.2.kintoneへの送信設定の追加
データ受信までの設定ができたので、kintoneにデータを送信するワークフローを追加します。

ワークフローは以下の「＋」マークで追加できます。
![Yoom05c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/dc813f10-8afb-bed4-104b-31ce2f5370d8.png)
「アプリと連携する」を選択します。
![Yoom08b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/b4313cb0-0218-21d3-27f8-af0e641f09cb.png)
実行するアプリで「kintone」を選択します。
![Yoom09b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/831f586c-9400-bbc9-d43b-08ea66041596.png)

kintoneの新規登録にはkintoneの管理者権限を持つアカウントと、kintoneの設定が必要です。以下を参考に設定を行い、必要な情報を控えておきます。

https://intercom.help/yoom/ja/articles/5505188

以下のYoomの設定画面に戻り、控えておいた情報を登録します。
![Yoom10b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/5624d6dd-4beb-18f4-a894-c734a524891c.png)
アクションはレコードの追加を選択します。
![Yoom11b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/ead7b467-d1a7-592a-332a-89ef0231f89d.png)
kintoneのサブドメイン、アプリIDを入力します。
![Yoom12b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/8d54f741-c87f-b2a7-5cf2-8852e67f04e9.png)
kintoneのフィールドコートに対応する値を入力します。
![Yoom13b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/56d44679-fa65-2964-a339-fc498cbb2e2d.png)
値は手入力で設定する必要はなく、すでに設定を完了したアプリトリガーの設定を選択するだけです。
![Yoom14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/78b9eb60-b206-df53-63b1-cf2230199ed4.png)
設定が完了したらテストを実施します。
![Yoom15b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/3fcc4d5a-ce86-a638-f1ec-33cd47e83a39.png)
kintoneのアプリにデータが追加されていたら設定を保存します。
![kintone01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/57759ae3-7428-edbd-9ff8-cc1bf0ddfa34.png)
設定を完了すると、以下のワークフローが表示されます。
![Yoom16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/67564caf-9181-2ba4-2eeb-286a0a92147c.png)
**「SORACOM Beemからの受信」がoffになっていますので、ONにします。**

以上で、SORACOM GPSマルチユニットから指定間隔でGPSなどのデータがkintoneに追加されるようになります。

# 5.まとめ
以上、ノーコードでSORACOM GPS マルチユニットのデータをkintoneに保存できることまで確認しました。

しかしながら、ノーコード開発とはいえ以外と設定が多く手間がかかることがわかり、AWS Lambdaなどの開発に慣れているとそこまで大幅な工数削減にはなりませんでした。また「3.以前の方法とノーコードの比較」で説明したようなデータ処理の流れと利用する各サービスに関する知識はある程度保持してないと、実際にこの内容を応用して現場で活用するのは難しいでしょう。

とはいえ今回のノーコード開発のメリットとしては、プログラミングのできない方にはプログラム開発環境の準備や言語を理解するなどの手間が省けるなどのメリットが大きいでしょう。

## 補足（SORACOM Orbit）
今回SORACOM GPSマルチユニットからのデータをYoomで利用する際に、そのままではBase64でエンコードされたままのデータが届くため、その回避でSORACOM Orbitを利用しました。

SORACOM OrbitはWASMモジュールを登録するだけで、送付する前にデータに対して処理を行えますが、WASMモジュールが入手できない場合は今回のようにプログラム開発を行う必要があります。

今回は、以下を参考にGO言語でBase64でエンコードされたままのデータを文字列のJSONに変換するWASMモジュールを作成しました。

https://users.soracom.io/ja-jp/docs/orbit/setup/

https://dev.classmethod.jp/articles/soracom-orbit-tinygo-wasm/

ソースコードは以下です。

```main.go
package main

import (
	sdk "github.com/soracom/orbit-sdk-tinygo"
)

// application entry point, but the orbit runtime never executes this.
func main() {
}

//export uplink
func uplink() sdk.ErrorCode {
	inputBuffer, err := sdk.GetInputBuffer()
	if err != nil {
		sdk.Log(err.Error())
		return -1
	}
	sdk.Log("Input Buffer: " + string(inputBuffer) + "\n")

	sdk.SetOutputJSON(string(inputBuffer))
	return sdk.ErrorCode(0)
}
```

Makefileは出力するWASMモジュールのファイル名のみ変更しました。

```Makefile
TINYGOFLAGS = -target wasm -wasm-abi generic

SRC = ./src
WASM_DEBUG = build/encodeSoralet.wasm　## <=この行のみ変更
WASM_RELEASE = build/soralet-optimized.wasm

help:
	@echo "usage: make <\033[36mtargets\033[0m>"
	@echo
	@echo "available targets:"
	@grep -E '^[a-zA-Z._-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-10s\033[0m %s\n", $$1, $$2}'

build: $(SRC) ## Build debug WASM
	tinygo build -o $(WASM_DEBUG) $(TINYGOFLAGS) $(SRC)

release: $(SRC) ## Build release WASM
	tinygo build -o $(WASM_RELEASE) $(TINYGOFLAGS) -no-debug $(SRC)

clean: ## Remove WASM(s) under build/
	rm -fr build/*.wasm

.PHONY: help build release clean
```