背景
日常生活の中で洗剤なんかの日用品が無くなると主に妻が仕事帰りに買って帰ってます。その際買い物メモとしてGoogle Keepを使っているのですが問題がいくつか
- 項目の追加はスマホから行うのですが、スマホが手元に無いと後回しになってしまいそのまま忘れてしまうこともあります
- メモは共有しているので私も買うことがあるのですが洗剤などは同じブランドでも沢山の種類があってどれを買えば正解なのかが分からくて困ることがあります
課題
- 買い物メモへの入力に手間がかかる
- 買い物メモの項目の詳細がわからない
対策検討
課題1について
当初M5Stack等を家の中に複数設置することを考えたのですが、結局項目の追加に作業が必要なことや機器が目立つなどの理由から却下、次の案としてAlexa経由での音声をトリガとして使う案になりました。また、Google KeepはAPIからの項目追加にそのままでは対応していなかった為、代替サービスを検討した結果、Todoistが色々出来そうだということでそちらに決定しました。
課題2について
こちらについては、Todoistへの項目追加の際に正式な商品名やURLなどを一緒に追加することにより確認できるようにしました
AlexaとTodoistの連携について
以前はAlexaにTodoistのスキルがあったようなのですが、廃止されていました。ですので間にnode-redを噛ませます。
Alexaとの連携の為のnode-redのスキルは当初「node-red alexa home-skill bridge」を検討していました。
しかし、こちら11月4日にて使用不可となるアナウンスが!12月4日現在まだ無効にはなっていないようですがちょっと不安です。そういったことを考えながら色々探していると以下の記事が。
こちらであればAmazonの意向に左右されることもそう無いのではないかと思い、こちらを採用しました。
実装
「買い物リスト」のセクション「家」に「柔軟剤」を追加する仕組みを追加します。
Todoistの設定
-
運用するリストの作成
まずはテンプレートとして公開されている買い物リストをコピーします
買い物リスト-テンプレート
今回はこれをそのまま使います - APIトークンの取得
-
運用するリストのID取得
cURLでAPIにアクセスしてプロジェクト一覧を取得し、"name"が「買い物リスト」の"id"を記録しておきます
curl -X GET https://api.todoist.com/api/v1/projects -H "Authorization: Bearer [さっき取得したAPIトークン]" -
運用するリストで使用するセクション一覧のID取得
前項同様にcURLでAPIにアクセスしセクション一覧を取得し、その中から運用するリストで使用するものの"id"を記録しておきます。セクションを使用しない場合この部分は飛ばしてください。
curl -X GET https://api.todoist.com/api/v1/sections -H "Authorization: Bearer [さっき取得したAPIトークン]"
Node-Redの設定 その1
Node-Redはインストール済みとして話を進めます。
-
node-red-matterのインストール
右上のメニューから「パレットの管理」を選択し、上部「ノードを追加」から「@node-red-matter/node-red-matter」を検索し追加してください。
-
Matterデバイスの追加、設定
左のメニューから「Matter Device Status」をフローに貼り付けます。設定画面から新規でMatterデバイスを設定します。UDPポート番号を「5540」、Device Informationを「Dimmable Light」にしてください。

Alexaの設定
-
デバイスの追加
Alexaアプリからデバイスの追加を選択し、「その他」→「Matter」を選択し「QRコードを読み取る」もしくは「コード番号を入力」を選択してデバイスを追加します。
-
定型アクションの追加
定型アクションの追加で。「実行条件」を「音声」にして「柔軟剤」と入力し、「アクション」で「スマートホーム」から先程追加したMatterデバイスを選択し、「明るさ」を選択し、明るさを任意の数値(今回は4)に設定します。この数値を変えることによりリストに追加する品目を変更することが可能です。
Node-Redの設定 その2
-
functionノードの設定
Alexaの定型アクションからMatter Device Statusに送られてくる明るさの数値は「msg.payload.status.level」となりますが、3.921...のような実数で送られてくるため、functionブロックで四捨五入して整数にします。
var newmsg = {level: Math.round(msg.payload.status.level)} return newmsg; - switchノードの設定
- changeノードの設定 以下のように設定します。「content」は項目名、「description」は詳細(商品名やURL等)になります。 
-
templeteノードの設定
以下のように設定します。「project_id」にはTodoistの設定3.で記録したidを、「section_id」には4.で記録したidを入れてください。「section_id」を使用しない場合には行を削除してくだい。

- http requestノードの設定
動作確認
無事に柔軟剤が買い物リストに追加されました。
あとがき
記事を書いたのは2回目ですが、前回も買い物リストでした、買い物リスト好きだな、私。



