概要編、に続いて今度はソフトウェアとかその開発環境とかの辺りを書こうと思います。
先の概要編にもちょっと書きましたが、以前ESP8266を使った気圧、温湿度のモニタを作りました。皆さん最初?にやるあれ、ですね。このときはは言語をわざわざやったことのないLUAを使って疲れました(笑)が、こういう考え方で作るんだ、というのがわかってくると面白い言語だな、と思いました。
今回は、ESP32をBaseに、より高級言語?のPython使おうか、と思って色々と調べたところ、AdafruitのCircuitPythonなるものを使うことにしました。Adafruit(読みはエイダフルーツ、ですかね。本当はfruitと単数形なので最後は「ツ」じゃないですけれど)という会社、知らなかったのですが面白そうな会社です。社長さんが女性だそうですが、この界隈の方々はお好きそうなモジュールをたくさん作られています。ご興味があれば是非調べてみてください。CircuitPythonはMicroPythonからの派生だそうです。ライブラリが充実しています。
開発環境:
開発環境は、CircuitPythonのWEBページを見ると「mu」(読みはミュー)というeditorが推奨よ、と書いてあるのですが、私のPC環境だとPCのシリアルドライバが認識されず動作せず、色々とWEBをさまよった挙げ句、Thonnyという開発環境が動いたのでそれを使うことにしました。
Thonny(https://thonny.org/)は、「Thonny、Python IDE for beginners」と銘打ってUniversity of Tartu, Estonia.が開発したものだそうです。感謝です。
インストールとESP32への接続:
これについては、ESP32のrevisionとかボードのバージョンとかで違うようなので、入手された環境に合わせて構築が必要です。
私が入手したESP32 Devkit v1に使われているESP32はUSBがNativeでサポートされていないので、スクリプトをDrop&downするだけ動かせる、という機能が使えませんでした。新しいESP32であればこの機能は使えるようですが、入手した後でわかったことなので仕方ないですね。ESP32を入手されるときにはその辺りも確認が必要です。
で、今回はThonnyを使って、USBserialでESP32につないで開発をしましたが、結構使いやすいです。上部のeditor部でeditして、Runボタンを押すと自動的にESP32へダウンロードして自動でRunします。下部のWindowで実行結果が見られます。表示設定をすると変数値の確認とかその他諸々の機能もあります(全く使いませんでしたが、、)。
プログラムの作成とポイント:
プログラムは、必要なライブラリをImportしてPythonで作ってゆくだけなので、色々とあちこちのWEBsiteを参考にして組み立てました。
パワコンからRS485経由で来るデータをSerialを使って読み込み、データを解析して必要なデータを抽出して、WEB(今回もAmbientサービスhttps://ambidata.io/ を使わせて頂いております。ありがとうございます)にPOST送信しているだけです。
ポイントは、POSTするとなにかのタイミングでソフトがコケることがあって(結構落ちます)、それの対処が分からなくて随分Try&Errorしました。
Error自体は、Repeated socket failuresとでてadafruit_requests.pyの中で落ちているようです。色々調べて、海外でのやり取りを見つけましたが、どうやらadafruit_requests.pyの先で落ちているようで、そのやり取りも途中状態でまだFixされていないような感じです。
プログラムがコケるのでWatchDogとかでresetかなぁ、でもそれまでのデータ消えちゃうしどうしようかな、と思っていたのですが、調べてゆくとなんと、Pythonのtry/exceptで救えることがわかりました。素晴らしい。
POSTするところをtryに入れて、Errorが起きたらexception 処理をすることでプログラムがコケるのを救ってくれます。これとても助かりました。これでとりあえず、丸一日動くようになりました。
ポイントのもう一つは、Ambientサービス側。これはサービスの問題なので、Ambientを使わなければ問題ないと思います(もしかしたら我が家側の問題かもしれませんし、、)。そちらにPOSTすると下手をするとそこから戻ってくるのに酷いと10秒以上かかることがあるようで、データを取ってみると上記のexceptionとはまた別な要因があるようです(いえいえ、使わせていただいてありがとうございます、、)。こちらは、POST処理のパラメータにtime_outの項目があるのでそれを使って強制的に戻すようにしました。
その他、Pythonの使い方は今回随分勉強になりました。ライブラリが充実していて助かります。以前、ESP8266で作った気圧、温湿度を単ESP32でCircuitPythonでデータを読み込むだけのプログラムはImport部分を除くとほんの数行(10行いらない、、、3行くらいですかね)でかけちゃいます。素晴らしい、、、。すべて先駆者のおかげです。ありがたいですね。感謝します。
で、処理速度的にはどんな感じ?:
パワコン側からは10秒で20台分のデータが0.5秒間隔で出てくるので、色々と速度も気になっていたのでなんちゃってで計測しながら作りましたが、Idle Loop(他の19地点分の処理の部分)では、3,4回回っていたようですし、262バイトのデータも取りこぼしは無いので処理速度的には問題ないようです。
当初、10秒に一回データが出てくるのでそのままAmbientにそのデータ(瞬時値と累計値程度)を送っていたら、夕方にサーバから429レスポンスが返ってくるようになって、調べたら「TooManyRequests」で、「お前多すぎ」と怒られてしまいました、、。(Ambientさんごめんなさい)
現在は30秒に一回(主ループ3回に一回ですね)に回数を減らしてサーバに送信していますが、パワコンから受信してサーバへの送信が終わると、28秒ほどsoft sleepするようにしています。省エネを目論んでなのですが、soft sleepだし、この電力は太陽光発電からの一部を利用しているのであまり関係無いのかもしれません。Idle Loopも余裕を見て0.3秒ほどのsleepを入れています。もちろん今はパワコンは1台なので、パワコン20台のデータをサーバに送ろうとすると、違う観点の考慮が必要だと思います。
実際の出力グラフ:
ambientでの出力例です。この日は一日晴れていたようです。15時過ぎからはパネルに影がかかって来て急激に落ち込んでいます。
最後にお決まりですが、本記事は自分の修理の備忘録です。修理、分解、稼働しているシステムへの接続を勧めるものでは決して有りません。参考にされる場合はすべて自己責任でご対応ください。
※コメント投稿者のブログIDはブログ作成者のみに通知されます