私は、低電力、低コストのWi-Fi対応マイクロコントローラーのESP32-S2プラットフォームの大ファンです。 Adafruitは、 MagTagと呼ばれる2.9フィートのEインクディスプレイとPythonサポートを備えたバリアントを具体的に販売しています。 私は自分のアパート全体に散らばっているこれらのものがあまりにも多くあることを認めることを恥じていません。
私のお気に入りの組織の1つは、 データの世界(OWID)です。 彼らは何千人もの研究者と協力して、研究とデータを一般に公開しています。 特に、私はCOVIDワクチン接種率を追跡する 彼らのレポ を注意深く見守っています。 世界中の多くの機関がワクチン接種率の指標を更新すると、OWID はそのデータを 1 つの JSON ファイルに統合します。
MagTagとOWIDのデータセットの組み合わせは、DockerのDevRelチームの最新メンバーとしての最初のプロジェクトに影響を与えました。 私はMagTagを私がフォローしている特定のOWIDのディスプレイに変えることにしました。 しかし、私は始めている間にいくつかの問題に遭遇しました。
OWID は、JSON データ コレクションを API エンドポイント経由で提供するのではなく、生の JSON (または CSV) ファイルとして GitHub にアップロードします。 合計ペイロードも34MBです。 それは巨大ではないようですが、MagTag自体には4MBのフラッシュストレージと2MBのPSRamしかありません。 これは、そのすべてのデータを解析するのに十分なメモリにはほど遠いです。 幸いなことに、私はデータ処理レイヤーを作成するためにいくつかの予備のRaspberryPiを指揮しました。 Python を使用すると、イメージを処理するための迅速な Flask サーバーを起動することができ、Docker のおかげで、コンテナー化されたサービスをわずか数秒で Raspberry Pi にデプロイできます。
私のPiは、Docker HubからArmv7用に構築されたイメージをプルします。 そのコンテナーは、ローカル ネットワーク上でアクセス可能な API エンドポイントを作成します。 そこから、MagTagはPiに国のデータを要求できます。 Pi は OWID から最新の JSON ファイルを取得し、MagTag が探している情報だけを取り出し、それを渡します。 この方法により、データペイロードが34MBからKB範囲に削減され、IoTデバイスにとってはるかに管理しやすくなります。
そうは言っても、コードに飛び込みましょう。
ソリューションのコーディング
コードを読むだけの場合は、 GitHub または Docker Hub にアクセスしてデプロイ手順を確認してください。
データ処理
Raspberry Pi のデータ処理機能はかなり軽量であることを知っていたので、Flask サーバーを立ち上げて、JSON を jsonify で処理する Flask の組み込み機能を利用することにしました。 OWIDからデータを取得するためのリクエストライブラリも非常に便利でした。
[パイソン]
フラスコインポートフラスコから、jsonify
インポート要求
app = Flask(__name__)
[/パイソン]
このプロジェクトでは、ルートは 2 つしか必要ありません。 1 つは、API がオンラインであることを確認するためのヘルスチェックとして機能します。
[パイソン]
# サービスが稼働しているかどうかを確認するためのヘルスルートの設定
@app.route("/")
@app.route("/health")
デフhello():
response = jsonify({"status": "API online"})
response.status_code = 200
応答を返す
[/パイソン]
第二に、そしてより重要なことは、OWIDデータセットに到達するためのルートです。 このルートは、要求された ISO コードの 34MB JSON ファイルを解析し、最新のデータを取得して、Raspberry Pi 用にフォーマットします。
[パイソン]
# 要求された ISO コードのデータを要求するための GET ルートを設定します。
@app.route("/iso_data/<iso>", methods=["GET"])
デフiso_data(ISO):
# GitHub から OWID データを取得する
vaccination_url = "https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/vaccinations/vaccinations.json"
試みる:
予防接種= requests.get(vaccination_url)
除く:
「False」を返します
vaccinations_dict = {}
#ラムダとフィルターを使用して、要求されたISOコードを見つける
item = list(filter(lambda x: x["iso_code"] == iso, vaccinations.json()))
アイテムの場合:
item = アイテム[0]
#データが見つかった場合は、応答用にフォーマットします。
vaccinations_dict = {
"data": item["data"][-1],
"iso_code": item["iso_code"].replace("OWID_", ” “),
"country": item["country"],
}
応答= jsonify(vaccinations_dict)
#OWIDデータのミラーであるため、 203 を返します。
response.status_code = 203
然も無くば:
#データが見つからない場合は、 404を返します。
応答= jsonify(
{"status": 404, "error": "見つかりません", "message": "無効なISOコード"}
)
response.status_code = 404
応答を返す
[/パイソン]
最後に、依存関係をインストールし、要件ファイルを生成するためのコードを取得する必要があります。 私は pyenvを使用してPython仮想環境を管理していますが、それを好みの方法に置き換えます。
[バッシュ]
pyenv virtualenv 3.10.1 フラスコ-owid-サーバー
pyenv activate flask-owid-server
pip install flask 要求
pipフリーズ> requirements.txt
フラスコラン
[/ bashの]
次に、新しいシェルプロンプトを開き、Flaskサーバーにcurlリクエストを送信して、すべてが期待どおりに実行されていることを確認します。
[バッシュ]
curl localhost:5000
curl localhost:5000/iso_data/USA
[/ bashの]
Flask サーバーのドッキングとデプロイ
機能するFlaskサーバーを使用すると、それをDocker化し、Raspberry Piのアプリデプロイプロセスを簡素化できます。 まず、Dockerfileを作成しました。
[シェル]
Python 3 の基本イメージ #Use。
Pythonから:3-slim
#Expose ポート
5000を公開
#セットアップ作業ディレクトリ。
WORKDIR /app (英語)
# 要件ファイルをコンテナーとインストール依存関係にコピーします。
requirements.txt /app をコピー
pip3 install -r requirements.txt –no-cache-dirを実行します。
# すべてのコードをコンテナにコピーします。
写し。 /アプリ
#フラスコサーバーを起動します。
ENTRYPOINT ["python3"]
CMD ["app.py"]
[/シェル]
この Dockerfile を配置したら、Docker ビルド コマンドを実行してイメージを作成できます。
[シェル]
docker build –tag {yourdockerusernamehere}/flask-owid-parser:latest を実行します。
[/シェル]
新しく作成したイメージを Docker Desktop から実行しながら、コンテナーに名前を付け、ローカル ポートを 5000 に設定することができます。
コマンドラインを使用したい場合は、Docker CLIのようなもので同じ効果を得ることができます。
[シェル]
dockerコンテナ実行–publish 5000:5000 –detach –name flask-owid-parser {yourdockerusernamehere}/flask-owid-parser
[/シェル]
もう一度、localhost:5000 に curl 要求を行い、すべてが正しく実行されていることを確認します。
マシンですべてを検証したら、Raspberry Pi で実行するアプリケーションをビルドできます。 この例のRaspberry Pi 3 Model Bはarmv7 プラットフォームを使用しているため、armv7をターゲットにしたビルドを作成できます。 このビルドを MacBook で実行すると、ビルド時間は Raspberry Pi よりも大幅に短縮されます。
[バッシュ]
docker build –platform linux/arm/v7 -t {yourdockerusernamehere}/flask-owid-parser:armv7 を実行します。
[/ bashの]
Docker デスクトップに戻ると、armv7 ビルドを Docker Hub にプッシュできます。
Docker Hubにアクセスして、armv7ビルドが正しく表示されることを確認します。
ラズベリーパイにSSHで接続して、このコードのデプロイを開始します。 Docker をまだインストールしていない場合は、Pi で Docker の使用を開始する手順については、 ドキュメントを参照してください 。
次に、Docker Hubからarmv7 イメージをプルし、Raspberry Pi上で実行します。
[バッシュ]
docker pull {yourdockerusernamehere}/flask-owid-parser:armv7
docker run -d -p 5000:5000 –name flask-owid-parser shyruparel / flask-owid-parser:armv7
[/ bashの]
元の MacBook に戻ると、サーバーが稼働していることと、ローカルネットワークからアクセス可能であることの両方を、最後の curl リクエストで確認できます。 Raspberry Pi OSの新規インストール時のデフォルトのホスト名は、 であるため raspberrypi
、Pi OSを実行しているRaspberry Piは、自動的に に応答します raspberrypi.local
。 それでもうまくいかない場合は、Raspberry PiのIPアドレスと交換 raspberrypi.local
してください。
[バッシュ]
ping -c 3 raspberrypi.local
curl raspberrypi.local:5000
curl raspberrypi.local:5000/iso_data/USA
[/ bashの]
マグタグの設定
私のお気に入りのMagTag機能の1つは、サーキットPythonのサポートです。 依存関係のインストールに使用するのを忘れてください pip
。 代わりに、単にコピー .mpy
してください あなたのコードと一緒にUSB経由でマグタグに。 初めてMagTagをセットアップするために、私はAdafruitの人々によってまとめられた 優れたチュートリアル に任せます。
このプロジェクトを MagTag にインストールするには、このプロジェクトのコードを含む GitHub リポジトリ にアクセスします。 すべてのコードを MagTag ディレクトリから USB 経由で MagTag にドラッグします。
code.py を検査する場合 ファイルを見ると、MagTagがRaspberry Piに接続するように構成されていることがわかります。
[パイソン]
# エンドポイントの構築
endpoint_iso_first = "http://raspberrypi.local:5000/iso_data/{}".format(
シークレット["iso_first"]
)
[/パイソン]
secrets.py を更新する ファイルを使用して、独自のWifiネットワークの情報を含めます。 MagTagとRaspberry Piが同じネットワークを共有していることを確認してください。
MagTagを再起動して、Our World in Dataの人々が投稿した最新情報を確認します。
GitHub にアクセスして、依存関係を含むこのプロジェクトの完全なソース コードと、Docker Hub 上のイメージへのリンクを見つけてください。初めての Python および Docker ユーザーは、Python 開発者向けの クイック スタート チュートリアル を参照する必要があります。
略歴:シャイ・ルパレルは、Dockerのシニア開発者アドボケイトです。 彼はほぼ10年間、開発者コミュニティのエンパワーメントに取り組んできました。 彼は愚かなIoTプロジェクト、良いジョーク、そして毎日Twitterであなたに素晴らしい一日を願う持続力に情熱を持っています。