おもちゃ、家電、もろもろの修理の足跡と備忘録

色々と忘れるので、趣味のメモ

太陽光パワーコンディショナからのデータを見える化してみた(サーバへの転送時Errorの話)

2023-12-17 09:12:16 | 太陽光パワコンデータの見える化

 先のソフトウェア周りの話のところ書きましたが、今回、CircuitPythonでambientへ書き込み時にCircutPythonの先の深いところでエラーが起きてアプリが落ちる事がありました。
 Error自体は、Repeated socket failuresとでてadafruit_requests.pyの中で落ちているようです。色々調べて海外でのやり取りを見つけましたが、どうやらadafruit_requests.pyの先で落ちているようで、そのやり取りも途中状態でまだFixされていないような感じです。
未だ根本解決はしていないようですが、今回はPythonのtry/exceptで救える事がわかったのでその対処をしていて、どのくらいの頻度で落ちているのかを知るために失敗した次の成功した転送でその状態をサーバに送るようにしていました。
 上の3枚のグラフは、2023/12/6、12/7、12/8の横軸時刻、縦軸が緑が転送にかかった時間(sec)、紫がサーバからのresponce値(失敗した場合は1000を足しているので急に立ち上がっているところが前回失敗しているところ)です。転送に要した時間は、プログラムの中で8秒でタイムアウトするように設定しているので、実際にはもっとかかっているものもありますが所望の動作です。
 問題の紫のグラフですが、真ん中の12/7のお昼ころを境に明らかに挙動(頻度)が変わっています。もちろんESP32側のソフトウェア環境は継続して動作しているので変わっていません。この後も一日数回から10回程度のエラーは起きていますが頻度は以前と明らかに違います。途中経路のNetwork側の設定が変わったのか、サーバ側の設定が変わったのか、どちらにしてもESP32/CircuitPythonの外部の要因がきっかけでこのエラーの発生頻度が大きく変わる、ということはわかりました。
 今回はtry/exceptでアプリ側で救えているので良いですが、複数のシステムが絡んでいるとこういうところは難しいです。

太陽光パワーコンディショナからのデータを見える化してみた(動かしてみたらアプリが消えたり編)

2023-12-17 09:00:09 | 太陽光パワコンデータの見える化
[最終的なシステム概要を追加 2023/12/16 21:00]
[遅延回路?に一部追記 2023/12/17 9:00]



その後ですが、とりあえず、このまま動くかなと思っていたのですが、そうはうまくゆきませんでした。
朝、ambientを覗くとデータが上がっていない。あれっ、と思って見にゆくと、変なタイミングでESP32の青いランプが点滅。外してPCに繋いで見ると、アプリが消えていました。なんで? うまく動く日もあれば、python sourceだけ消えていたり、中途半端にソフトが消えてしまっていてBootすらしていない日も。
で、見つけました。朝、微妙に発電はし始めているが、まだ電力連携が始まっていないという時に、なんとパワコンからの12Vが、1秒間隔位で点滅を繰り返していました。ESP32的には、「電源が入った、Bootするか」と青のLEDが点灯するような微妙なタイミングで電源がOffになる、を繰り返されていたようです。

12V:(夜間)OFF→(日の出)1秒間隔位でON/OFFの繰り返し→ON→
で、安定しない時は
→ON→OFF→ON、とか→ON→1秒間隔の点滅→ON→

というような動作をしていることがわかりました。さて、どうする。

対処1:降圧した5Vに大きめのキャパシタを挿入
 5Vラインに接続してあった、5V電源確認用のLEDも電力節減?のために切断したりしてやってみましたが、うまくゆきませんでした。ESP32の消費電力を賄うそれなり?の大きさのキャパシタ分が必要ですね、、、。(真面目に計算していません、、)

対処2:ESP32のEN端子(Enable端子、内部で弱Pull-Upされているようです)をC/Rで制御して、点滅している間は起動しないようにする
 これうまく行きました。LTspiceを久しぶりに引っ張り出して、「点滅している間はhigh-Levelにならない、数秒のON継続でhigh-Levelになる」をシミュレートして5Vのラインで検出する回路を入れました。実際には計算通りゆかないので、Try&Errorで抵抗を追加しましたが、この一週間程毎朝無事に起動してくれています。 [後日PICで回路を追加しました。太陽光パワーコンディショナからのデータを見える化してみた(毎朝のESP32の起動制御改)参照の事。2024/1/24追記]
こういうところ、「やってみないとわからない」、システム化の苦労?面白い?ところですね。

後は、電源確認用LEDを5Vラインに入れていました(シガーライタ用の基板についていただけ)が、それは切断、12V側に緑色のLEDを挿入しました。

純正のモニタは、もちろんしっかりちゃんとできていて、12Vが点滅している間は表示はしない、ある程度継続すると表示が出る、安定して電力連携が開始されると電力連携の緑LEDが点灯する、でした。データの中に電力連携のビットがあるのでしょうけれど、累積電力量が受信データの中にあるので、起動したときの累積電力量との差分を取ると当日の発電量はわかるので良しとしています。

現時点でのシステム概要構成:


LTspiceのライブラリ追加の場所(v17.1.x)

2023-12-16 10:38:36 | ソフトウェア環境
LTspiceを久しぶりに使って、インストールしてみたらライブラリの場所が前と違っていたので備忘録。

LTspice v17.1.15 (2023/12/16)
C:\Users\{user_name}\AppData\Local\LTspice\lib

古いLTspiceは、
C:\Program Files の下の \LTspiceなんちゃら の下の\lib

v17.1.15の場合は、
C:\Program Files\ADI\LTspice
には、lib.zip というzipファイルがあるが、多分これを上記AppData以下に展開しているのではないかと思う。

TIPS:
ちなみに、Windowsで、ファイルの在処(Path)をコピーする場合は、Explorer上の該当ファイルを「Shiftを押しながら右クリック」で真ん中辺りの「パスのコピー」を選択 → クリップボードにコピーされるので、必要なところでPaste。前後に「”」が着くので注意。


太陽光パワーコンディショナからのデータを見える化してみた(ハードウェアとか編)

2023-11-19 17:45:20 | 太陽光パワコンデータの見える化

ハードウェアは、こんな感じにしました。
 上からDC/DCコンバータ(12Vto5V)、ESP32devkit v1、RS485/TTLレベルコンバータです。DC/DCコンバータは、手元にあって使わなくなっていた車用シガーライタUSB電源を流用しました。入力段にフューズ抵抗*(抵抗値を持った、ヒューズ)らしきものが入っていましたので、そのまま使っています。 何かあったとき?に今回作ったものをそのまま取外しができるように右上に12Vの電源(+/GND)とその下にRS485の信号(A+/B-)のデュポンコネクタを設置して接続しています。
 左上にESP32devkit v1への電源切替用スイッチで、パワコンからの電源(スイッチ上向き)とそれの切断(スイッチ下向き)です。切断はESP32のアプリをUpdateする時やDebugする時に、microUSBからの電源とぶつからないようにするものです。一応パワコン側からの5Vには順方向にダイオードを入れておきました。
 RS485/TTLコンバータは、基板の上にTXD/RXDのモニタ用LEDがついているので、RS485ライン上の受信データの状態がわかります。
 ESP32devkit v1は、RS485/TTLコンバータからシリアルデータを受信して、サーバへデータの転送を終えるまでの間基板上の青いLEDを点灯させるようにしていますので、先の記事で書いた、サーバ書き込み時の異常(長時間responceが帰ってこない状態)の時には長時間点灯するので目視でわかります。当たり前ですが、よく見ると(この写真には写っていないです、、)、RS485/TTLコンバータで受信時のLED点灯と、ESP32devkit v1上の青いLED(処理中表示)が連動(コンバータで受信して、続けてESP32で処理)しているのがわかります。
 あとESP32 devkit v1自体も基板からはずせるようにしたかったので、ICコネクタを道具箱から探してきて、コネクタの真ん中で割って足の幅にあわせてはんだ付けしました。ESP32 devkit v1の挿入がとっても硬い、、。
 今回はハードウェア的には何を作ったわけではなく、モジュールを繋げただけ状態なのであまり面白みは無いです、、。

*:別件もあって、ヒューズ関連を調べていたのですが、WEBの記事の中にはヒューズ抵抗と抵抗型ヒューズを混同した記載もあるようです。ヒューズ抵抗は通常はカラーコード記載の抵抗値を有していて、過電流が流れると切れるもので、抵抗型ヒューズは、リードタイプの抵抗器の形状をしたヒューズ(抵抗値はほぼ無い)です。ヒューズ抵抗の方が数値のばらつきが大きいそうです。ちなみに、メーカによって違うようですが、カラーコードの最後が緑や白のものもあるらしいです。今回は緑でした。

太陽光パワーコンディショナからのデータを見える化してみた(ソフトとか編)

2023-11-12 12:16:53 | 太陽光パワコンデータの見える化
 
 概要編、に続いて今度はソフトウェアとかその開発環境とかの辺りを書こうと思います。

 先の概要編にもちょっと書きましたが、以前ESP8266を使った気圧、温湿度のモニタを作りました。皆さん最初?にやるあれ、ですね。このときはは言語をわざわざやったことのないLUAを使って疲れました(笑)が、こういう考え方で作るんだ、というのがわかってくると面白い言語だな、と思いました。
 今回は、ESP32をBaseに、より高級言語?のPython使おうか、と思って色々と調べたところ、AdafruitCircuitPythonなるものを使うことにしました。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時過ぎからはパネルに影がかかって来て急激に落ち込んでいます。

最後にお決まりですが、本記事は自分の修理の備忘録です。修理、分解、稼働しているシステムへの接続を勧めるものでは決して有りません。参考にされる場合はすべて自己責任でご対応ください。