せっかく手元にPico Wがあるので,今の温度を教えてくれるBotを作ってみます.
本来であれば
- ユーザーが送信したLINEメッセージをトリガーとしてPico Wに送信し,
- Pico Wが温度を計測してユーザーに送信する
とよいのですが,諸々の事情から今回は
- Pico Wが定期的に温度をスプレッドシートに記録し,
- ユーザーからリクエストがあったとき,最新の値を送信する
システムをつくります.
-
LINE Botが使用するスプレッドシートとは別に,Pico Wが記録するスプレッドシートを作成します.
Google Driveにアクセスし,任意の場所で左上の新規
→スプレッドシート
をクリックします. -
先ほど作成したスプレッドシートと混合しないようにするために
左上の無題のスプレッドシート
をクリックして名前をPico W
に変更しておきます. -
上部の
拡張機能
からApps Script
を開き,書きかけのmyFunction
関数を削除して以下のコードに置き換えます.function doPost(e){ let sheet = SpreadsheetApp.getActive().getActiveSheet(); sheet.appendRow([new Date(), e.postData.contents]); }
-
左上の
無題のプロジェクト
をクリックして名前をPico W
に変更しておきます. -
右上の
デプロイ
→新しいデプロイ
をクリックし,種類を選択
の右にある歯車⚙
からウェブアプリ
を選択します. -
表示された設定のうち,
アクセスできるユーザー
を全員
に変更し,デプロイ
をクリックします. -
アクセスを承認
をクリックし,ご自身のGoogleアカウントを選択します.
Google hasn't verified this app
と表示されますが,左下に小さく表示されたAdvanced
から
Go to Pico W(unsafe)
をクリックします. -
スプレッドシートの編集などを求める権限リクエストが表示されますので,
Allow
をクリックして許可します. -
問題なければ,デプロイIDとウェブアプリのURLが発行されます.
このうちウェブアプリのURL
をコピーして,メモ帳などのアプリケーションに記録しておきます. -
Windowsの方はコマンドプロンプト(Win+R→
cmd
→Enter)またはWSL上のBash,Macの方はターミナル.appで以下のコマンドを実行します.
PowerShellではcurl
をcurl.exe
とする必要があります.curl -X POST -H "Accept: application/json" -H "Content-type: application/json" -d "テストメッセージ" ウェブアプリのURL
実行後,
<!DOCTYPE html><html>〜スクリプトが完了しましたが、何も返されませんでした。〜</html>
と出力されますが,スプレッドシートに正しく情報を記録できていればOKです.
-
Thonnyを開いて,Pico Wへ以下のコードを書き込んでください.
Wi-Fiのパスワードとデプロイ時に発行されるURLの挿入を忘れないようにしてくださいね.import network from time import sleep import machine import urequests ssid = "KIT-EVENT" password = "要置き換え" url = "https://script.google.com/macros/s/この部分を置き換える必要があります/exec" def connect(): # Wi-Fiに接続 wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(ssid, password) while wlan.isconnected() == False: print("Waiting for connection...") sleep(1) ip = wlan.ifconfig()[0] print(f"Connected on {ip}") return ip def send_sheet(message): headers = { "Content-Type": "application/json" } response = urequests.post(url, data=message, headers=headers) if response.status_code == 200: print("Notification sent successfully") else: print("Failed to send notification, status code:", response.status_code) response.close() def get_outside_sensor_temp(): sensor_temp = machine.ADC(28) conversion_factor = 3.3 / (65535) reading = sensor_temp.read_u16() * conversion_factor temperature = reading/0.01 - 50 return temperature try: ip = connect() while True: # LEDが光っている間は送信中 machine.Pin("LED", machine.Pin.OUT).on() send_sheet(str(get_outside_sensor_temp())) machine.Pin("LED", machine.Pin.OUT).off() sleep(3) except KeyboardInterrupt: machine.reset()
実行後,スプレッドシートに値が記録されていればOKです.
前半の制作物を活用して実装します.
あえて説明を減らしています.よくわからない箇所は検索や周囲の人に頼りながらやってみましょう.
-
前半で作成した
LINE Bot
というタイトルのスプレッドシート・Google Apps Scriptプロジェクトを開きます. -
doPost
関数に,以下のように実装します.-
ユーザから
教えて
というテキストメッセージが送信されたら,
Pico W
シートに記録された温度の値を返信する💡ヒント
-
予めPico WのシートからLINEシートの特定の位置に,スプレッドシートのIMPORTRANGE関数を利用してデータを取り込んでおく
// GAS単体でも実現できます -
// TBD
の箇所に,上記関数で取り込んだセルの内容を送信する
参考:Google Apps Script と LINEを使ったオウム返しBotの作成方法
-
-
その他のテキストメッセージや,テキストでないメッセージが送信されたら,
このBotの使い方を教えるメッセージを返信する
-
ここまでできたら,ぜひLINE Developersのコンソール画面やLINE Official Account Managerをいろいろ触ってみてください.
友達登録後に自動でメッセージを送信したり,ご自身で開発するWebアプリケーションにLINEログインの機能を追加したりすることが簡単にできます.
APIの扱いに慣れている人は,Messaging APIリファレンス を参照してより高度なBotの開発に挑戦してみましょう.
グループトークで活躍できるBotを作ったり,企業の公式LINEでよくあるリッチメニューやボタンを作ったりすることだってできます.
Chat GPTなどの生成系AIと連携させることでより簡単に高機能なBotを作れるかもしれません.ぜひいろいろと試してみましょう!
困ったときは遠慮なく近くのCore-team Memberにお声掛けくださいね.
4-(a) MQTT・クラウドサービスを使った本格IoT へ進む
4-(b) 他のボードやセンサ,ディスプレイなどを試してみる へ進む