chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

勉強会で使っている家電EmulatorをPygameで作り直す

背景:某所でIoTプログラミング研修会をやっていて、もう歳とった*1ので終わりにしたい。が続けてくれと言われている。
アプローチ:授業が楽になるように、講義内容や教材を簡略化する
具体策:HomeGWを不要にして家電Emulatorに一本化にする(詳細は省略*2)。家電Emulatorの画面イメージは以下

家電EmulatorはPygameで作りなおす。家電Emulatorか、クラウドサーバでECHONET Lite WebAPIを受ける。家電EmulatorにAPIを持たせるとアプリが複雑化してしまうので、家電Emulatorは絵作りに集中したい。ビジネスロジックというのか、そとヅラ(規定を満たすAPI)はクラウド側に任せたい
デスクトップアプリをさくっと作る方法を調べたけど、それほど時間もかけられないので、普段から使い慣れているPythonGUIライブラリで実装したい。TkinterPyQtが標準らしいが、eventloopの扱いがちょっと面倒になりそうで、やりたいことはクリックして画像パーツ(エアコンの風イメージとか)が切り替わったり、外部との通信で、イラストの家電の状態が変わることなので、どちらかというとゲーム作りに近い。となると、Pygameが良かろうという結論になった。EventLoop見ていると、Processingの考えに近い印象もあるし。

普段はCygwin上でPythonを動かしていて、pipでpygameを入れるとエラーになる。Cygwinインストーラで入れる必要がある。しかも、python3.9版はまだポーティングされていないようで、入れられるのは3.8用。だから、3.8指定で起動する必要あり

$ python3.8
Python 3.8.16 (default, Mar  9 2023, 23:30:21)
[GCC 11.3.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 2.0.1 (SDL 2.0.7, Python 3.8.16)
Hello from the pygame community. https://www.pygame.org/contribute.html
>>>

pygameのTutorialのサンプルを動かしてみた。video deviceが無いと怒られる。Cygwinpygameを動かすには、X11を走らせないといけないのではと思われる。だんだんと面倒になってきた。Windows環境+PythonGUIはスジ悪なんだろうか。。windowsPythonだったら動くのだろうか。。あるいはJupyterとか??(普段使ってないのだが)

$ python3.8 test.py
pygame 2.0.1 (SDL 2.0.7, Python 3.8.16)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    screen = pygame.display.set_mode((1280, 720))
pygame.error: No available video device

Pygameを使わないとしたら、Unityか。Unityの場合、MQTT通信とかできるのかちょっと分からず。特に、EventloopとMQTT等の通信処理がうまく協調できるのかどうか・・

■追記
pygameによる家電Emulatorは絵面とマウス操作への反応まではだいたいできた。

あとはmainloopでMQTTのポーリングを入れたら、ユーザからのリクエストとサーバからのリクエストの両方がmainloopで処理できるのでは?と安易に考えている。だが、、、そもそものアーキとして、RPi上か、PC上でMQTTで接続できるだけの家電Emulatorを動かすのって、アーキテクチャ設計的にどうなのか?という気がしてきた。ECHONET WebAPIのendpointをクラウド側に持たせるなら、家電EmulatorもJavascriptでブラウザ内で動いた方が必要な機材も減っていいのではないか。。
[NodeRED on RPi]----->[ECHONET Lite Web API on AWS][Emulator Endpoint]<------[家電Emulator(JS) on PC]
Node.js+Socket.IOで作る、通信対戦ができるHTML5ゲームシステムの作り方 - Yahoo! JAPAN Tech Blog
Must Know JavaScript API — WebSockets API | by Chris1993 | May, 2023 | JavaScript in Plain English

■追記
mqtt libraryのpaho mqttと連動させた。loop_forever()で待たせるとループがMQTTに行ってしまってPygameのメインループが動かなくなるが、以下のloop_start()でMQTT受信させるとThreadが生成されるのか、MQTT通信の受信をしつつ処理が戻ってくるので、MQTT 受信と Pygameのmainloopが並行実行可能となる(厳密に並行なのかどうかはソース確認していないので不明)

client.loop_start()


■追記
家電EmulatorをPython+Pygameで作り直しているが、JavaScriptで作ると生徒はブラウザだけで学習を始められる(講師側もPCやラズパイにEmulator入れる必要がない)。JavaScriptcanvasを使って絵作りして、Socket.IOでサーバと双方向通信させる方がよりシンプルではないか。
HTML Canvas を利用して画像を描画する : JavaScript プログラミング | iPentec
【JavaScript入門】誰でも分かるWebSocketによるデータ送受信の方法 | 侍エンジニアブログ
Node.js | Socket.IOでリアルタイム双方向通信 - わくわくBank

といいながら、、ECHONET Lite WebAPIがグローバル環境での提供を想定しているとは考えにくく、あくまで家庭のLANに置かれるHogeGateway用のAPIだと思われるのだが。。その理由は、ECHONET Lite Web APIにはユーザ認証とか家の概念がない。認証は仕様から除外するということなので、、どのような環境でWeb APIを提供するのかは設計者に任されているということなのかもしれないが。。契約済み利用者に対してグローバル環境で使ってもらうのであれば、認証トークンを振り出す際に、ユーザと家情報(GateWayID)を紐づけることになるのだろう。。

■ご参考URL
Pygame本家
Pygame Front Page — pygame v2.4.0 documentation
よくまとまっている東北大様の解説記事
2. hello, pygame — コンピュータ実習I (Python)
CygwinPygame動かしたかったら、X-window環境を構築しろというコメント
python - pygame running in cygwin - no available video device? - Stack Overflow

*1:もうすぐ定年退職

*2:Sonyの萌え家電をベースに作り変えた。言語はProcessing