アレクサから音声でNode-RED経由でUiPathを実行する方法

どうも、楽天経済圏で姑息に生きる中村です。

アレクサから音声でAmazonではなく楽天市場で商品を購入する方法を紹介します。
技術者向けの記事となります。

作るものはこちらです。

https://qiita.com/ManabuTech/items/5971d2b1c107863e113a

## ラズベリーパイ側の手順

### ラズベリーパイのセットアップ

公式よりImagerをダウンロードします。
ImagerはGUIでSDカードにラズベリーパイ用OSをインストールすることが可能です
IPアドレスの固定などしておいたほうがいいかと思います。

https://www.raspberrypi.com/software/

### Node-REDのインストール

公式を参考にNode-REDをラズパイにインストールします。
Node-REDはPCにインストールすることもできるのですが、常時稼働できるラズパイにインストールするようにします。

https://nodered.jp/docs/getting-started/raspberrypi



### Node-REDの拡張機能　node-red-contrib-alexa-remote2-v2のインストール

Node-REDからアレクサに音声出力させるために使用します。
拡張機能は、Node-REDのハンバーガーメニューのパレットの管理から追加でインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/2c25b2db-40c1-f1f2-2193-1b6cb962937b.png)


### Node-REDの拡張機能　node-red-contrib-alexa-home-skillのインストール

アレクサからの音声入力をトリガーにフローを実行させることができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/2ad0c113-a69f-99c8-0080-383031f64649.png)

## アレクサ側の手順

### Alexa Home Skill Bridgeのデバイス設定

Alexa Home　Skill Bridgeのアカウントを作成

https://alexa-node-red.bm.hardill.me.uk/


デバイスを追加します。
ラズパイという名前でデバイスを追加します。
%で制御できるようにします。
これは、本来電球の明るさを何％にするかに使用しますが、今回は％を使用してデバイスがアレクサへの命令の数だけ増えることを防止します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/ce2298b8-40b5-a757-c07b-644cdd909b00.png)

### 定形アクションの追加

アレクサに対して、「ラズパイを１００％にして」ではなく、「楽天で歯ブラシを購入して」のように依頼したいため、定形アクションを使います。これはAlexaアプリから行います。
音声に対してラズパイを何％にするか設定しておきます。ここでは1%としておきます。

## UiPath

今回の記事はNode-REDからUiPathの呼び出しが主のため、説明はざっくりで。
要望あれば、コメントください。追記します。

### Studioで処理の作成

今回、UiPathのワークフローに関しては割愛します。
皆さんの呼び出したい処理を作ってみてください。

Orchestratorにパブリッシュ（公開）します。

### Orchestratorの設定

パブリッシュしたプロセスをフォルダに登録して実際に呼び出せるようにします。
実行したいPCにURライセンスを付与しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/bdc5e448-7c48-749e-2e38-c52fd4b800aa.png)

### API認証情報の確認

Automation Cloudの管理画面のOrchestratorのAPIアクセスより、APIアクセスに必要な情報を取得することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/38478db5-fb69-e3c7-fee8-375159c1df1b.png)


## Node-RED

Node-REDにUiPathの拡張機能はあるのですが、UiPath Orchestratorのモダンフォルダに対応していないっぽいので、汎用的なAPI呼び出しで使用するhttp requestノードを使用します。

全体図はこのようなフローになっています
![2022-04-15-110227_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/8265dbab-68e5-4f3e-3691-bb66441533e4.png)

Githubに作成したNode-REDのファイルを置いています。

https://github.com/manabutech-kyushu/uipath-nodered-alexa

### alexa-homeノード
アレクサからの音声入力をトリガーにするノードです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/34ee3dc1-9fe3-e1b6-91d6-999f59a75102.png)

### switchノード
定形アクションで指定した音声入力が何％か定義しておいたと思いますが、ここで分岐させます。
これはデバイスを１つにするための工夫のため、このようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/e37e9cbd-13a0-30c5-c028-532d5850f860.png)

### functionノード Release Key設定
UiPathの実行する各プロセスにはReleaseKeyというものが割り当てられています。
これはReleaseAPIで取得することができますが、今回は事前に取得しておいたReleaseKeyを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/035fb9c5-ecce-e388-71a2-75da4c5967ca.png)

### functionノード 認証情報の設定
UiPath Automation Cloudの認証情報を認証APIで使用するBodyに埋め込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/5e6d878b-9cc9-b7d9-6489-fd251e93eea6.png)


認証情報はCloud上から確認可能です。
オンプレのOrchestratorでは、APIなどが少し異なります。

### http requestノード 認証
httpリクエストで、http://account.uipath.com/oauth/token に対して先程作成した認証情報を送信します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/e07707c8-f518-eb9a-d130-54ea4f1ddbe2.png)

### jsonノード
jsonノードでAPIの結果を格納します。
常にJavaScriptオブジェクトに変換をしないと、Undefinedとなり結果が取り出せませんでした。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/b21d5a56-7b08-85f3-554e-6172815a2540.png)

### functionノード トークンの保存
Node-REDでは変数は各ノードがスコープとなりますので、flow.setで他のノードが使えるようにします。
アクセストークンは、以降のAPIに付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/d9912128-70a3-513e-66f2-641bd463fe4b.png)

### functionノード StartJobsのリクエスト情報作成
StartJobで特定のプロセスを実行します。
API仕様に従い、ヘッダー情報とボディー情報を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/1b100038-23f4-8c1b-4474-c497e72133a6.png)

### http requestノード StartJobs

APIのエンドポイントは、
https://cloud.uipath.com/YOURSITE/YOURTENANT/orchestrator_/odata/Jobs/UiPath.Server.Configuration.OData.StartJobs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/52994de7-1edf-6649-a6cb-71a332e3a6df.png)

後続するjsonノードは同一のため、省略

### delayノード

ジョブ実行完了待ちのため、３秒待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/3629f2c3-aa12-f882-ef02-bb0a9cf6352c.png)

### functionノード GetJobのリクエスト情報作成

GetJobのリクエスト情報を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/598804b7-a59f-8ff4-aa72-92583e348aeb.png)

### http requestノード Jobs

実際にAPIを叩いてJobsで実行結果を取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/ced26a6f-a6fe-7f9f-79d6-376ec69a922a.png)

後続するjsonは同一のため、省略

### switchノード 実行結果の分岐

Jobsで実行結果を取得して実行中の場合は待機に戻り、成功失敗で分岐します。
実行結果はpayload.value[0].Stateに入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/a2c446d8-a5cc-89f2-6a1c-833307085f73.png)

### Alexa Routineノード 成功通知

Deviceには同じAmazonアカウントのデバイスが表示されますので、しゃべらせたいスピーカーを選択します。
成功時は「購入しました」と喋らせます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/e535c9a1-465f-5e4c-d3f3-08b5e28dd5ac.png)

### Alexa Routineノード 失敗通知

失敗時は「購入できませんでした」と喋らせます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/2798eaf5-7c20-5065-c4cb-0845ec96d75f.png)


## 気づき

UiPathもNode-REDもローコードで処理を作成できますが、アレクサと簡単に連携できるNode-REDをメインにして、そこからRPAのUiPathの処理をOrchestratorのAPI経由で呼び出すようにしてみました。
多くのアプリケーションでは、APIが用意されていなかったり事前設定が大変だったりしますので、そういう場合はRPAで処理を作ったほうが早いなと思います。UiPathであれば、レコーディングなどで簡単に処理を作ることができますし。

Node-RED連携はネタっぽいですが、UR（Unattended Robot）ライセンスの有効活用にも有用だと思います。
UR単体ではスケジュール実行が基本になりますので、各担当者の動かしたいタイミングでロボットを動かしたい場合にはAPIを任意のタイミングでコールする必要があります。（Orchestratorから手動実行してもいいですが、担当者に権限を与えたくなかったりします）
アレクサとNode-REDを連携させることにより、音声入力でURに処理を依頼できるため、ロボットと協働する感じが味わえるのもGoodです。

Alexa Routineのしゃべらせる処理はクッキー情報を使用しているため、ブラウザを閉じるとまだクッキーを再取得する作りに今はなっているため、運用のときにはもう少しどうするか検討が必要かとは思います。