産業用PV+蓄電池シミュレーターを作った
——高圧デマンドチャージ・充放電スケジュール最適化・最適容量探索まで
住宅用から産業用へ
以前の記事で住宅用PV需給シミュレーターを公開した。
住宅用を作り終えたとき、次にやるべきことは自明だった。
産業用だ。
住宅用と産業用では、電気料金の構造がまったく違う。
住宅用は使った量(kWh)だけで料金が決まる。
産業用(高圧・特別高圧)は違う。
産業用電気料金 = 基本料金 + 電力量料金
基本料金 = 基本料金単価(円/kW)× 契約電力(kW)× 力率割引
契約電力 = 過去12ヶ月の30分デマンド最大値(実量制)
つまり、1年に1回でも電力の使い方が集中した瞬間が、
12ヶ月分の基本料金を決定する。
東京電力EPの高圧Aなら基本料金単価は1,890円/kW。
契約電力が68kWなら基本料金だけで月12万円を超える。
これを下げることが産業用PVシミュレーターの核心だ。
何を作ったか
住宅用から引き継いだもの:
- JIS C 8907準拠の発電計算(pvlib)
- NEDO METPV-20(47都道府県)
- 30分×365日=17,520コマのフレームワーク
産業用として新たに追加したもの:
- 高圧・特別高圧の電気料金体系(デマンドチャージ)
- 月別最大デマンド追跡グラフ(導入前後比較)
- 複数施設合算UI(NREL ComStockベースの6建物タイプ)
- 蓄電池の充放電スケジュール最適化(PuLP/CBC線形計画)
- 蓄電池の最適容量探索(2段階アプローチ)
- 産業用FIT売電・逆潮流禁止・CO2削減量
以下、PV100kW+蓄電池の条件で
デマンドがどう変化するかを順に見ていく。
① PV100kWだけ入れるとデマンドはどう変わるか
PV100kW導入後、契約電力は68kW→57kWに下がった。
昼間の需要をPV発電が肩代わりするため、
日中のピークデマンドが自然に抑制される。
ただし夏の夕方など、PV発電が落ちた後に需要が高い時間帯は
カットできない。7月の最大値68kWもそういうコマで発生している。
② 蓄電池15kWhを追加しても、ルールベース制御では変わらない
蓄電池15kWhを追加した。
しかし契約電力は57kWのまま変わっていない。
理由はルールベース充放電制御の限界だ。
「昼間にPV余剰で充電し、夜間に放電する」という
単純なルールでは、デマンドピークが発生する時間帯に
蓄電池の残量がなくなっている場合がある。
デマンドを削るには、ピークが来る直前に蓄電池を温存し、
ピーク時間帯に集中して放電する制御が必要だ。
それはルールベースでは実現できない。
③ 最適な充放電スケジュールを計算するとデマンドが下がる
同じ15kWhの蓄電池で、充放電スケジュールを
線形計画(LP)で最適化した。契約電力は57kW→53kWに下がった。
実装はPuLP+CBCソルバーで、17,520コマ(30分×365日)を
一括で最適化する。
# LP定式化のイメージ
# 決定変数: 各30分コマの充電量・放電量
# 目的関数: 年間電気代(基本料金+電力量料金−売電収入)を最小化
# 制約条件:
# SOC範囲: SOC_min ≤ SOC(t) ≤ SOC_max
# 充放電レート上限
# SOC遷移: SOC(t+1) = SOC(t) + charge(t)×η − discharge(t)/η
# エネルギーバランス: 需要 = PV + 放電 + 系統購入 − 充電 − 売電
# デマンド補助変数: peak_demand ≥ grid_import(t) + discharge(t) − PV(t)
# (線形化のためのピーク追跡)
ポイントはデマンドの最小化を目的関数に組み込む部分だ。
max(30分デマンド)はそのままでは非線形になるため、
補助変数を使って線形化している。
HF Spaces(CPU環境)での実行時間は約15〜30秒。
④ そもそも蓄電池は何kWh入れればいいのか
ここで新たな問いが生まれる。
15kWhは本当に適切な容量だったのか?
容量が大きければデマンドカット効果は上がるが、
投資額も増える。収益性(P-IRR)が最大になる容量は
どこかに存在するはずだ。
それを探すのが最適容量探索機能だ。
結果は9.2kWhだった。15kWhより小さい。
4象限グラフの見方はこうだ。
- 左上(緑): 年間コスト削減額は容量に応じて逓減カーブを描く
- 右上(青): 投資額は容量に比例して直線的に増加する
- 左下(赤): P-IRRは容量が増えるほど低下する山型カーブ
- 右下(橙): 投資回収年数は容量が増えるほど長くなる
P-IRRが最大となる点、つまり「追加投資に見合うリターンが
最も高い容量」が9.2kWhだ。
実装は2段階アプローチを取っている。
段階1(約15秒): 蓄電池容量をLP変数に含めて一体最適化
→ 最適容量と最適充放電スケジュールを同時に求める
段階2(約2〜3分): 段階1の前後範囲をグリッドサーチ
→ 各容量でP-IRR・コスト削減・回収年数を計算して可視化
段階1のLP一体化が効いている理由は、
容量と充放電スケジュールが相互依存しているからだ。
容量が変われば最適な充放電パターンも変わる。
これを分離して解くと最適解を見逃す可能性がある。
⑤ 最適容量9.2kWhで改めて充放電最適化するとどうなるか
9.2kWhで最適化した結果、契約電力は68kW→54kWとなった。
整理するとこうなる。
| 構成 | 契約電力 |
|---|---|
| 導入前 | 68kW |
| ①PV100kWのみ | 57kW |
| ②PV+蓄電池15kWh(ルールベース) | 57kW(変化なし) |
| ③PV+蓄電池15kWh(充放電最適化) | 53kW |
| ⑤PV+蓄電池9.2kWh(充放電最適化) | 54kW |
15kWhを入れて最適化した53kWと、
9.2kWhで最適化した54kWはほぼ同じだ。
(容量を6割近く削っても、デマンドカット効果はほとんど変わらない)
これがP-IRR最大化の意味するところだ。
「大きければいい」ではなく、
「費用対効果が最も高い容量がある」。
まとめ
- PVのみでも昼間ピークは削れる
- 蓄電池を入れただけ(ルールベース制御)ではデマンドカットに限界がある
- 充放電スケジュールをLPで最適化すると初めてデマンドが下がる
- 最適容量は「追加投資対効果が最大になる点」であり、
大きければいいわけではない - 最適容量+最適充放電の組み合わせが最良の結果を出す
次の記事では、このシミュレーターに
マイクログリッド(特定送配電事業)モードを追加した話を書く。
複数施設を束ねることで生まれる「束ねメリット」と
P-IRR計算の話になる。





