日本向けPV需給シミュレーターがOSSで存在しなかったので作った
——JIS C 8907 × NEDO METPV-20 × Python/Gradio、Hugging Face Spacesで無料公開
なぜ作ったか
家庭用・産業用の太陽光発電やマイクログリッドに関わる仕事を
ひと通りやってきた。
そのなかでずっと気になっていたことが一つある。
「発電量と需要を同時に扱える、日本向けのオープンソースの
シミュレーターが存在しない」
海外にはNRELのSAM(System Advisor Model)という
よくできたツールがある。ただ日本で使おうとすると壁がある。
- 気象データがNEDO METPV-20に対応していない
- JIS C 8907準拠ではない
- 日本の電気料金体系に対応していない
- デスクトップアプリなのでブラウザから触れない
国内はどうかというと、商用SaaSは存在する。
計算精度も高い。ただソースは非公開だ。
(計算ロジックがブラックボックスのまま提案書だけが
飛び交う業界というのは、まあそういうものなのだが)
もう一つの動機を正直に書くと、Claude Codeで
どこまで開発できるかを試したかった。
太陽光はその実験台としてちょうどよかった。
何ができるか
地点・パネル構成・需要プリセットを選んで実行すると、
30分×365日=17,520コマの需給バランスが計算される。
主な機能はこうだ。
発電計算
- NEDO METPV-20(47都道府県)の気象データを使用
- JIS C 8907に準拠した発電量推定
- pvlibによるGHI→POA変換(傾斜面日射量への変換)
- 気温による出力補正(毎時反映)
- 最大8面アレイ対応、面ごとにPCS出力制限を設定可能
需給バランス
- 「電気+ガス併用(5,000kWh/年)」
「オール電化+おひさまエコキュート(7,000kWh/年)」の2プリセット
※おひさまエコキュートは昼間の太陽光で湯を沸かす給湯器で、
自家消費率が上がりやすい世帯向けの想定だ。 - 年間消費量を入力してスケーリング可能
- 自家消費率・自給率を自動計算
蓄電池シミュレーション
- ルールベースの充放電制御(SOC追跡)
- 需給バランスグラフにSOC推移を重ね表示
経済性計算
- 従量電灯B・スマートライフS/L(時間帯別)に対応
- 東京ガス一般料金との比較(オール電化vs併用)
- FIT売電収入の計算(卒FIT後の単価切替含む)
グラフは月別の発電量・需要量・自家消費の比較棒グラフと、
任意の日の30分単位需給バランス曲線の2種類。
数字だけでなく「いつ余っていつ足りないか」が視覚的にわかる。
技術構成
構成はシンプルで、すべてapp.py一枚に収まっている。
気象データ
NEDO METPV-20の47都道府県データをSQLiteに格納し、
地点選択時に30分×365日=17,520コマ分を引き出す構造だ。
データ要素は日射量・気温・風速など10要素。
CSVを直接読むのではなくDBにしたのは、HF Spacesへの
デプロイ時にファイル数を増やしたくなかったからだ。
発電計算(JIS C 8907)
傾斜面日射量への変換はpvlibのErbs分離モデル+
等方性天空モデルを使用している。
月積算ではなく30分単位で逐次計算しているため、
時間帯ごとの需給バランスが出せる。
温度補正係数も毎コマ気温を参照して反映している。
# JIS C 8907 温度補正の実装イメージ
k_pt = 1 + alpha * (cell_temp - 25) # alpha: 温度係数
e_pm = k_prime * k_pt * p_as * h_am / g_s
需要データ(NREL EULP)
需要プリセットはNRELのEnd-Use Load Profiles(EULP)を
日本向けに補正して作成した。
米国固有の消費(電気乾燥機・プール等)を除去し、
月別補正係数で日本の消費パターンに近づけている。
気候区分はASHRAE 4A(東京相当)を使用した。
スタック
| 役割 | ライブラリ |
|---|---|
| UI | Gradio |
| 発電計算 | pvlib |
| 気象DB | SQLite |
| グラフ | Plotly |
| デプロイ | Hugging Face Spaces |
コードはHugging Face Spacesのリポジトリに含まれている。
https://huggingface.co/spaces/hachinai/pv-sim-gh
やってみてわかったこと
NEDOデータと30分解像度の壁
NEDO METPV-20は1時間単位のデータだ。
JIS C 8907の計算自体は月積算でも成立するが、
需給バランスを30分単位で出すには30分に補間する必要がある。
(月平均値で計算すると「いつ余っていつ足りないか」が
見えなくなるからだ)
需要データはNRELから借りて日本向けに直した
日本の家庭の30分単位消費データは公開されているものが少ない。
そこでNRELのEnd-Use Load Profiles(EULP)を使った。
気候区分ASHRAE 4A(東京相当)の一戸建てデータを取得し、
日本向けに以下の補正をかけている。
- 電気乾燥機・プール・電気温水器など米国固有の消費を除去
- 月別補正係数で日本の季節パターンに近づける
完全に日本の実測データではないが、
30分解像度の時系列パターンを得る手段としては
現状これが現実的な選択だった。
データの出所と補正内容をこうして明示しておくのは、
再現性という意味でOSSとして最低限の誠実さだと思っている。
既存ソフトとの設計上の違い
市販のPV設計ソフトは、方位・傾斜角ごとに
NEDOのサイトからデータをダウンロードして読み込む設計が多い。
つまり「東向き5°」と「南向き30°」を比較したければ
それぞれ別ファイルを用意する必要があるか、ブラックボックスに任せるしかない。
今回は水平面日射量(GHI)だけをDBに持たせ、
pvlibで任意の方位・傾斜角に変換する設計にした。
パラメータをスライダーで変えるたびに再計算できるのは
この構造のおかげだ。角度を変えるたびにファイルを
差し替える必要がない。
# GHI → 傾斜面日射量(POA)への変換イメージ
dni, dhi = pvlib.irradiance.erbs(ghi, zenith, doy)
poa = pvlib.irradiance.get_total_irradiance(
surface_tilt, surface_azimuth,
zenith, azimuth, dni, ghi, dhi
)
まとめと今後
作ったものをまとめるとこうなる。
- JIS C 8907準拠の発電計算をpvlibで実装
- NEDO METPV-20(47都道府県)をSQLiteに格納し、
水平面日射量からpvlibで任意の方位・傾斜角に変換 - 30分×365日の需給バランスをブラウザから無料で試算可能
現在は産業用(高圧・特別高圧)向けの拡張を開発中だ。
デマンドチャージ・逆潮流禁止・蓄電池の充放電最適化(LP)
あたりを実装する予定で、住宅用とは別のSpaceで公開する予定でいる。
(そちらは公開したらまた記事を書く)
閉じコンが激しい日本の再エネ業界でOSSが育っていくことに少しでも貢献できればいいが。
