LoginSignup
1
1

シェアサイクルのオープンデータ(GBFS)とM5Stackを使ってパーソナライズドサイネージを作ってみた!

Last updated at Posted at 2022-12-10

背景

  • 新たな移動の選択肢としてシェアサイクルが普及

  • 通勤、通学、観光、ポタリングなど様々な用途で利用されている。

  • 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メソッド
  • クエリパラメータの設定

クエリパラメーターを設定して、

API endpoint
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を調べておこう!

station_info
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を購入 

1C99B4C2-AAB0-45A7-B063-85CC8ECC18B9.png

まずは以下のリンクから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 をダウンロード
D7889418-41E0-42C8-BE57-CE276C6BD560.png

M5Burner をインストールして立ち上げると以下のような画面が現れる。

A9D7EF74-3669-4028-BF8C-232A2DA92C38.png

M5Stack UIFlow の Wifi 設定方法

毎回悩むので、備忘録を兼ねて綴ります。
ずっと、M5 Burnからやり直しかと勘違いしてましたが、
以下のように簡単にできるとは知らなかったです。

という文章から始まるのですが、まさに私も同じ状況でした。こんなに簡単にWifiの設定できたんだと感動しました。

UIFlow ( https://flow.m5stack.com/ ) サーバーへアクセス

BF19947F-F537-4C87-9FD0-7314B5098852.png

やっていることとしては、「インターネット経由で UIFlow と M5Stack を接続」 している。
その際に、M5Stackに表示された API KEY を入力して接続する。

「ボタンを押したら、APIでラック数のデータを取得しディスプレイに表示する」フローを作成する。

パーソナライズドサイネージの完成

完成した様子をXに投稿したので御覧ください!
音も入ってます!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1