背景
-
新たな移動の選択肢としてシェアサイクルが普及
-
通勤、通学、観光、ポタリングなど様々な用途で利用されている。
-
GBFSというシェアモビリティの標準的なデータフォーマットがシェアサイクル事業者から公開された。
課題
-
ステーション(貸出・返却場所)に行ったが、自転車がないことがある
-
事前にスマホアプリで確認はできるが、「貸出台数」を画面に表示するまでに30秒から1分程度はかかってしまう。
つくるもの
- ボタンを押すと、設定しておいたステーションの貸出可能自転車数が表示されるスイッチ
やることを3つのステップに分解
- シェアサイクルオープンデータより、貸出可能自転車台数を取得:AWS Lambda の設定
- M5Stackとデータをやり取りするAPIを用意する:AWS API Gateway の設定
- M5Stackで、API経由でデータを取得しディスプレイに表示:M5Stackの使い方
シェアサイクルのオープンデータについて
以下2つの記事に詳しく書かれています。
GBFSについての概要はこちら
GBFSのファイル、カラムについてはこちら
ソフトウェアバージョン
- M5Stack Basic V2.6
- M5Burner 2.28
- UIFlow v1.9.8-en
- macOS Monterey
という組み合わせで突き進んでみたら、エラーたくさん出たけど、何とかプログラムを書き込める状態になりました。
Step1 : AWS Lambda の設定
- 言語はPythonを選択
- Pythonのライブラリを使えるようにLayerにAmazon リソースネーム (ARN) の設定
参考図書
AWS Lambda実践ガイド 第2版
(第1章,第2章)
LambdaでPythonのスクリプトを開発する際、外部ライブラリを利用するにはLayerを用意する必要があります。
幸いにも以下のリポジトリで、有志の方々が作成したLambdaのPythonライブラリLayerが公開されているので使わせていただきましょう。
例として、東京リージョン(ap-northeast-1)でPython3.8を使う場合のパッケージLayer群は以下のサイトに一覧されています。
サンプルコード
import json, requests
import pandas as pd
def lambda_handler(event, context):
#クエリパラメータを変数として利用する
id = event['station-id']
#URLへアクセスしてデータを取得
url = requests.get("https://api-public.odpt.org/api/v4/gbfs/hellocycling/station_status.json")
text = url.text
#変換したいJSONファイルを読み込む
df = pd.read_json(text)
#ネスト(入れ子)構造になっている"data"という項目を展開する
df_json_normal = pd.json_normalize(df['data'][0])
df_json = df_json_normal.query('station_id == @id')[["station_id","num_bikes_available"]]
print(df_json)
output_text = str(df_json.iloc[0,1])
return {
'statusCode': 200,
'id':event['station-id'],
'body': output_text
}
Step2 : AWS API Gateway の設定
- REST API
- GETメソッド
- クエリパラメータの設定
クエリパラメーターを設定して、
https://example.com/groups/station-status?station-id=1234
のように、endpointの末尾でステーションIDを指定すれば、該当するステーションの自転車台数が取得できるようにしました。
例
station-id | ステーション名 | endpoint |
---|---|---|
2468 | グランツリー 武蔵小杉店 | https://example.com/groups/station-status?station-id=2468 |
5668 | ソフトバンク本社前(OpenStreet本社) | https://example.com/groups/station-status?station-id=5668 |
また、ステーションIDについては、
あらかじめ以下のようなプログラムでステーション一覧を取得し、
シェアサイクルスイッチのボタンに反映させたいステーションのIDを調べておこう!
import json
import requests
import pandas as pd
# URLへアクセスしてデータを取得
url = requests.get(
"https://api-public.odpt.org/api/v4/gbfs/hellocycling/station_information.json")
text = url.text
# 変換したいJSONファイルを読み込む
df_json = pd.read_json(text)
# ネスト(入れ子)構造になっている"data"という項目を展開する
df_data = pd.json_normalize(df_json['data'][0])
# JSONをCSVへ変換して文字コードをutf8で出力
df_data.to_csv("hellocycling_station.csv", encoding='utf8', index=False)
Step3 : M5Stackの設定
参考図書
アイデアをカタチにする! M5Stack入門&実践ガイド
の第8章「UIFlowでM5Stackをプログラミングする」を参考にしました。
M5Stack Basicを購入
まずは以下のリンクからM5Stack Basicを購入
2023年6月7日、M5Stack Basic v2.7が発売となりました。v2.6は販売終了となります。
v2.6 は ¥6,500、ちなみに現在購入できる v2.7 は、¥6,391 (2024年1月現在)
ちょっと安くなってうれしいですね。
M5Stackの基本操作
USBケーブルなどで電源を供給していない状況で、
- 赤い電源ボタンを押すを起動
- 赤い電源ボタンをもう1度押すを再起動
- 2度連続で押すと電源OFF
M5Burner
UIFLOW FIRMWARE BURNING TOOL をダウンロード
M5Burner をインストールして立ち上げると以下のような画面が現れる。
M5Stack UIFlow の Wifi 設定方法
毎回悩むので、備忘録を兼ねて綴ります。
ずっと、M5 Burnからやり直しかと勘違いしてましたが、
以下のように簡単にできるとは知らなかったです。
という文章から始まるのですが、まさに私も同じ状況でした。こんなに簡単にWifiの設定できたんだと感動しました。
UIFlow ( https://flow.m5stack.com/ ) サーバーへアクセス
やっていることとしては、「インターネット経由で UIFlow と M5Stack を接続」 している。
その際に、M5Stackに表示された API KEY を入力して接続する。
「ボタンを押したら、APIでラック数のデータを取得しディスプレイに表示する」フローを作成する。
パーソナライズドサイネージの完成
完成した様子をXに投稿したので御覧ください!
音も入ってます!