オフグリット AI 研究所
Off-Grid AI Laboratory / LVYUAN インバーター モニタリング
Deep Dive — Formulas, Evidence & Design Intent
計算ロジック超詳細解説
― 数式・公式と、その「根拠」
オフグリットAI研究所が、実稼働するオフグリッド設備から2年間にわたって連続収集した 独自ログを解析し、137回の改修を重ねて到達した計算ロジックの全記述です。 式を並べるだけでなく、なぜその式なのか/なぜその定数なのか/その式が無いと何が壊れるのかを、 誤差伝播・ロバスト統計・制御工学の観点から一つずつ説明し、 さらに2年分の実データで何が裏付けられたかを各式に添えています。
本システムは汎用ツールではありません。この家庭・この設備・この気候に合わせて、 パラメータを実測から同定する設計です。産業用BMS・発電所監視で使われる考え方を、 家庭用の計算規模と、欠測だらけの現実のデータに耐えるよう作り直しました。 HTML 単体で動作し、独自URL発行により PC・スマートフォン・タブレットのどこからでも 同じ解析結果を参照できます(→ §20)。
2年
連続データ収集期間
137回
ロジック改修回数
5秒
サンプリング周期
≈1,260万
累積サンプル数(2年・5秒)
クーロン積算 + 端点較正 ロバスト統計(中央値) 打ち切りデータ補正 グレーボックス同定 残差ベース異常検知 時定数分離 マルチデバイス配信
まず、ここだけ
22 章ありますが、やっていることは 1 つのループです
5 秒ごとに測って、残量を数え、癖を学び、先を予測して、「いま何をすべきか」を言う。 それだけです。22 章は、このループの各段をどう壊れないように作ったかの記録です。 そして土台はひとつ ― SOC(残量)を正確に出すこと。ここが狂うと、下流の全部が狂います。
図A ― 全体のループ。提案した結果は、次の「測る」にそのまま返ってくる。 だから学習が回り、放っておくと誤差も回る。22 章の大半は、この輪が悪い方向に回らないための工夫です。
ガソリンなら浮きを浮かべれば分かります。ところがリン酸鉄リチウム(LFP)は、 残量が 20% でも 80% でも電圧がほとんど同じです。電圧を見ても、残量は分かりません。
図B ― LFP の電圧カーブ。平らな区間では、電圧は残量をほとんど教えてくれない。 だから電圧ではなく「出入りした電流を時間で積む」方法(クーロン積算)を土台にしています(→ §05-2)。
全部を順に読む必要はありません。用事によって、要る章は違います。
何をしているか知りたい
仕組みの筋だけ掴みたい方へ
- §00 設計思想 ― 3 つの原則
- §05 SOC ― 全部の土台
- §14 学習の収束 ― 何が上がり、何が上がらないか
- §17 137 回の改修 ― 失敗の記録
読む目安 15 分
自分の設備で使いたい
実際に組んで動かす方へ
- §18 定数一覧 ― 決定根拠つき
- §19 検証手順 ― 正しさの確かめ方
- §20 マルチデバイス配信
- 実機のパラメーター設定ツール
- LFP 電圧しきい値の決め方
実作業を含む
式を検証したい
根拠まで踏み込む方へ
全 81 式
目次
全22章 / 数式81式・図13点 ― 2年間の実測データと137回の改修に基づく技術解説
Ⅰ. 前提
00設計思想と、最大の課題だったSOC01記号表・単位系02土台となる保存則と単位換算03離散化・サンプリング・欠測
Ⅱ. 実測系 ― SOC が全ての基準
04ノード方程式と電力バランス05SOC ― クーロン積算と端点較正06実効容量の学習(SOH)07エネルギー積算
Ⅲ. 予測・学習系
08発電予測 ― 日射から発電へ09カーテイルメント予測 ― 打ち切り問題10負荷プロファイル学習11余剰活用アナウンス(最適化)
Ⅳ. 評価・監視
12収支KPI とデータ整合13残差ベース異常検知14学習の収束 ― √n 則と漸近限界
Ⅴ. 設計技法・実績
15数値安定化の8技法16産業技術との対応表17137回の改修と失敗モード33件
Ⅵ. 付録
18定数一覧と決定根拠19正しさの検証手順20独自URL発行とマルチデバイス配信付録A実装ソフトウェアの仕様21全数式早見表
00 設計思想 ― なぜ「汎用」を捨てたか
このシステムの全ロジックは、3つの設計原則から導かれています。個々の数式は思いつきではなく、 この原則を満たす形として選ばれています。
原則① 実測と推定を層で分ける
「センサーが返した値」と「モデルが推定した値」を絶対に混ぜません。両者は誤差の性質がまったく違うためです。
| 層 | 誤差の源 | 誤差の振る舞い | 時間で改善するか |
|---|---|---|---|
| 実測層 PV電力・負荷・電圧・電流・温度 | センサー精度・A/D分解能・スケール設定 | 白色ノイズ+固定バイアス。大きさは一定 | しない(ハード依存) |
| 積算層 SOC・日次エネルギー | 実測層のバイアス × 時間 | 時間に比例して発散(ドリフト) | 較正しないと悪化する一方 |
| 推定層 発電予測・捨て予測・負荷予測 | モデルの構造誤差+パラメータ誤差+入力(気象)誤差 | パラメータ誤差は 1/√n で減る | する(学習で改善) |
3層の誤差モデル。「積算層は放っておくと必ず壊れる」ことが、§05 の較正アンカーが存在する理由です。
問題:SOC を「実測値」だと思うと、較正の必要性が見えなくなります。実機が返す SOC レジスタ 0x0100 も、内部でクーロン積算した推定値です。実測のように見える値ほど危険です。
帰結:本システムは実機SOCを鵜呑みにせず、自前の積算SOC(仮想レジスタ 0xF000)を並走させ、 両者を同じ時系列に記録します。ずれ方そのものが、電池・BMSの状態を語る診断情報になります。
最大の課題は SOC だった ― なぜ残量把握が全ての土台なのか
2年間の開発でもっとも時間を割いたのは、SOC(残量)を正確に出すことです。 これは単に「表示が正しいと気持ちがよい」という話ではありません。 オフグリッド運用のあらゆる判断が、SOC を入力として下されているからです。
| SOC を使う判断 | SOC が 10% ずれたときに起きること | 影響の重さ |
|---|---|---|
| 今日この家電を回してよいか | 回せると思って回し、夜に足りなくなる/回せる余裕があるのに使わない | 運用の誤り |
| 満充電到達時刻の予測(§09) | 出発点がずれるので満充電時刻が1〜3時間ずれる | 予測が崩れる |
| 捨て(カーテイル)量の推定 | 満充電判定がずれ、捨てている時間帯を取り違える | 係数学習が汚染 |
| 実効容量の学習(§06) | ΔSOC が誤るため Qeff も誤る → SOC がさらにずれる | 正のフィードバック |
| 商用切替・発電機起動の判断 | 手遅れになってから気づく/不要な買電が発生 | 実損失 |
| 電池の保護(過放電回避) | 下限を割って使い、電池寿命そのものを削る | 資産の毀損 |
4行目に注目してください。SOC の誤差 → ΔSOC の誤差 → 実効容量の誤学習 → SOC の誤差拡大という 正のフィードバックが存在します。一度ずれ始めると、学習が誤差を固定化してしまう。
この構造を断ち切るために、容量学習は「較正済みの2点間」でしか行わない(§06-1)、 較正は情報量のある端部でしか行わない(§05-4)という2重のゲートを置いています。 ループを切る場所を数学的に特定したことが、SOC 精度が安定した転換点でした。
初期版(電圧ベース推定):負荷の増減に合わせて表示 SOC が上下にばたつき、 重い負荷をかけた瞬間に十数%落ちる。日をまたぐと実態との乖離が読めない。
現行版(Ah 積算+端点較正+容量学習):満充電較正が入る日であれば、 誤差はその日のうちにリセットされ、蓄積しません(§03-3 の鋸歯構造)。 残量表示が運用判断に耐えるようになり、はじめて「余剰をどう使うか」という次の問題に進めました。
教訓:SOC は「表示項目のひとつ」ではなくシステムの基準座標です。 ここを固めない限り、予測も提案も砂上の楼閣になります。本書で §05・§06 に最も紙面を割いているのは、 2年の開発でそこが最大の投資対象だったことの反映です。
原則② パラメータは「この設備」から同定する
日射から発電への変換係数、負荷の時間帯パターン、電池の実効容量 ― これらはカタログ値では決まりません。屋根の方位・傾斜・周囲の影・パネルの汚れ具合・配線長・ その家の生活リズム・電池の劣化度合いが全部混ざった結果だからです。
同定の考え方
θ = 学習パラメータ
u=入力(日射・時刻)、y=観測(実発電・実負荷)、f=物理の骨格を持つモデル、 ρ=損失関数。本システムは ρ に絶対値損失を使い、その解である 中央値を採用しています(→ §08)。二乗損失=平均は外れ値に壊されるためです。
白箱(物理モデル全解き):パネル温度・入射角・分光応答・直列抵抗まで全部モデル化する方法。 正確だが、必要な入力(パネル裏面温度など)が家庭には無い。
黒箱(機械学習):入出力だけから学習する方法。データ量が要る(年単位)。 外挿(初めての猛暑日など)で何をするか分からない。
本システム=灰箱:「発電は日射に比例する」という物理の骨格は固定し、 比例係数 k だけを実測から同定します。骨格が物理法則なので外挿しても破綻せず、 未知パラメータが1個なので数日で収束します。これが「家庭用で数日で使い物になる」ことと 「産業レベルの筋の通り方」を両立させた核心です。
原則③ 保守的に更新し、壊れたら止まる
学習は「良くする」だけでなく「壊す」こともできます。誤学習した実効容量は残量表示を丸ごと狂わせ、 誤学習したポテンシャル係数は「捨てている」という事実そのものを見えなくします。そこで全学習に ゲート(学習してよい条件)・レート制限・上下限クランプを掛けています。
ゲート
条件を満たさないサンプルは捨てる。ΔSOC≥37%、温度10〜40℃、日射≥80W/m²、SOC<98% など。
レート制限
1回の更新で動ける幅を±10%に制限。異常値が入っても被害を局所化。
なじませ(EMA)
目標へ α=0.25 ずつ寄せる1次フィルタ。ノイズを 1/2.6 に圧縮しつつ劣化には追従。
「137回の改修」の正体:上に挙げたゲート・クランプ・条件分岐は、最初から在ったものではありません。 2年分のログを見て「なぜこの日は残量が飛んだのか」「なぜ捨てているのに捨て量ゼロと出たのか」を追い、 失敗モードを一つずつ潰した結果として増えたものです。137回のうち多くは定数の微調整ですが、 §17 にロジックの構造そのものを変えた主要な33件と、 それぞれが防いでいる失敗モードを一覧にしました。
この3原則がロジック全体をどう貫くか
読み方:左の原則が中央の具体ロジックを決め、右の性質が結果として出てきます。以降の章は中央の各項目を1つずつ数式で展開したものです。
01 記号表・単位系(Nomenclature)
以降の全数式で使う記号を先に定義します。単位の取り違えは最も多いバグ源のため、 単位を式そのものの一部として扱います。
電気量・エネルギー
| 記号 | 意味 | 単位 | 符号規約・出所 |
|---|---|---|---|
| Vbat | バッテリー端子電圧 | V | 実測 0x0101 ×0.1 |
| I | バッテリー電流 | A | 実測 0x0102 ×0.1。充電 > 0 / 放電 < 0(表示規約) |
| Ppv | 太陽光発電電力(PV1+PV2) | W | 実測。常に ≥ 0 |
| Pload | 負荷(消費)電力 A+B+C相 | W | 実測。常に ≥ 0 |
| Pgrid | 商用系統からの受電電力 | W | 実測。受電を正として扱う |
| Pbat | バッテリー電力 = Vbat·I | W | 計算。充電 +(緑)/放電 −(青) |
| Pchg, Pdis | 充電・放電の大きさ | W | max(0, ±Pbat) |
| Ploss | 変換ロス | W | 計算(入力−出力) |
| Ex | 各項の日次エネルギー | Wh | 電力の時間積分 |
| Tdc | 本体DC温度 | ℃ | 実測 0x0220 ×0.1 |
電池状態
| 記号 | 意味 | 単位 | 備考 |
|---|---|---|---|
| SOCphys | 物理残量(電池としての充電率) | % | クーロン積算の出力 |
| SOCdisp | 表示残量(安全に使える残量) | % | 0% = 50.0V 相当 |
| SOCfloor | 表示0%に対応する物理SOC | % | ≈ 10%(設備により変動) |
| Qeff | 実効容量(学習値) | Ah | SOC積算の分母 |
| Qdesign | 設計容量 | Ah | 20kWh ÷ 51.2V ≈ 390.6Ah |
| Ecap | 電池のエネルギー容量 | Wh | Qeff × 公称電圧 |
| SOH | 健全度 = Qeff/Qdesign | % | 劣化の指標 |
| Rint | 内部抵抗 | Ω | OCV補正に使用 |
| ηchg | 充電クーロン効率 | – | 0.99(充電時のみ適用) |
気象・予測
| 記号 | 意味 | 単位 | 出所 |
|---|---|---|---|
| G | 全天日射強度(瞬時) | W/m² | Open-Meteo shortwave_radiation / 仮想レジスタ 0xF011 |
| H | 日射量(日積算・時間積算) | MJ/m² | Open-Meteo 日別・時間別 |
| k | 発電係数(日射量→発電量) | Wh/(Wh/m²) | 学習(実績中央値) |
| kp | ポテンシャル係数(日射強度→発電電力) | W/(W/m²) = m² | 学習(非絞りサンプルの中央値) |
| cMJ | MJ/m² → Wh/m² 換算 | 277.78 | 定数(§02 で導出) |
| Pmax | PV/PCS の出力上限 | W | 設備定格。クリップに使用 |
| L̂h | 時刻 h の予測負荷 | W | 学習(過去14日の時刻別中央値) |
| W | カーテイルメント量(捨てた発電) | Wh | 計算(実測版・予測版の2系統) |
| PR | 性能比(Performance Ratio) | – | 系統全損失の積。k の物理的意味 |
時間・統計
| 記号 | 意味 | 単位 | 備考 |
|---|---|---|---|
| Δt | サンプル間隔 | s | 公称5秒。実際は可変(→ §03) |
| Δh | 時間刻み(時間単位) | h | Δt/3600 |
| α | EMA(なじませ)係数 | – | 0.25 |
| n | 学習サンプル数 | – | 日数・点数 |
| σ | 標準偏差 | 各 | 誤差解析に使用 |
| δx | 量 x の不確かさ | 各 | 誤差伝播に使用 |
| med | 中央値演算子 | – | 平均ではなく中央値を使う(§08) |
符号規約を1か所に固定する理由:電池電流の符号は、機種によって「充電が正」「放電が正」が分かれます。 レジスタ読み出し直後に BATT_SIGN で1回だけ正規化し、以降のすべての式は 「充電 > 0」で書かれています。符号変換をロジックのあちこちに散らすと、 式を1つ足すたびに符号バグの可能性が増えるためです(→ §17 改良#14)。
02 土台となる保存則と単位換算
このシステムの計算は最終的に2つの保存則に還元されます。電荷保存とエネルギー保存です。 どちらをどこで使うかの選択が、精度を大きく左右します。
2-1. 電荷保存 ― SOC が Ah で数えられる理由
電池に出入りする電荷 q は保存量です。端子で測った電流を時間で積めば、電池内部に蓄えられた電荷が分かります。
電荷の定義
[Ah] = [A]·[h](2.1)
なぜ Wh(電力量)で数えてはいけないのか
電池の端子電圧は、内部抵抗による電圧降下を含んでいます。
端子電圧モデル
充電 I>0 で電圧上昇(2.2)
ここで Wh を積算するとどうなるかを展開してみます。
- 電力量の積算は ∫ V·I dt = ∫ (OCV + I·R)·I dt
- 展開すると ∫ OCV·I dt + ∫ I²·R dt
- 第1項が「本当に電池に出入りしたエネルギー」、第2項 ∫I²R dt は内部抵抗で熱になった分
- 第2項は電流の2乗に比例 → 重い負荷ほど急激に膨らむ
- 結果:同じ電荷量を出し入れしても、使い方(負荷の重さ)によって Wh 積算の結果が変わる
- 一方 ∫I dt は R を含まない → 使い方に依存しない
結論:SOC は「電池の中にどれだけ電荷が残っているか」であり、 熱として失われた分は残量ではありません。Ah で数えると内部抵抗の項が式から消えるため、 負荷の重さに依存しない残量が得られます。
具体的な差:内部抵抗 10mΩ、放電 100A のとき電圧降下は 1.0V。 51.2V に対して 約2% です。この2%を「消費した」と数えると、重負荷で使うほど残量が過小に、 軽負荷で使うほど過大に出ます。日をまたぐと数%〜10%オーダーのずれになります。
Wh 積算のまま運用すると、エアコンや IH を使った直後だけ残量がストンと落ち、切ると少し戻るという 挙動になります。ユーザーからは「バッテリーが壊れた」ように見えますが、実際は測り方の問題です。 これは初期版で実際に発生し、Ah 積算への変更で解消しました(→ §17 改良#1)。
2-2. エネルギー保存 ― 電力バランスとロス
一方、インバーターのノードではエネルギー保存が成り立ちます。入る電力の合計は、出る電力の合計と 変換損失の和に等しくなります。
ノード方程式
(2.3)
この式を Ploss について解いたものが「ロス」表示、出力/入力が「効率」表示です。
電池の中身を数えるときは電荷保存(Ah)、系統全体の辻褄を見るときはエネルギー保存(W・Wh)。 この使い分けが本システムの計算構造そのものです。混ぜると、どちらの保存則も成り立たない中途半端な値になります。
2-3. 単位換算 ― cMJ = 277.78 の導出
気象データの日射量は MJ/m²、発電は Wh。この換算定数はマジックナンバーではなく、SI単位から一意に決まります。
- 1 MJ = 106 J(定義)
- 1 W = 1 J/s(定義)→ 1 Wh = 1 J/s × 3600 s = 3600 J
- したがって 1 MJ = 10⁶ / 3600 Wh = 277.777… Wh
- 実装値 c_MJ = 277.8(相対誤差 8×10⁻⁵ =無視可能)
次元チェックの習慣:発電量[Wh] = H[MJ/m²] × c_MJ[Wh·m²/(MJ·m²)] × k[m²相当]。 左右の次元が合うことを必ず確認します。次元が合わない式は、値がそれらしく見えても必ずどこかが間違っています。 §08 の k が「面積の次元を持つ」ことは、k の物理的意味(等価受光面積)を理解する鍵になります。
2-4. 電池容量:Ah と Wh の行き来
Q_design[Ah] = E_battery[Wh] / V_nominal[V] = 20000 / 51.2 = 390.6 Ah E_cap[Wh] = Q_eff[Ah] × V_nominal[V] ← 予測シミュレーションはWhで回す V_nominal = 3.20 V/cell × 16S = 51.2 V ← LFPの公称電圧
注意点:Wh 容量は放電レートと温度で変わりますが、Ah 容量はほぼ変わりません(LFPの場合)。 そのためSOC 計算は Ah 基準、エネルギー予測は Wh 基準で、変換は公称電圧という 「1本の決まった換算」で行います。ここで実測電圧を使うと、電圧変動が容量変動として伝播してしまいます。
03 離散化・サンプリング・欠測の扱い
連続時間の積分(式2.1)を、5秒ごとの離散サンプルでどう近似するか。ここに積算精度の大部分がかかっています。
3-1. 積分の離散化
サンプル Ik が時刻 tk に得られたとき、区間 [tk−1, tk] の 電荷を近似する方法は主に2つあります。
| 手法 | 式 | 局所誤差 | 採否 |
|---|---|---|---|
| 矩形則(ゼロ次ホールド) | Δq = Ik · Δt | O(Δt²) | 採用 |
| 台形則 | Δq = (Ik−1+Ik)/2 · Δt | O(Δt³) | 不採用 |
理由1 — 誤差が支配的でない:Δt = 5秒に対して、家庭の負荷電流の変化はほとんどが 分〜時間スケール(エアコンのコンプレッサー、給湯)です。ナイキスト的に十分オーバーサンプリングされており、 離散化誤差より電流センサーのバイアス誤差のほうが2桁大きい(→ 3-3)。より高次の積分則を使っても、 支配的でない誤差を減らすだけです。
理由2 — 欠測に強い:台形則は前サンプルを必要とします。通信断で Ik−1 が 欠けた瞬間、台形則は使えません。矩形則は各サンプルが独立なので、欠測区間を単に飛ばすという 素直な処理ができます。実運用では欠測は必ず起きます。
理由3 — 保守側に倒れる:矩形則は「電流が次のサンプルまで一定だった」と仮定します。 充電中に電流が減っていく局面(CV充電の終盤)ではやや過大に見積もる方向ですが、 その局面は満充電較正(§05-4)で 100% に上書きされるため、誤差が持ち越されません。
3-2. Δt ゲート ― 欠測区間を積算しない
積算ゲート
Δtmax = 30 s(3.1)
上限がないとどうなるか:PCが1時間スリープして復帰すると、Δt = 3600秒。 そのとき読んだ電流が仮に −80A(放電中)だったとすると、 80 × 3600/3600 = 80 Ah を一気に引きます。390.6Ah 容量に対して SOC が瞬時に 20% 飛ぶ。しかも実際にはその1時間ずっと 80A だった保証はどこにもありません。
30 秒の根拠:公称5秒周期に対して6サンプル分の余裕。 Modbus のリトライ・タイムアウト(数秒)や一時的なCPU負荷でのスキップは通常この範囲に収まります。 それを超える中断は「サンプリングが成立していない」と判定し、積算に加えません。
飛ばした結果どうなるか:その区間で実際に流れた電荷は失われ、SOC に誤差として残ります。 ただし誤差の大きさは「飛ばした時間×電流」で有界であり、外挿した場合の暴走とは性質が違います。 さらに欠測が起きたことは信頼度(§05-7)に記録され、次の較正までは「中」「低」と表示されます。
ノートPCの蓋を閉じる/スリープ復帰のたびに SOC が大きく飛びます。ユーザーからは 「朝起きたら残量が 20% になっていた(実際は満充電)」という形で現れます。 Δt ゲートは、この最も再現性の高い失敗モードを潰すためのものです(→ §17 改良#11)。
3-3. 誤差の分類 ― どちらを潰すべきか
電流測定の誤差を、バイアス(オフセット)とランダムノイズに分解し、積算後にどう育つかを比較します。
- 測定電流を Î = I + b + ε と置く(b=固定バイアス[A]、ε=平均0・標準偏差σのノイズ)
- バイアス成分:時間 T 積算すると Δq_bias = b·T/3600 [Ah] → T に比例して増える
- ノイズ成分:独立な N = T/Δt 個の和なので分散が加算 → σ_q = σ·Δt·√N/3600 = σ·√(Δt·T)/3600 → √T でしか増えない
- SOC に換算:δSOC = 100·Δq/Q_eff
| 誤差源 | 仮定値 | 1時間後 | 1日後 | 1週間後 |
|---|---|---|---|---|
| バイアス b = 0.5 A | 定格の0.1%程度 | 0.13 % | 3.07 % | 21.5 % |
| ノイズ σ = 2 A | Δt=5s | 0.02 % | 0.09 % | 0.25 % |
この図が §05 の存在理由です。赤=較正しない場合の誤差は時間に比例して伸び、1週間で 21.5%(表示として無意味)。 緑=1日1回の満充電較正があれば、誤差は毎回ゼロに戻され常に許容帯の中に留まります。 重要なのは誤差が「起動からの累積」ではなく「最後の較正以降」に閉じ込められる点です。
問い:電流センサーをより高精度なものに替えれば SOC は正確になるか?
答え:ならない。バイアス誤差はどれだけ高精度なセンサーでもゼロにはできず、 時間に比例して育つ以上、いつか必ず許容範囲を超えます。必要なのは定期的なリセット機構であり、 それが較正アンカー(§05-4)です。「精度を上げる」ではなく「誤差の蓄積を断ち切る」という発想の転換が、 産業用BMS(TI Impedance Track™ など)と共通する設計です。
3-4. ログの粒度設計
| テーブル | 粒度 | 保持 | 設計意図 |
|---|---|---|---|
samples | 5 秒 | 約14日 | SOC積算・過渡現象の解析に必要な生の分解能。ただし1日 17,280行 × 全レジスタで肥大するため短期保持。 |
samples_1m | 1 分平均 | 長期(週ファイル) | 1/12 に圧縮。日次・週次・年次の傾向分析には1分で十分。学習の入力はこちら。 |
ファイルは ISO 週単位で分割します。1年分を表示するとき、52個の小ファイルの必要な範囲だけを開けばよく、 巨大な単一ファイルを走査する必要がありません(→ §17 改良#24)。
集約するときの注意:1分平均を取るとき、電力は平均、エネルギーは合計、SOCは末尾値を取ります。 量の種類によって正しい集約関数が違います。SOC を平均すると単調性が崩れ、 エネルギーを平均すると総量が 1/60 になります。ここを間違えると、 「グラフでは正しいのに集計が合わない」という追いにくいバグになります。
04 ノード方程式と電力バランス
5秒ごとに得られる生レジスタから、瞬時の電力状態を組み立てます。ここは「実測層」であり学習は入りません。 ただし符号と合成の規約を厳密に決めておかないと、以降の全計算が汚染されます。
4-1. 生レジスタから電力量への合成
P_pv = P_pv1 + P_pv2 ← 2系統合算 P_pv = P_pv1 × PV_W_SCALE ← PV2 非対応機の近似(SCALE=2) P_load = P_loadA + P_loadB + P_loadC ← 相ごとの合算 P_bat = V_bat × I × BATT_SIGN ← 符号を「充電+」に正規化 P_chg = max(0, P_bat) P_dis = max(0, −P_bat)
なぜ必要か:一部の機体は PV2 のレジスタ 0x010F–0111 を返しません。 しかし物理的には2系統のストリングが接続されており、実際の発電は PV1 の約2倍です。 ここを補正しないと、発電量が常に半分に見え、係数学習も自給率もすべて狂います。
なぜ「×2」で足りるのか:同一容量・同一方位のストリングを2系統に分けた構成であれば、 両者の出力はほぼ等しくなります。誤差は主に、片側だけに影がかかった時間帯に出ます。
限界の明示:方位や枚数が違う2系統では成り立ちません。その場合 PV_W_SCALE を実測比から決め直す必要があります。この定数は「この設備専用のパラメータ」であり、 汎用ツールなら置けない類の設定です(原則②)。
4-2. 電力バランスとロス・効率
ロスと効率
%(4.1)
Pin = Ppv + |Pgrid| + Pdis、 Pout = Pload + Pchg。
直接の意味:インバーターの変換損失(DC/AC変換、MPPT、待機電力)です。 定格付近で 5〜7%、軽負荷時は待機電力の比率が上がって 10〜15% になります。
本当の役割 — 計測の検算:この値は4つの独立したセンサー系(PV・商用・電池・負荷)が 互いに矛盾していないかを検算しています。もしどれか1つのスケール設定が間違っていれば、 ロスは物理的にありえない値(マイナス、あるいは 30% 超)になります。 化学プラントのデータ・リコンシリエーション(物質収支の突合)と同じ発想です。
だから閾値監視する:|ロス率| > 18% を異常として通知します(→ §13)。 これは「インバーターが壊れた」ではなく、多くの場合「設定かセンサーがおかしい」を意味します。
レジスタの倍率設定(×0.1 か ×1 か)を1か所間違えても、各カードは「それらしい数字」を出し続けます。 負荷が 10 倍に出ていても、単体では気づけません。ロス率という横断的な整合指標だけが、 「どれか1つがおかしい」ことを検出できます。
4-3. エネルギーフロー図の意味づけ
設計上の要点:バッテリーだけが「入力にも出力にもなる」双方向ノードです。 だから符号規約が必要になり、だから BATT_SIGN を読み出し直後に1回だけ適用します。 他の3系統は片方向なので符号の曖昧さがありません。
4-4. 実機画面での確認 ― 式(4.1)が実際に閉じている例
以下は実稼働中のダッシュボードです。右下の「直流側/電力収支」に、 式(2.3)・式(4.1)がそのまま数値として出ています。
実機ダッシュボード

入力合計(PV+商用+放電)
6.60 kW
出力合計(負荷+充電)
6.01 kW
変換ロス(入力−出力)
583 W
変換効率(出力÷入力)
91.2 %
式(4.1)の検算:PV 6.60kW(MPPT1 3340W + MPPT2 3256W)が入力、 負荷 18W + 充電 6.00kW(54.5V × 110.0A ≒ 5995W)が出力。 差の 583W がロスで、効率は 6.01 ÷ 6.60 = 91.2%。 4系統の独立したセンサーが互いに矛盾なく閉じていることが、この1画面で確認できます(§12-2 のデータ整合)。
なお左のフロー図で商用電源が 0W、つまりこの瞬間は完全に太陽光だけで負荷と充電を賄っています。 右上の SOC カードが「積算 19.0% / 実機 60%」と大きく乖離している点は §05-8 で扱います。
05 SOC ― クーロン積算と端点較正 最重要
本システムで最も改修を重ねた部分です。LFP(リン酸鉄リチウム)電池は残量 20〜80% で電圧がほぼ平坦であり、 「電圧を見れば残量が分かる」が根本的に成り立ちません。ここを正面から解いたのが本章です。
5-1. 支配方程式
クーロン積算
%(5.1)
t0 は最後に較正した時刻(起動時刻ではない)。 η(I) = 0.99(充電時 I>0)、1.00(放電時)。Qeff は §06 の学習値。
Δq_k = η_k × I_k × Δt_k / 3600 [Ah] ※ Δt_k ≤ 30s のときのみ SOC += 100 × Δq_k / Q_eff [%] SOC = clamp(SOC, 0, 100) 物理的にありえない値を許さない
充電効率 ηchg = 0.99 の意味
物理:クーロン効率とは「押し込んだ電荷のうち、実際に蓄えられた割合」です。 LFP のクーロン効率は 99.5〜99.9% と非常に高い(副反応がほとんど無い)のですが、 自己放電・BMSのバランシング回路の消費が加わるため、実効的には 99% 程度と見積もります。
放電側に掛けない理由:放電時に「出てきた電荷」はそのまま外部に流れた電荷であり、 測定した電流がそのまま減った電荷です。ここに効率を掛けるのは二重計上になります。 非対称にするのが正しい扱いです。
値の保守性:0.99 は「押し込んだ分の1%は残らない」という控えめな見積りです。 これにより SOC はわずかに保守側(低め)に出ます。残量を過大に表示して突然落ちるより、 過小に表示して余る方が実用上安全である、という判断です。
5-2. なぜ電圧から残量を読めないのか ― 感度解析
電圧 V から SOC を推定する場合、誤差は次のように伝播します。
電圧法の誤差伝播
SV = 電圧感度 [V/%](5.2)
分母 SV が小さいほど、同じ電圧誤差が大きな SOC 誤差に化けます。 LFP の OCV 曲線でこの値を実際に計算すると、領域によって1桁以上違います。
- 平坦域:セル電圧は SOC 15→95%(80%幅)でおよそ 3.20→3.40V(0.20V幅) → S_V = 0.20/80 = 0.0025 V/%/cell → 16S で 0.040 V/%
- 上端(充電末期):SOC 95→100%(5%幅)で 3.40→3.55V(0.15V幅) → S_V = 0.030 V/%/cell → 16S で 0.48 V/%
- 下端(放電末期):SOC 10→0%(10%幅)で 3.10→2.80V(0.30V幅) → S_V = 0.030 V/%/cell → 16S で 0.48 V/%
- 感度比 0.48 / 0.040 = 12 倍 ― 端部は平坦域より12倍正確に読める
さらに悪いこと:内部抵抗による電圧降下
- 16S パック全体の内部抵抗を R_int = 10 mΩ と仮定
- 放電電流 50A のとき電圧降下 ΔV = 50 × 0.010 = 0.50 V
- これを補正せず平坦域で電圧法を使うと δSOC = 0.50 / 0.040 = 12.5 %
- 同じ 0.50V を端部で使った場合 δSOC = 0.50 / 0.48 = 1.04 %
- 加えて電圧の読み取り分解能 0.1V(レジスタ ×0.1)が ±1.25% / ±0.21% 上乗せ
上段=LFP の OCV 曲線。中央 80% の区間で電圧は 0.2V しか動きません。 下段=同じ 0.1V の電圧誤差が、どれだけの SOC 誤差になるか。平坦域では 2.5%、端部では 0.2%。 さらに負荷電流による IR ドロップ(0.5V)まで含めると、平坦域の誤差は 12.5% に達します。 これが「中央では電流を積み、両端でだけ電圧で答え合わせする」という構造の理由です。
5-3. 内部抵抗補正 ― 静止 OCV の取り出し
OCV 復元
(5.3)
補正だけでは足りない理由:Rint 自体が SOC・温度・電流方向・ 経年で変わります。つまり補正項 I·R にも誤差があり、電流が大きいほどその誤差も大きい。 誤差のある量を、誤差のある補正で直しても、誤差は消えません。
静止条件(0.05C = 約19.5A 以下が 600秒)の意味:電流を小さくすれば 補正項そのものが小さくなり、Rint の誤差も比例して小さくなります。 19.5A × 10mΩ = 0.195V なので、Rint の見積りが 50% ずれても電圧誤差は 0.1V に収まります。
600 秒待つ理由 ― 拡散緩和:電流を止めた直後の端子電圧はまだ真の OCV ではありません。 電極内のリチウム濃度勾配が均一化するまで(拡散緩和)、電圧はゆっくり回復し続けます。 LFP の場合この時定数は数分オーダー。10分待つことで緩和のほぼ全部を消化します。 産業用BMSでいう「リラクゼーション時間」の確保です。
5-4. 較正アンカー ― 誤差の蓄積を断ち切る
§03-3 で見たとおり、積算誤差は時間に比例して育ちます。それを定期的にゼロに戻すのが較正アンカーです。
アンカー① 満充電較正(最も信頼できる)
満充電判定
(5.4)
Vfull = 56.8 V(3.55 V/cell × 16S)、 Itail = 0.02 C ≈ 7.8 A(Qeff = 390.6 Ah のとき)。
条件A:電圧 ≥ 56.8V ―「どこまで押し込んだか」
CC/CV 充電では、まず定電流で押し込み、電圧が上限に達すると定電圧モードに移ります。 電圧が上限に達していることは「充電の最終段階に入った」ことの必要条件です。
条件B:電流 ≤ 0.02C ―「もう入らない」
CV モードでは電流が指数的に減衰します。これが決定的な条件です。 電圧だけでは不十分な理由:定電流充電中でも、内部抵抗による電圧上昇(I·R)で 端子電圧は簡単に 56.8V を超えます。SOC 80% でも、大電流で押し込めば端子電圧は上限に届く。 電圧だけで判定すると SOC 80% を 100% と誤較正します。電流が尾電流まで落ちて初めて、 「電圧上昇が IR ではなく本当に SOC によるもの」と言えます。
条件C:180 秒連続 ― デバウンス
雲の切れ間で PV 出力が一瞬落ちれば、充電電流も一瞬落ちます。その瞬間だけを見れば 条件A・Bが同時に成立してしまう。5秒周期に対して 180秒=36サンプル連続で成立を要求することで、 瞬時的な偶然を排除します。逆に、本当に満充電なら 180 秒は余裕で継続します。
なぜ 0.02C(C/50)なのか:電池業界の慣行値です。 CV 終端電流を C/50 に取ると、残る未充電分は概ね容量の 1% 未満に収まります。 より厳しくすると(C/100 など)、そこまで電流が落ちるのを待つ間に日が暮れてそもそも較正イベントが発生しなくなる。 較正は「起きること」が何より重要なので、精度と発生頻度のトレードオフとして C/50 を採ります。
アンカー② 静止 OCV 較正(補助)
満充電に到達しない日(曇天が続く冬など)でも較正を効かせるための第2のアンカーです。 §5-3 の条件下で OCV を求め、OCV–SOC テーブルを逆引きします。
条件: |I| ≤ 0.05C かつ その状態が 600s 継続 手順: OCV = V_bat − I·R_int SOC_est = OCV_table⁻¹(OCV / 16) セル電圧に直して逆引き ただし 3.15 ≤ OCV/16 ≤ 3.35 なら 較正しない ← 平坦域ガード
アンカー③(否定形)平坦域ガード ― 較正しないという設計
素朴な発想:「電圧が読めるなら常に較正すればいい」
実際に起きること:平坦域では δSOC が 2.5〜12.5%(§5-2)。 積算SOCの誤差(数時間なら 1% 未満)より、電圧推定の誤差のほうが1桁大きい。 そこで較正すれば、正確な値を不正確な値で上書きすることになります。
結論:較正は「情報が増えるとき」だけ行う。平坦域は情報が無い区間なので、 積算を信じて何もしないのが正解です。これは推定理論でいう 「観測ノイズが大きいときは観測を重み付けしない」(カルマンゲインが小さくなる状況)を、 ゲート方式で単純化したものです。
負荷が入るたびに電圧が下がり、それを「残量が減った」と誤解して SOC を下げます。 負荷を切ると電圧が戻り、SOC が上がります。結果、SOC 表示が負荷に合わせて上下にバタつく。 ユーザーからは「残量表示が信用できない」に見えます。平坦域ガードはこの挙動を根絶するためのものです(→ §17 改良#2)。
5-5. 表示 SOC ― 保護マージンの線形写像
表示 SOC
(5.5)
SOCfloor は 50.0V(3.125 V/cell)に対応する物理 SOC。設備・劣化により概ね 8〜12%。
LFP の過放電リスク:セル電圧 2.5V 付近まで使い切ると、 銅集電体の溶解など不可逆な劣化が始まります。3.125V/cell(50.0V)で止めれば、 サイクル寿命は数千サイクル級を維持できます。
ユーザーにとっての「0%」の意味:スマートフォンの 0% が 「電池がカラ」ではなく「安全に使える下限」であるのと同じ発想です。ユーザーが期待する 0% は 「もう使ってはいけない」であって「物理的な空」ではありません。
線形写像を選ぶ理由:非線形(例:低残量側を引き伸ばす)にすると 「10% 減るのにかかる時間」が残量帯によって変わり、直感が壊れます。 線形なら表示 1% あたりのエネルギーが常に一定で、残り時間の見積りが素直にできます。
副作用と、その扱い:表示 1% は物理 (100−SOCfloor)/100 ≈ 0.90% に相当します。 「使用可能時間」の計算は必ず物理側の値と実効容量で行い、最後に表示へ変換します。 順序を逆にすると、残り時間が約10%短く(または長く)出ます。これは実際に踏んだバグです(→ §17 改良#12)。
5-6. 使用可能時間・満充電までの時間
放電中(P_dis > 0): 残エネルギー[Wh] = (SOC_phys − SOC_safe) / 100 × Q_eff × V_nominal 使用可能時間[h] = 残エネルギー / P_dis SOC_safe = 15%(安全圏。表示0%より手前で警告を出すための余裕) 充電中(P_chg > 0): 必要エネルギー[Wh] = (100 − SOC_phys) / 100 × Q_eff × V_nominal 満充電までの時間[h] = 必要エネルギー / P_chg × 1/η_taper η_taper: CV領域では電流が絞られるため実際はこれより長い(保守側に表示)
この値の性質:「今の電力が続いた場合」の外挿であり、予測ではありません。 エアコンを切れば一瞬で伸びます。予測(§09の1日シミュレーション)とは別物であることを、 表示上も「現在ペース」と明示しています。実測層と推定層を混ぜない原則(原則①)の適用例です。
5-7. 信頼度 ― 推定値に「但し書き」を付ける
同じ「SOC 62%」でも、10分前に満充電較正した直後の 62% と、 3日間較正できずに積み上げた 62% では意味がまったく違います。それを表示に反映します。
| 信頼度 | 条件(要旨) | 推定誤差の目安 | UI の扱い |
|---|---|---|---|
| 高 | 最後の較正から 24 時間以内、その間の欠測ゼロ | ±1〜3 % | 通常表示 |
| 中 | 較正から 24〜72 時間、または軽微な欠測あり | ±3〜8 % | 信頼度バッジ表示 |
| 低 | 起動直後で電圧推定から開始/72時間以上未較正/大きな欠測 | ±8 % 以上 | バッジ+較正を促す案内 |
工学的理由:推定値を点推定(62%)だけで出すのは、情報を捨てる行為です。 本来は分布(62% ± 3%)で持つべき量です。信頼度はその分散を3段階に離散化した簡易表現です。
実用的理由:ユーザーが「残り 20% だから大丈夫」と判断するとき、 それが ±3% なのか ±10% なのかで行動が変わります。推定値を実測値のように見せるのは ユーザーに嘘をつくことだという判断です(原則①)。
運用上の効果:「低」が続くなら、それは電池が満充電に到達していないサインでもあります。 信頼度は SOC の但し書きであると同時に、運用状態の診断情報にもなっています。
5-8. 実機SOC との並走記録
実機が返す SOC(0x0100)と、自前の積算SOC(仮想レジスタ 0xF000)を 同じ時系列に記録します。両者は原理的に一致しません。
| ずれ方 | 示唆される状態 |
|---|---|
| 実機SOC が常に高め | 実機BMS の容量設定が実際より大きい(劣化を反映していない) |
| 実機SOC が階段状に飛ぶ | 実機が電圧ベースの推定に切り替わっている(平坦域で不安定) |
| 両者が徐々に離れ、満充電で一致 | 正常。積算誤差が較正でリセットされている証拠 |
| 満充電後も一致しない | 実効容量 Qeff の学習値が実態と乖離 → §06 を確認 |
2つの推定値を並べる意味:片方だけでは「間違っているかどうか」が分かりません。 独立に計算された2系統を並べることで、ずれの発生時刻とパターンから原因を絞れます。 これは冗長系による診断(多数決ではなく差分診断)という、産業計装の常套手段です。
実測ログでの並走比較
ログ画面には、専用のパネル「バッテリー残量 SOC(%)/ 実機 と 積算 の比較」を置いています。 1か月ぶんを並べると、両者の関係が一目で分かります。
実機ログ画面(1か月表示)

2段目が §05-8 の並走比較です。緑=積算SOC(0xF000)、青=実機SOC(0x0100)。 毎日の充放電サイクルでどちらも同じ形に振れており、電流積算が実際の充放電を正しく追えていることが分かります。 一方で絶対値には一貫したオフセットがあり(この期間は積算 69% に対し実機 22%)、 これは §05-8 の表でいう「実機BMS の容量設定が実態を反映していない」パターンに該当します。 片方だけを見ていては絶対に気づけない種類の情報です。
最下段の日射量(W/m²)は仮想レジスタ 0xF011。1段目の実発電と同じ時間軸に置くことで、 §08 の発電係数 k と §09 のポテンシャル係数 kp の学習を、 後から目視で裏付けられます(§14-4)。
なお 7/21〜7/23 付近で交流電圧・電流が落ちている区間は、実際の系統側の状態がそのまま記録されたものです。 異常も含めて生のまま残すことが、後からの原因追跡を可能にします。
06 実効容量の学習(SOH) 学習
式(5.1)の分母 Qeff は、SOC 全体のスケールを決める最重要パラメータです。 ここが 10% ずれれば、SOC も 10% ずれます。カタログ値を使わず、2つの較正アンカーの間で実測から同定します。
6-1. 推定式
容量の実測
[Ah](6.1)
tA, tB は連続する2つの較正アンカーの時刻。 ΔSOC はその2点での(較正済み=信頼できる)SOC の差。
この式は「SOC が確実に分かっている2点の間で、実際に何 Ah 流れたか」を突き合わせるものです。 アンカーでない時刻の SOC は積算値であり、そこには Qeff 自身が入っています。 アンカー以外で式(6.1)を使うと、推定したい量を推定に使う循環論法になり、 どんな Qeff を入れても式が成立してしまいます(情報がゼロ)。
6-2. なぜ ΔSOC ≥ 37% を要求するのか ― 誤差伝播からの決定
式(6.1)は割り算なので、相対誤差は次のように合成されます。
相対誤差の合成
(6.2)
- 各アンカーの SOC 不確かさを δSOC_anchor ≈ ±1.5% と見積る(満充電較正の精度)
- 2点の差なので合成 δSOC = √2 × 1.5 ≈ 2.1%
- 電流積算側の相対誤差は数時間スケールなら δAh/ΔAh ≈ 1% 程度で、第2項が支配的
- よって近似的に δQ/Q ≈ 2.1 / ΔSOC
- 1回の推定を誤差 6% 以内に収めたい → ΔSOC ≥ 2.1/0.06 = 35%
- 実装値 37%(余裕を持たせた値)
| ΔSOC | 1回の推定誤差 δQ/Q | 390.6Ah に対する絶対誤差 | 判定 |
|---|---|---|---|
| 10 % | 21 % | ±82 Ah | 使えない |
| 20 % | 10.5 % | ±41 Ah | まだ粗い |
| 37 % | 5.7 % | ±22 Ah | 下限として採用 |
| 60 % | 3.5 % | ±14 Ah | 良好 |
| 90 % | 2.3 % | ±9 Ah | 最良 |
双曲線の形が本質です。ΔSOC が小さい領域では誤差が急激に立ち上がるため、 「たくさん学習すれば平均で良くなる」という発想が通用しません(1回の誤差が大きすぎて、 平均するのに必要な回数が現実的でなくなる)。だから小さい充放電は最初から使わない。
6-3. なじませ(EMA)― なぜ α = 0.25 なのか
容量の更新
(6.3)
α = 0.25、w = min(1, ΔSOC/100) は信頼度重み、clamp は前回値の ±10% に制限するレート制限。
- 重み w = 1、真値一定と置くと誤差は e_n = (1−α)ⁿ e_0 で幾何減衰
- 時定数(1/e に減る回数)N_τ = −1/ln(1−α) = −1/ln 0.75 = 3.48 回
- 95% 収束に必要な回数 n = ln(0.05)/ln(0.75) = 10.4 回
- ノイズ抑圧:定常状態の出力分散 σ_out² = σ_in² · α/(2−α) = σ_in² × 0.143
- 標準偏差では √0.143 = 0.378 倍 → ノイズが約 1/2.6 に圧縮
- 実効サンプル数 N_eff = (2−α)/α = 7.0 → 直近7回分を平均したのと同等の平滑化
α は 2つの相反する要求のバランスで決まります。
大きい α(速い追従)が要る理由:電池は経年で劣化します。年 2〜3% 程度。 容量が実際に減っているのに追従できなければ、SOC は徐々に楽観的になります。
小さい α(強い平滑化)が要る理由:1回の推定は §6-2 のとおり ±5.7% の誤差を持ちます。 α = 1(そのまま代入)にすると、容量が毎回 ±5.7% で暴れ、SOC 表示も同じだけ暴れます。
3つの時間スケールを並べる:
① 推定ノイズ = 1イベントごと(数日に1回)
② EMA の時定数 = 3.5イベント ≒ 2〜3週間
③ 実際の劣化 = 年オーダー
① ≪ ② ≪ ③ が成立しています。つまり EMA はノイズより十分遅く、劣化より十分速い。 この時定数分離が成り立つ範囲であれば α の細かい値は結果を大きく変えず、 0.25 は「イベント頻度が週1〜2回」という運用実態から選んだ値です。
赤(α=1.0)は追従は速いが推定ノイズをそのまま出力し、SOC 表示が毎回数%動きます。 青(α=0.05)は滑らかですが 16回経っても真値に届かない。 紫(α=0.25)が両者の中間で、ノイズを 1/2.6 に圧縮しつつ 10回で 95% 収束します。
6-4. 信頼度重み w = min(1, ΔSOC/100)
統計の原則:複数の推定値を合成するとき、最適な重みは分散の逆数 (逆分散重み付け)です。§6-2 より δQ ∝ 1/ΔSOC なので、 理論的な最適重みは w ∝ ΔSOC²。
実装が線形(ΔSOC/100)な理由:2乗にすると、ΔSOC 90% の1回が ΔSOC 40% の5回分の重みを持ってしまい、1イベントの影響が大きくなりすぎる。 線形は理論最適より控えめですが、単一イベントへの依存を抑えます。原則③(保守的更新)の適用です。
効果:ΔSOC 40% の推定は実効的に α = 0.25 × 0.40 = 0.10 で反映され、 ΔSOC 90% なら α = 0.225。良質なイベントほど強く効くが、悪い方も完全には無視しない、という設計です。
6-5. ±10% クランプ ― レート制限
EMA の弱点:EMA は入力が有界であれば有効ですが、 入力が異常値のときは異常値の α 倍だけ動きます。 もし何らかの理由で Qmeas が 3900 Ah(10倍)と計算されたら、 α=0.25 でも 1回で 390 → 1268 Ah に飛びます。SOC は一気に 1/3 になります。
クランプの効果:入力を前回値の [0.9Q, 1.1Q] に切り詰めることで、 1回の更新で動ける幅の上限が α × 10% = 2.5% に固定されます。 異常値がいくら大きくても、被害は 2.5% で頭打ちです。
正常な劣化を邪魔しないか:電池が本当に 10% 以上劣化していれば、 複数回に分けて追従します(毎回 2.5% ずつ)。劣化は年オーダーなので、 数イベント(数週間)で追いつけば十分です。速さを犠牲にして安全を買うという明示的な選択です。
制御工学での対応物:アクチュエータのスルーレート制限そのものです。 「指令値がどれだけ飛んでも、実際に動ける速度には物理的上限がある」という考え方を、 ソフトウェアの学習ループに持ち込んでいます。
6-6. 学習ゲート一覧
| ゲート | 条件 | 意図(これが無いと何が起きるか) |
|---|---|---|
| ΔSOC 下限 | ≥ 37 % | §6-2 のとおり誤差が発散。小さい充放電での学習は情報量が無い |
| 積算の穴 | < 60 秒 | 区間内に通信断があると ΔAh が過小になり、容量を過小評価。以後 SOC が楽観的になる |
| 温度 | 10 〜 40 ℃ | LFP の利用可能容量は低温で減る(0℃で 80% 程度)。低温時の見かけの容量減を「劣化」と誤学習すると、春に戻っても容量が低いまま |
| クランプ | 前回値 ±10 % | 単発の異常値による破壊を防ぐ(§6-5) |
| 絶対範囲 | 設計容量の 50〜110 % | 物理的にありえない容量を弾く最終防衛線 |
真冬の朝(電池庫 5℃)に大きな放電をすると、LFP は化学的に取り出せる容量が一時的に減ります。 式(6.1)はこれを「容量が減った=劣化した」と解釈し、Qeff を下げます。 昼に暖まって容量が戻っても、EMA は下がった値を保持したまま。結果、春先まで SOC が 実際より高めに表示され続ける。10〜40℃ のゲートは、この季節性の誤学習を遮断します。
6-7. SOH の意味
健全度
%(6.4)
SOH は仮想レジスタ 0xF022 として時系列に記録されます。日々の値は誤差を含みますが、 数か月の傾きが劣化速度そのものです。年 2〜3% の低下が一般的な LFP の目安であり、 これを大きく超える下降トレンドが見えたら、運用条件(高温での使用、深い放電の頻度)を見直す材料になります。
学習が精度に効く経路:Qeff は式(5.1)の分母です。 つまり実効容量の学習は、SOC の全区間のスケールを直接補正します。 「使うほど残量%が実態に合っていく」の主要因はここです。
07 エネルギー積算(本日・累計)
SOC(%)とは独立に、各系統を通った電力量(Wh)を積算します。SOC の較正やリセットの影響を受けず、 単調増加することが設計上の要件です。
7-1. 積算式
エネルギー積算
x ∈ {pv, grid, load, chg, dis, loss}(7.1)
Δh = Δt / 3600 E_pv += max(0, P_pv) × Δh E_grid += |P_grid| × Δh E_load += max(0, P_load) × Δh E_chg += max(0, P_bat) × Δh E_dis += max(0, −P_bat) × Δh E_loss += max(0, P_loss) × Δh
物理的理由:「本日の発電量」は発電した分の合計であり、 ノイズで一瞬マイナスになった値を差し引くべきではありません。 センサーのオフセットで夜間に −3W と読めることがありますが、 これを積算すると夜のあいだ発電量が減っていくという不合理が起きます。
充放電を分けて積む理由:Pbat は双方向なので、 そのまま積算すると充電と放電が相殺され、「今日どれだけ電池を使ったか」が分からなくなります。 正負を分離して2本の単調増加量として持つことで、往復の総量(電池の稼働量)が見えます。
副作用の自覚:この切り捨てにより、微小なオフセットが積算に片側だけ入ります。 夜間 12 時間 × 3W = 36Wh 程度。日発電が 20kWh なら 0.2% で無視できますが、 センサーのオフセットが大きい機体では日発電の見かけが増えます。夜間の E_pv 増加量を見れば このオフセットを直接測れるので、診断項目として使えます。
7-2. 日境界とリセット
保存周期: 30 秒ごとに localStorage へ書き出し 日付判定: ローカル日付が変わったら日次カウンタを 0 に 累計値 : 設置以来の充電/放電量は別テーブルに保持(日付をまたいでも継続)
30 秒周期の理由:5秒ごとに書けばブラウザストレージへの書き込みが 1日 17,280回。 書き込みコストと、異常終了時に失う量(最大30秒=発電 3kW なら 25Wh)のトレードオフです。 25Wh は日次 20kWh の 0.1% であり、許容できます。
7-3. この積算が支える下流
days テーブル
日次の pv / grid / load / chg / dis / loss
→ §12 収支KPI
オフグリット率・自家消費率・買電コスト
→ §08 発電係数 k
日射量 H との比から学習
→ 月次集計
当月の days を合計
なぜ「日次」を保存の単位にするのか:発電係数 k の学習(§08)は 「1日の日射量 H に対して 1日の発電量 E」という対応で行います。 時間単位だと雲の移動によるタイムラグ(日射計と実際のパネル面の時間ずれ)が入りますが、 日積算すればそれが平均化されて消えます。学習の粒度を日にすることで、 観測のタイムラグ問題を構造的に回避しています。
08 発電予測 ― 日射から発電へ 学習
「この日射量なら、この家の屋根はいくら発電するか」を予測します。 物理の骨格(発電は日射に比例)は固定し、比例係数 k だけを実測から同定する グレーボックス同定です。
8-1. モデル
発電予測
[Wh] = [MJ/m²]·[Wh·m²/MJ]·[–](8.1)
H=日射量 [MJ/m²](Open-Meteo)、cMJ=277.8、k=学習係数。
k の物理的な正体
- PV モジュールの定格 P_rated は、標準試験条件 G_STC = 1000 W/m² での出力
- したがって等価受光性能は A_eff = P_rated / G_STC [m² 相当]
- 実運用では各種損失が掛かる → k = A_eff × PR = (P_rated[W]/1000) × PR
- 単位を kW で書けば k ≈ P_rated[kW] × PR ← 実装の「目安式」と一致
| 損失要因 | 典型値 | この設備での吸収先 |
|---|---|---|
| セル温度上昇(−0.4 %/K) | −6 〜 −12 % | すべて k に吸収される 個別にモデル化せず、実績の中央値として一括同定。 この家の方位・傾斜・影・汚れ・配線長・パワコン特性が全部この1つの数字に入る。 |
| パネル汚れ・積雪・落葉 | −2 〜 −5 % | |
| 配線・接続抵抗 | −1 〜 −3 % | |
| MPPT 追従・DC/AC 変換 | −3 〜 −6 % | |
| モジュール間ミスマッチ | −1 〜 −3 % | |
| 入射角・分光応答 | −2 〜 −4 % | |
| 積 = PR(性能比) | 0.72 〜 0.80 | 目安値 0.75 の根拠 |
kW × 0.75 はこの中央付近です。個別モデル化に必要なもの:パネル裏面温度センサー、方位・傾斜角の正確な値、 周囲構造物の3D形状(影の計算)、パネルの分光応答曲線。家庭にはどれも無い。
一括同定の利点:これらの積は、その設備ではほぼ一定です (季節変動はありますが、中央値を取れば代表値が出ます)。 未知パラメータを1個に絞ることで、実績3日で意味のある推定ができます。 6個の未知パラメータを個別推定しようとすれば、必要データ量は桁違いになります。
これが「汎用でない」ことの具体的な中身:汎用ツールは PR = 0.75 のような固定値を使います。しかし北向き斜面の家、 午後に隣家の影が入る家、雪国の家では実際の PR は 0.6 にも 0.85 にもなります。 この家の k を、この家のログから決めるのが本システムの設計です。
8-2. 学習則 ― なぜ平均でなく中央値なのか
係数の学習
(8.2)
- 破綻点(breakdown point)=推定量を無限に壊すのに必要な汚染データの割合
- 平均:0 %(1点でも異常値があれば無限に動く)
- 中央値:50 %(半数が異常でも壊れない)
- 代償 — 正規分布での相対効率:2/π ≈ 63.7 %(分散が π/2 = 1.57 倍)
- つまり中央値は、同じ精度を出すのに 約 1.57 倍のサンプルが要る
- 判断:日射→発電のデータには「雪でパネルが埋まった日」「落葉で半分隠れた日」「通信断で発電が欠測した日」が 必ず混じる。57% のサンプル効率損失より、50% の破綻点を買う方が実運用では圧倒的に得
14日中わずか1日の異常で、平均は 6.7% 引き下げられます。冬に何度も積雪すれば、 平均ベースの k は晴天日の発電を常に過小予測し続けます。中央値はこの1点を無視します。 「外れ値を手で除く」処理を書かなくても、中央値という選択そのものが外れ値対策になっているのが要点です。
§00 の同定式 argmin Σ ρ(残差) において、 ρ(e) = e²(二乗損失)の解が平均、 ρ(e) = |e|(絶対値損失)の解が中央値です。
二乗損失は大きな残差を2乗で罰するため、外れ値に引きずられます。 絶対値損失は残差の大きさに線形にしか反応しないため、外れ値が1点増えても 推定値は隣のデータ点まで動くだけです。中央値を使うという実装上の選択は、 損失関数の選択という理論的な判断と同じものです。
8-3. 初期値と切替 ― 実績3日の意味
n_days ≥ 3 : k = median( E_i / (H_i × c_MJ) ) “実測から学習” n_days < 3 : k = P_rated[kW] × 0.75 “設備容量からの目安”
中央値の下限:中央値が意味を持つ最小サンプル数は 3 です (n=1 は単なる観測値、n=2 は平均と同じ)。n=3 なら 1点の異常値があっても 中央値は残り2点の間に落ち、破綻点 33% が確保されます。
3日で十分正確か — いいえ:n=3 の中央値の標準誤差は概ね 1.25σ/√3 = 0.72σ。まだ粗い推定です。 しかし「設備容量 × 0.75 という一般論」よりは、この家の3日間のほうが確実に近い。 切替の判断基準は「十分正確か」ではなく「目安値より良いか」です。
その後も改善は続く:n が増えるにつれ標準誤差は 1/√n で減ります (§14 で詳述)。3日は「学習の開始点」であって「完成点」ではありません。 そのため学習状況(実測学習中/日数)を常に表示し、 仮想レジスタ 0xF020 に k×100 を記録して推移を追えるようにしています。
8-4. 週間予測への展開
Open-Meteo の日別日射予報 Hd に同じ k を掛けて、7日分の発電量を出します。 週間カードの棒グラフはこの値を高さで表現しています。
誠実に言うべきこと:週間予測の誤差は、ほとんどが気象予報の誤差です。 k がどれだけ正確になっても、3日後の日射量予報が外れれば発電予測は外れます。 学習で改善するのは「日射 → 発電」の変換部分だけであり、 「明日の日射がいくらか」は外部予報の精度に完全に依存します。この分解は §14 で定量化します。
09 カーテイルメント予測 ― 「捨てているPV」を見つける 学習
晴れた日に午前中で満充電になると、電池がそれ以上受け取れず、インバーターは PV の出力を絞ります。 発電できたはずの電力が消える――これがカーテイルメント(出力抑制)です。 本章はこの「見えない損失」を定量化し、予測し、家電提案に変換するまでの全アルゴリズムです。
この章が本システムの独自性の中心です。市販の監視ツールは「発電した量」を表示しますが、 「発電できたのに捨てた量」は表示しません。捨てた電力はセンサーのどこにも現れないからです。 存在しないデータを推定するには、反実仮想(もし満充電でなかったら何W出ていたか)を モデルで作る必要があります。
9-1. 問題の定式化 ― これは「打ち切りデータ」問題である
観測される PV 出力 Pi は、真のポテンシャル P*i をそのまま見せてくれません。 満充電状態では、インバーターの制御によって上から抑えられた値が観測されます。
観測モデル(打ち切り)
(9.1)
P*=真のポテンシャル(絞られなければ出ていた電力)、 Plim=満充電時に許される上限(≈ そのときの負荷)、 G=日射強度 [W/m²]、kp=ポテンシャル係数 [m² 相当]。
推定したいもの:捨て量 W = Σ(P* − P)·Δt。 しかし P* は定義上、観測できない(絞られているから)。
循環の罠:P* を求めるには kp が要る。 kp を求めるには観測 P と日射 G の関係を見る。 しかし観測 P は絞られている。絞られたデータで係数を学習すると、 その係数は「絞られた発電」を予測するようになり、捨て量がゼロと出る。
統計学での名前:これは右側打ち切り(right-censoring)そのものです。 観測値が真値の上界でクリップされている。ナイーブな回帰は必ず下方バイアスを持ちます (計量経済学の Tobit モデルが扱う問題と同型)。
9-2. 解 ― 「絞られていないサンプル」だけで学習する
ポテンシャル係数
|U| ≥ 12(9.2)
U=非打ち切り(uncensored)サブサンプル。SOC が 98% 未満なら電池はまだ充電を受け入れており、 PV は絞られていない ⇒ その時刻の観測は真のポテンシャルそのもの。
- 晴天日に 11 時満充電とすると、日射のある時間帯 6–18 時のうち 11–18 時(7/12 ≈ 58%)が打ち切り区間
- 打ち切り区間の観測値は「そのときの負荷」に張り付く。負荷 600W、ポテンシャル 2500W とすると比は 0.24 倍
- 全サンプルで中央値を取ると、サンプルの過半が打ち切り側なので中央値は打ち切り側に落ちる
- すなわち k_p^naive ≈ 0.24 × k_p^true(極端な場合)
- この k_p で捨て量を計算すると W = max(0, k_p·G − P) ≈ 0
- 結論:捨てを検出するはずの式が、捨てを完全に隠す。しかも表示上は「捨てゼロ=優秀」に見える
緑の点だけで直線を引くのが式(9.2)です。赤の点(満充電後)を混ぜると、 回帰直線は赤の破線まで寝てしまい、橙の面積=捨て量がゼロに潰れます。 「捨てを推定するために、捨てていない時間帯のデータだけを使う」という一見遠回りな設計が、 この問題では唯一の正解です。
確認できた事実①:晴天の春・秋(気温が低く発電効率が高い、かつ冷暖房負荷が小さい)で 最も早く満充電に到達し、打ち切り区間が最長になります。「一番発電する日に、一番捨てる」という 直感に反する構造が、ログ上で明確に確認できました。
確認できた事実②:非打ち切りサンプルは、朝方・夕方・曇天の時間帯に集中します。 つまり kp の学習データは低〜中日射域に偏る。 高日射域への外挿が必要になるため、物理の骨格が線形であること(P* = kp·G)が効きます。 黒箱モデルなら、学習していない高日射域で何を出すか保証できません。
確認できた事実③:12点という最低サンプル数は、実運用では 晴れ間のある日が数日あれば充足します。逆に真冬の連続曇天では非打ち切り点ばかりになり サンプルは潤沢ですが、そもそも捨てが発生しないので実害がありません。 係数が必要な状況と、係数が集まる状況が概ね一致しているのは幸運な性質です。
低日射の除外(G ≥ 80 W/m²)
式(9.2)は比 P/G を取ります。G が小さいと分母が小さく、 比の分散が爆発します(δ(P/G)/(P/G) ≈ δG/G なので G→0 で発散)。
加えて薄明時は、日射計の値と実際のパネル面への入射に方位差による系統的なずれが出ます (太陽高度が低いと入射角の効きが大きい)。80 W/m² は概ね日の出後 30〜60 分に相当し、 それ以前を切ることで比の安定性と入射角の妥当性を同時に確保します。
9-3. 出力上限クリップ ― 線形モデルの飽和
ポテンシャル(有界)
(9.3)
物理的事実:雲の縁で太陽光が反射・集光される「クラウドエッジ効果」により、 日射計は瞬間的に 1200〜1400 W/m² を記録することがあります(STC の 1000 を超える)。
線形モデルの破綻:式 P* = kp·G をそのまま適用すると、 定格 5kW の設備が 6〜7kW を発電したことになります。物理的に不可能です (パワコンの定格、ストリングの短絡電流、いずれも上限がある)。
クリップしないと何が壊れるか:捨て量 W = P* − P が 実在しない発電分だけ水増しされます。「今日は 8kWh 捨てました」という表示が出て、 それに基づく家電提案が存在しない余剰を前提に行われる。ユーザーが従うと買電が増えます。
工学的な位置づけ:これは飽和非線形性(saturation)の明示です。 実システムは必ず有界であり、線形モデルは動作範囲の中でだけ妥当です。 範囲外に出たときに何をするかを決めておくのが、実装可能なモデルの条件です。
9-4. 実測の捨て量(振り返り・高精度)
ログを後から走査して、実際に捨てた量を積算します。予測ではなく事後の計測なので、 実際の日射・実際の SOC を使えるぶん高精度です。
実測カーテイル量
C = 満充電状態の時刻集合(9.4)
満充電状態の判定 C: SOC_i ≥ 98 % または V_bat,i ≥ V_float (≈ 56.8V 付近) ↑ SOC 推定に誤差があっても、電圧側の条件で拾えるよう OR にしている(冗長判定)
SOC は推定値であり、誤差を持ちます(§05)。SOC だけで満充電を判定すると、 SOC が 96% と誤推定されている日は捨て量が丸ごと計上されません。
一方、フロート電圧への到達はインバーターが実際に絞り始めた物理的な証拠です。 2つの独立な判定を OR で結ぶことで、どちらか一方が誤っても捨てを見逃さない構成にしています。 安全側(見逃さない側)に倒す設計です。
9-5. 1日シミュレーション ― 状態方程式による前向き積分
ここからが予測の中核です。時間別の日射予報・学習した係数・学習した負荷プロファイル・ 現在の SOC を入力に、1日の電池の動きを1時間刻みで前向きに解きます。
状態方程式
余剰
[W](9.5)
充電(受入制約)
(9.6)
状態更新
(9.7)
捨て
[Wh](9.8)
Bh=時刻 h 終了時の電池エネルギー [Wh]、 Ecap=Qeff×Vnom(§06 の学習値が効く)、 Dh=放電、Δh=1 時間。
- 初期状態 B_0 = SOC_now/100 × E_cap を置く(SOC 精度がここで効く)
- 各時刻 h について、日射予報 G_h から式(9.3)でポテンシャル P*_h
- 負荷プロファイル L̂_h(§10)を引いて余剰 S_h(式9.5)
- 電池の空き E_cap − B_{h−1} と充電上限で頭打ちにして充電 C_h(式9.6)
- 入りきらなかった余剰が捨て W_h(式9.8)
- 状態を更新(式9.7)して次の時刻へ
- 日終わりまで繰り返し、Σ W_h が「本日の捨て見込み」
満充電到達時刻の算出と、時間内補間
満充電時刻
(9.9)
1時間刻みのままでは「11時」としか言えませんが、その時間内での線形補間により 「11:20 頃」まで解像度を上げられます。充電電力はその1時間内でほぼ一定なので、線形補間で十分です。
9-6. 翌日予測 ― 夜明け SOC の推定
翌日をシミュレーションするには、翌朝の出発点が要ります。今の SOC ではなく、 今夜の消費で下がったあとの SOC です。
夜明け SOC
N = 今夜〜翌日の出(9.10)
省略した場合:現在 SOC 90%(夕方)をそのまま翌朝の出発点にすると、 翌朝は「ほぼ満タン」から始まるので、翌日は朝から捨てるという予測になります。
実際:夜間に照明・冷蔵庫・待機電力で 3〜5 kWh 消費すれば、 20kWh 容量なら翌朝は SOC 65〜75%。満充電到達は数時間遅れ、捨て量も大きく減ります。
誤差の大きさ:この一手間の有無で、満充電時刻が 2〜4 時間、 捨て量が 2 倍以上変わります。翌日の家電提案が「朝から回せ」なのか「昼過ぎから」なのかを分ける、 実用上きわめて大きい差です。
下限 SOCmin を置く理由:実際の運用では、SOC が下限に近づけば 商用に切り替わるか、ユーザーが消費を抑えます。無制限に引き算すると負の SOC という 非物理的な値になるため、10% 程度で下限を設けます。
9-7. 予測誤差の感度解析 ― どの入力が結果をどれだけ動かすか
予測の信頼性を理解するには、「どの入力がどれだけ効くか」を知る必要があります。 式(9.9) の満充電時刻 h* を各入力で偏微分します。
- 満充電条件は B_0 + ∫₀^{h*} (P* − L) dt = 0.98·E_cap
- 両辺を B_0 で微分:1 + S(h*)·dh*/dB_0 = 0
- よって dh*/dB_0 = −1/S(h*)(S=その時刻の余剰[W])
- SOC 単位に直すと dh*/dSOC_0 = −E_cap/(100·S(h*))
- 同様に係数の感度:dh*/dk_p = −(∫P* dt)/(k_p·S(h*))
| 入力の誤差 | 感度式 | 数値例 | 満充電時刻のずれ |
|---|---|---|---|
| 現在 SOC が +10% | −Ecap/(100·S) | 20000Wh, S=2500W | −48 分(早まる) |
| 現在 SOC が +10%(余剰が小さい日) | 同上 | 20000Wh, S=1000W | −120 分 |
| 実効容量 Qeff が +10% | + (1−SOC₀/100)Ecap/S | SOC₀=60%, S=2500W | +19 分(遅れる) |
| ポテンシャル係数 kp が −10% | ≈ +h*·P*/S ×0.1 | h*=4h, P*=3000W, S=2500W | +29 分 |
| 日射予報が −20%(曇り予報外れ) | 同上(×2) | 同上 | +58 分 |
| 負荷プロファイルが +20% | ≈ +h*·L/S ×0.2 | h*=4h, L=600W, S=2500W | +12 分 |
この表が示す最重要の結論:満充電時刻の予測精度を支配しているのは 現在 SOC の精度です。SOC が 10% ずれれば、それだけで予測が 1〜2 時間ずれる。 日射予報の誤差より効く場合すらあります。§05・§06 に最も投資した理由がここにあります―― SOC は表示項目ではなく、予測系全体の初期条件だからです。
上下2段が同じ時間軸で連動しています。下段の状態変数 Bh が 98% に触れた瞬間(11:20)から、 上段の実発電(緑)がポテンシャル(橙)から離れ、その差の面積が捨て量になります。 予測とは、この状態変数を時間方向に前向きに解くことに他なりません。
9-8. 予測の階層 ― 3つの時間地平
| 地平 | 初期条件 | 日射の入力 | 主な誤差源 | 用途 |
|---|---|---|---|---|
| 本日の残り (数時間先) | 現在の実測 SOC | 時間別予報+実況の突合 | SOC 精度が支配的 | 今すぐ家電を回すかの判断 |
| 翌日 (12〜36時間先) | 式(9.10) の夜明け SOC(推定) | 時間別予報 | 夜間負荷の見積り+日射予報 | 明日の家事の段取り |
| 週間 (2〜7日先) | —(日積算のみ) | 日別予報 | 気象予報誤差が支配的 | 大きな消費の計画 |
地平が伸びるほど、支配的な誤差源が変わります。数時間先では自分の SOC 精度、 翌日では自分の負荷モデル、週間では他人(気象庁・Open-Meteo)の予報精度。 学習で改善できるのは前2つだけであり、この事実を §14 で誠実に定量化します。
本日の残りに余剰が無い場合(夕方以降):本日のシミュレーションを打ち切り、 翌日の余剰に対して提案・予測を出します。「もう今日は提案することがない」ではなく 「明日はこうなる」に自動で切り替えることで、常に行動可能な情報を出し続けます。
10 負荷プロファイル学習 学習
式(9.5)の L̂h――「この家は何時に何 W 使うか」。 シミュレーションの入力のうち、唯一この家の生活そのものを表すパラメータです。
10-1. 推定式
時刻別負荷プロファイル
24個の独立した中央値(10.1)
Ld,h=日 d の時刻 h における平均負荷 [W]、D14=直近14日。
平均で代表した場合:1日 12kWh 消費する家なら、平均 500W。 これを全時間帯に当てると、昼の余剰は「ポテンシャル − 500W」で計算されます。
実際の家庭:深夜 250W(冷蔵庫・待機)、朝 1200W(調理・洗濯)、 昼 400W(不在)、夕 1800W(調理・入浴)。時間帯で 7 倍以上変動します。
誤差の方向:昼の実負荷 400W に対して平均 500W を使うと、 余剰を 100W 過小評価します。一見小さいですが、これが 6 時間続けば 0.6kWh。 さらに深刻なのは夜間で、実際 250W のところを 500W と見積もれば、 式(9.10)の夜明け SOC 推定が大きく狂い、翌日予測が丸ごとずれます。
結論:余剰も夜間消費も「時間帯の関数」であり、 スカラーで代表できません。24 個の独立した推定量を持つのが最小限の構造です。
10-2. 窓長 14 日の決定 ― 3つの制約の交点
- 統計精度:中央値の標準誤差は正規近似で SE ≈ 1.253·σ/√n → n が大きいほど良い(n=7 で 0.47σ、n=14 で 0.33σ、n=28 で 0.24σ)
- 曜日効果:平日5+休日2 の週構造がある。n は 7 の倍数であるべき (7 の倍数でないと、窓に含まれる休日数が日によって変わり、プロファイルが曜日で揺れる)
- 季節追従:冷暖房負荷は 2〜3 週間で目に見えて変わる。 窓が長すぎると過去の季節を引きずる(4月に3月の暖房負荷が残る)
- 候補:n=7 → 精度不足かつ休日が1回しか入らない / n=28 → 季節追従が遅い / n=14 → 休日が2回入り、SE が 0.33σ、季節遅れは約1週間
| 窓長 | 中央値の SE | 含まれる休日数 | 季節変化への遅れ | 判定 |
|---|---|---|---|---|
| 7 日 | 0.47 σ | 2 日(1週分) | 約 3.5 日 | 精度不足・週内変動に弱い |
| 14 日 | 0.33 σ | 4 日(2週分) | 約 7 日 | 採用 |
| 28 日 | 0.24 σ | 8 日 | 約 14 日 | 季節の変わり目で外す |
§06 の EMA と同じ構造がここにも現れます。3つの時間スケールを並べると:
① 日々の変動(来客・旅行・在宅勤務)= 1日
② 学習窓 = 14日
③ 季節変化 = 1〜3か月
① ≪ ② ≪ ③。窓長は「ノイズより十分長く、トレンドより十分短い」範囲に入っていればよく、 この条件を満たす範囲では細かい値は結果を大きく変えません。 設計の勘所は「値を当てる」ことではなく「分離が成立する範囲を確保する」ことです。
10-3. ここでも中央値である理由
実際に混入するもの:来客のあった日、旅行で不在の日、 エアコンを終日つけた猛暑日、給湯器を追い焚きした日、通信断で負荷が 0W と記録された日。
平均を使った場合の壊れ方:1日の旅行(負荷ほぼゼロ)が 14日窓に入ると、 平均は約 7% 下がります。逆に猛暑日1日で 10% 以上上がることもある。 プロファイルが数日おきに揺れ、予測が安定しません。
中央値の挙動:14 点中 1〜2 点が外れても、中央値は 7 番目・8 番目の値の間に留まります。 7 点以上(半数)が同時に外れない限り動かない。実運用でそれは「生活が本当に変わった」場合であり、 そのときは追従すべきです。ロバスト統計は「無視すべき変化」と「追従すべき変化」を自動で切り分けます。
10-4. 学習の進捗表示
学習日数 n が記録され、仮想レジスタ 0xF021 に保存される n < 3 : 「実測待ち」― プロファイルを使わず、直近の実測負荷で代用 3 ≤ n < 14 : 「学習中(n日)」― 使うが、精度の但し書きを表示 n ≥ 14 : 「学習済み」― 窓が満杯。以降は古い日から押し出される
なぜ進捗を見せるのか:ユーザーが予測を信じてよいかを判断する材料だからです。 「捨て見込み 6kWh」という数字は、負荷プロファイルが 3日分なのか 14日分なのかで 信頼度がまったく違います。推定値には必ず但し書きを添える――§05-7 の信頼度と同じ思想です。
11 余剰活用アナウンス ― 捨てるPVを行動に変える
§09 で「今日 6.2kWh 捨てる見込み」と分かっても、それだけでは行動になりません。 「どの家電を、いつ、何台まで回せばよいか」に変換するのがこの章です。 ここは制約付き組合せ最適化の問題として定式化されます。
11-1. 余剰の3つの指標
総量・ピーク・平均
(11.1)
| 指標 | 単位 | 何を制約するか | 使い方 |
|---|---|---|---|
| 総量 Esur | Wh | その日に吸収できるエネルギーの総量 | 「エコキュート1回分は入るか」の判定 |
| ピーク Ppeak | W | 同時に出せる瞬時電力の上限 | 単体で回せる最大の機器を決める |
| 平均 Pavg | W | 継続的に使える安全側の目安 | 長時間運転する機器の判断 |
総量だけでは不十分:「6.2kWh 余る」からといって、3kW の EV 充電器を回せるとは限りません。 余剰が 1kW × 6時間 に分散していれば、3kW は一瞬たりとも太陽光でまかなえない。 差額 2kW は電池か商用から出ることになり、買電が増えます。
ピークだけでも不十分:ピークが 3kW あっても、それが 20 分だけなら エコキュート(1.5kW × 3時間 = 4.5kWh)は完走できません。
エネルギーと電力は別の制約:これは電力システムにおける 容量制約(kW)とエネルギー制約(kWh)の区別そのものです。 両方を独立に満たさなければ、提案は物理的に実行不可能になります。
11-2. 最適化問題としての定式化
目的関数
吸収できるエネルギーを最大化(11.2)
制約条件
(11.3)
xi=家電 i を回すか(0/1)、Pi=定格 [W]、 Ei=1回の運転で消費する量 [Wh]、Pinv=インバーター出力定格。
問題の分類:これは2次元 0-1 ナップサック問題(電力とエネルギーの2つの容量制約)です。 厳密解は NP 困難ですが、家庭の対象家電は n ≤ 10 程度なので全探索(210 = 1024 通り)も可能です。 実装では、次に述べる理由から降順貪欲法を採用しています。
11-3. 降順貪欲アルゴリズム
- 単体制約でふるい落とす:P_i > 1.1·P_peak の家電を候補から除外
- 定格の降順にソート:P_1 ≥ P_2 ≥ … ≥ P_n
- 残余余剰 R ← E_sur、残余電力 Q ← min(P_peak, P_inv) で初期化
- 各家電について順に:R ≥ 0.5·E_i かつ Q ≥ P_i なら採用し、 R ← R − E_i、Q ← Q − P_i
- 採用された家電の合計 W と、使い切れずに残る捨て量 R を併記して提示
理由1 — 価値密度が均一:ナップサック問題の貪欲法は通常 「価値/重量比の降順」で詰めます。ここではどの1 kWh も価値が同じ(同じだけ買電を減らす)ため 比が全家電で等しく、比による順序付けが意味を持ちません。そこで吸収量の絶対値で順序を決めます。
理由2 — 大きい機器ほど捨てを速く潰す:ピーク余剰は時間幅が限られています。 その限られた窓で最大量を吸収するには、電力の大きい機器を優先するのが有利です。 小さい機器から詰めると、ピーク時間帯を使い切る前に窓が閉じます。
理由3 — 実行可能性:エコキュート・EV 充電・食洗機のような大型機器ほど 運転タイミングの自由度が低い(沸き上げは連続運転が必要)。 先に大型機器の居場所を確保し、小型機器を隙間に入れるほうが、実際に実行できる提案になります。
近似の質:単一制約のナップサックにおいて、貪欲法は最適解の 1/2 以上を保証します(最良の単品と貪欲解の良い方を取る場合)。 実際には家電数が少なく定格が離散的なため、ほぼ最適解に一致します。 厳密解に対する改善余地より、計算の透明性(なぜその提案かを説明できる)を優先しました。
11-4. 2つのマジックナンバーの根拠
採用閾値 0.5 ―「半分以上まかなえるなら提案する」
閾値を 1.0(全量まかなえる)にすると: 余剰がぴったり足りる日しか提案が出ません。実運用ではほぼ何も提案されないツールになります。 予測には誤差があるため、1.0 を要求すると誤差のぶんだけ常に不足判定になります。
閾値を 0(無条件)にすると:余剰 100Wh しかなくても 4kWh の エコキュートを提案します。実質 97% を買電・電池から取るので、提案に従うと損をする。
0.5 の意味:「半分以上を太陽光でまかなえるなら、 その家電を昼に回す価値がある」という判断です。残り半分は電池から出ますが、 その電池は昼のうちに再充電される見込みがあります(まだ余剰時間帯が続くため)。 実質的な自家消費率は 50% を大きく上回るケースが多くなります。
確認可能性:提案には常に「合計 W」と「それでも残る捨て見込み」を併記します。 ユーザーは 0.5 という内部閾値を知らなくても、提案に従った場合の結果を数字で確認できます。
単体制約の 1.1 倍 ―「ピーク余剰の 10% 増しまで許す」
Ppeak は予測値である:§09 の感度解析のとおり、 日射予報・係数・SOC の誤差が乗っています。実運用での予測 RMSE は概ね ±10% 程度。
厳密に切った場合:予測ピーク 2.40kW のとき、定格 2.45kW の家電は除外されます。 しかし実際のピークが 2.6kW だったなら、それは回せた家電です。 予測誤差のせいで有用な提案を落とすことになります。
1.1 倍の意味:予測誤差の 1σ 相当を許容幅として上乗せします。 わずかに超える家電は「回せる可能性が高い」として提案に含め、 大きく超える家電(EV 充電 3.0kW vs ピーク 2.4kW = 1.25倍)は明確に除外します。
超過した場合の実害:瞬間的に不足したぶんは電池が補います。 10% の超過が数分続く程度なら、電池から数十 Wh 出るだけで、 その後の余剰で充電し直されます。非対称なリスク(見逃しの損失 > わずかな超過の損失)を 反映した非対称な閾値です。
緑=提案採用、薄緑=未選択、赤=単体制約で自動除外。 EV 充電は 3.00 kW でピーク 2.40 kW を 25% 超過するため、どう組み合わせても太陽光では回せません。 「提案しない」ことも情報であり、代わりに時間をずらす案内を出します。
11-5. アナウンスの設計 ― 数字を行動に翻訳する
| 内部の計算結果 | そのまま出した場合 | 実際のアナウンス |
|---|---|---|
| h* = 11:20、Esur = 6.2 kWh | 「満充電 11:20、余剰 6.2kWh」 | 「11時20分ごろ満充電。以降の発電を捨てます」 |
| 採用集合 {エコキュート, 洗濯乾燥, エアコン} | 「3件採用」 | 「11時台からエコキュート+洗濯乾燥機を回すと 2.7kW 吸収できます」 |
| 残余 R = 1.8 kWh | 「残余 1800Wh」 | 「それでも 1.8kWh は捨てる見込みです」 |
| Pi > 1.1Ppeak | (表示なし) | 「EV 充電は太陽光だけでは足りません。時間をずらすか夜間に」 |
アナウンスの原則:①いつ(時刻)②何を(具体的な家電名)③どれだけ効くか(kW/kWh) ④それでも残る損失――この4点を必ず含めます。 「余剰があります」だけでは行動が変わりません。予測の価値は、行動が変わって初めて実現します。
実機での出力例
実機ダッシュボード(予測・アドバイス・KPI)

左下「余剰電力の活用アドバイス」が §09〜§11 の最終出力です。 表示されている「本日の発電予測 17.1kWh。9〜13時ごろに満充電へ達し、その時間帯に余剰(捨てPV)が出る見込みです。」は、 式(8.1)の発電予測 → 式(9.5〜9.8)の1日シミュレーション → 式(9.9)の満充電時刻 h*、という計算の結果を 日本語の一文に翻訳したものです。深夜0時台の実行なので「夜間・早朝は太陽光の余剰はありません」と正しく判定し、 §09-8 の規則どおり本日の残りではなく翌日の余剰に切り替えて提案しています。
右上の週間予測:棒=式(8.1)による発電予測 [kWh]、その下の「予測係数: 実績から学習(実績11日ぶん)」が §08-3 の学習状況表示です。3日を超えているので目安値ではなく実測学習に切り替わっており、 §14-2 の √n 則でいえば相対誤差はまだ 0.3 前後――「使えるが完成はしていない」段階であることが読み取れます。
右下の今日の集計:オフグリット率(今月)100% / 0%、変換ロス 77Wh、効率 75.2%(軽負荷のため低め)。 §12-1 の roff・rgrid と §12-2 の残差率がそのまま並んでいます。
この画面が示す設計の答え合わせ:アドバイス文には 「いつ(9〜13時ごろ)」「何が起きるか(満充電に達し余剰が出る)」「どれだけか(17.1kWh)」が入っています。 数式の出力である h* や ΣWh を、そのまま数字で見せるのではなく 行動できる文へ翻訳することが最後の一手間であり、ここまでやって初めて §09 の複雑な計算が意味を持ちます。
最も効くのは春と秋:日射が強く、冷暖房負荷が小さいため 午前中に満充電に到達しやすい。捨てが最大になる季節に、提案の価値も最大になります。
効かないのは真夏と真冬:真夏は冷房負荷が大きく余剰が出にくい、 真冬は日射が弱く満充電に達しない。この時期は提案がほとんど出ませんが、 それが正しい挙動です(捨てていないのだから提案する必要がない)。
副次的な発見:捨て量を可視化すると、ユーザー自身が 「では給湯のタイマーを昼に変えよう」という恒久的な設定変更をするようになります。 毎日の提案より、この一度きりの設定変更のほうが年間の効果は大きい。 可視化そのものが最大の機能だった、というのが2年で得た知見です。
12 収支KPI とデータ整合
§07 の日次エネルギー(days)から、自給の度合いとコストを算出します。 KPI は「良い/悪い」を測るだけでなく、計測系が壊れていないかを検算する役割も持ちます。
12-1. 自給に関する KPI
オフグリット率
roff + rgrid = 100(12.1)
自家消費率
発電のうち活用できた割合(12.2)
買電コスト
p = 単価 [円/kWh](12.3)
よくある誤解:「オフグリット率 100% = 完璧」ではありません。 商用をまったく使わずに、同時に発電を大量に捨てている、という状態がありえます。
2軸で見る:
オフグリット率= 消費の側から見た自立度(買電に頼らなかったか)
自家消費率= 発電の側から見た有効利用度(作った電気を使い切れたか)
4象限: 両方高い=理想(発電を使い切り、買電もゼロ)。 オフグリット高・自家消費低=捨てている(→ §11 の提案が効く状況)。 オフグリット低・自家消費高=発電容量不足(設備増設の検討材料)。 両方低い=設備か運用に問題あり。
だから両方表示する:片方だけでは改善の方向が分からない。 2つの KPI を並べることで、次に何をすべきかが決まります。
KPI を 2 軸で持つ設計意図。単一のスコアに丸めないことで、「今どの状態にいて、次に何をすべきか」が 一意に決まります。1つの総合スコアにまとめると、この情報は失われます。
12-2. 収支の閉じ残り ― データ・リコンシリエーション
残差率
(12.4)
理論値:インバーターの変換効率が 93〜95% なら、残差率は 5〜7%。 軽負荷時は待機電力の比率が上がって 10〜15% まで上昇します。
18% を超えたら:もはや変換効率では説明できません。原因の候補は――
・レジスタの倍率設定ミス(×0.1 と ×1 の取り違え)
・PV2 非対応機での PV_W_SCALE の設定誤り
・相の取りこぼし(負荷 C 相を読んでいない)
・電流センサーの大きなオフセット
なぜこの指標が要るのか:個々のセンサーは単独では検証できません。 4系統が同時に整合するかどうかという横断的な条件だけが、 「どれか1つがおかしい」ことを検出できます。化学プラントの物質収支突合、 会計の複式簿記と同じ、冗長な関係式による誤り検出です。
12-3. 月次集計と表示の粒度
今月の各値 = Σ (当月の days レコード) 表示単位 = 本日 / 今月 の 2 段 比率KPI = 分子・分母をそれぞれ合計してから割る(比率の平均ではない)
比率を平均してはいけない:月次のオフグリット率は Σ(消費−買電) / Σ消費 であり、 日次オフグリット率の平均ではありません。 消費 1kWh の日と 30kWh の日を等しく扱うと、小さい日が過大な影響を持ちます。 これは統計におけるシンプソンのパラドックスを招く典型的な誤りで、 集計順序を間違えると月次と日次で矛盾した結論が出ます。
13 残差ベース異常検知
「モデルが予測した値」と「実際に観測された値」の差=残差を監視します。 残差が説明できないほど大きいとき、モデルか設備のどちらかに問題があります。
13-1. 検知の一般形
残差検定
cj = 前提条件(13.1)
重要なのは第2項 Λ cj(前提条件の連言)です。条件を付けずに残差だけを見ると、 正常な理由で残差が大きくなる状況まで異常と判定してしまいます。
13-2. 発電性能低下の検知
性能残差
(13.2)
条件① SOC < 98%(非満充電): これが無いと、満充電で正常に絞っている状態を「性能低下」と判定します。 晴天日の午後は毎日アラートが出ることになり、通知が意味を失います (オオカミ少年効果 ― 誤警報が多い監視は無視されるようになる)。
条件② G ≥ Gmin(好天): 弱日射では比の分散が発散します(§09-2 と同じ理由)。曇天の朝に r が 0.5 になっても、 それは日射計とパネルの時間ずれや入射角の影響であって、故障ではありません。
一般原則:検知は「その現象が起きえない条件下」でのみ行う。 これが残差ベース診断(FDI: Fault Detection and Isolation)の基本作法です。 条件の設計は、しきい値の設計より重要です。
- 前提条件を満たすサンプル(好天・非満充電)における r_pv の分布を2年分のログで確認
- 平均はほぼ 1.0(k_p が中央値で同定されているため定義的にそうなる)
- ばらつきの主因:雲の通過、入射角の日変化、パネル温度 → 標準偏差はおよそ σ ≈ 0.10
- しきい値 0.65 は (1.0 − 0.65)/0.10 = 3.5σ
- 正規近似での誤警報率 ≈ 0.02 % → 5秒サンプルでも実質的に鳴らない
- 逆に検出できるもの:パネル 1/3 の遮蔽、ストリング 1系統の脱落、著しい汚れ・積雪
しきい値設計のトレードオフ:厳しくする(0.85 など)と軽微な汚れも拾えますが、 雲の多い日に誤警報が増えます。緩くする(0.4)と誤警報はゼロですが、 片系統の脱落(比 0.5)を見逃します。0.65 は「1系統落ち」を確実に拾い、 かつ通常の気象変動では鳴らない点として選ばれています。
13-3. 検知項目一覧
| 検知 | 残差の定義 | 前提条件 | しきい値 | 示唆される原因 |
|---|---|---|---|---|
| 発電性能の低下 | Pobs/P* | 好天 かつ 非満充電 | < 0.65 | 汚れ・影・積雪・ストリング脱落・故障 |
| 収支異常 | Eloss/Ein | —(常時) | |·| > 18 % | 倍率設定ミス・相の取りこぼし・センサー異常 |
| いま絞り中 | — | 満充電 かつ 余剰あり | — | 異常ではない。余剰活用の案内トリガー |
| SOC 信頼度の低下 | 較正からの経過時間 | — | > 72 h | 満充電に到達できていない(曇天が続く・容量設定が過大) |
| 積算の欠損 | Δt > 30s の発生率 | — | — | 通信品質・PC のスリープ設定 |
「異常ではないが知らせる」項目を混ぜている理由:3行目の「いま絞り中」は障害ではありません。 しかしユーザーが行動できる情報です。監視系の目的は「壊れたことを知らせる」ではなく 「今やるべきことを知らせる」である、という設計判断です。
14 学習の収束 ― √n 則と、超えられない壁 重要
「データが溜まると精度が上がる」を、どれだけ・どの速さで・どこまで上がるのかを数式で示します。 誇張せず、上がらないものは上がらないと明示します。
14-1. 誤差の分解
発電予測の誤差は、独立な2つの成分に分解できます。
誤差の分解
(14.1)
| 成分 | 正体 | 大きさ(目安) | 学習で減るか |
|---|---|---|---|
| σparam パラメータ誤差 | k・kp・L̂h・Qeff の推定誤差 | 初期 15〜25 % 収束後 2〜4 % | 減る(1/√n) |
| σinput 入力誤差 | 日射予報の外れ(気象庁・Open-Meteo の精度) | 翌日 10〜20 % 3日後 25〜40 % | 減らない |
| (構造誤差) | 線形モデルで表せない部分(部分影の非線形性など) | 3〜8 % | 減らない |
14-2. パラメータ誤差の減り方 ― √n 則
中央値の標準誤差
正規分布での漸近式(14.2)
係数 1.253 = √(π/2)。これが「中央値は平均より 25% 効率が悪い」の正体です (その代わり破綻点 50% を得る、§08-2)。
| 学習日数 n | SE / σ | 初日を 1.00 としたときの相対誤差 | この時点の状態 |
|---|---|---|---|
| 1 | 1.253 | 1.00 | 目安値(設備容量 × 0.75)を使用中 |
| 3 | 0.723 | 0.58 | 実測学習に切替(§08-3) |
| 7 | 0.474 | 0.38 | 発電・捨て量が実態に馴染む |
| 14 | 0.335 | 0.27 | 負荷プロファイルが一巡(§10-2) |
| 30 | 0.229 | 0.18 | ほぼ収束。以降は緩やか |
| 90 | 0.132 | 0.11 | 季節ごとの特性が見え始める |
| 730(2年) | 0.046 | 0.037 | 年周期を2回観測。季節依存も同定可能 |
曲線が 100% に届かないことが、この図の最も重要な情報です。 学習は σparam を減らしますが、σinput(気象予報の外れ)は手元では減らせません。 2年運用しても天井は動かない。「上がらないものは上がらない」と明示することが、 予測を実際に使える情報にします――どこまで信じてよいかが分かるからです。
14-3. 何が上がり、何が上がらないか
上がる 学習で改善するもの
| 発電係数 k | 3日で切替、以降 1/√n |
| ポテンシャル係数 kp | 12点以上で学習開始 |
| 負荷プロファイル | 14日で一巡・安定 |
| 実効容量 Qeff | 大きな充放電のたび |
| SOC の実態一致度 | Qeff の改善に連動 |
| 捨て量・満充電時刻 | 上記すべての合成 |
上がらない 学習の対象外
| 天気予報そのもの | 外部(気象庁・Open-Meteo)の精度 |
| リアルタイム実測 | センサーの生値。学習と無関係 |
| 商用(買電)の実測 | 専用の学習なし。計算値 |
| 突発的な負荷 | 来客・臨時の家電。原理的に予測不能 |
| ハードウェアの精度 | A/D 分解能・センサー確度 |
間接的には良くなるもの:「買電の予測」には専用の学習がありませんが、 買電 = 負荷 − 発電 − 放電 の関係により、 負荷と発電の学習が進めば買電予測も改善します。直接学習していないが、 構成要素の改善が伝播するという経路です。
14-4. 学習状況の可視化と記録
| 仮想レジスタ | 記録内容 | 後から何が分かるか |
|---|---|---|
0xF000 | 積算 SOC | 実機 SOC との乖離パターン(§05-8) |
0xF011 | 日射量の実況 | 実発電との突合 → k の裏付け |
0xF020 | 発電係数 k × 100 | 係数が季節でどう動いたか(夏の温度損失など) |
0xF021 | 負荷学習日数 | プロファイルの成熟度 |
0xF022 | 実効容量 SOH (%) | 電池の劣化トレンド(年 2〜3% が目安) |
発電係数 k の季節変動:夏は温度損失で低く、春秋に最大、冬は入射角と日照時間で中程度。 年周期の変動が明確に見えるため、2年目からは「季節ごとの k」を持つ余地があります (現行は全期間の中央値を1つ持つ設計)。
SOH のトレンド:日々の推定は ±5% でばらつきますが、 数か月の移動中央値を取ると滑らかな下降トレンドが見えます。 1日の値では劣化を語れず、長期ログがあって初めて意味を持つ指標です。 これが「2年分のログを残す」ことの直接的な価値でした。
記録しておいてよかったもの:学習値そのもの(0xF020–F022)を 時系列で残したこと。ロジックを変更したとき、変更前後で係数がどう動いたかを比較できる。 137回の改修を安全に進められたのは、この「学習の履歴」があったからです。
15 数値安定化の 8 技法 ― 産業レベルの「壊れなさ」の中身
本システムに散らばっているガードは、実は8種類の定型技法に分類できます。 これらは制御工学・信号処理・計装の分野で確立された手法であり、 「産業レベルの精度を家庭用に組み込んだ」という言葉の具体的な中身です。
| # | 技法 | 数式形 | 本システムでの適用箇所 | 防いでいる失敗 |
|---|---|---|---|---|
| 1 | ゲート Gating | if ¬c then skip | ΔSOC≥37%(§06)/温度10–40℃(§06)/SOC<98%(§09)/G≥80W/m²(§09) | 情報量の無いサンプルによる誤学習 |
| 2 | 飽和/クリップ Saturation | min(x, xmax) | ポテンシャル ≤ Pmax(式9.3)/SOC ∈ [0,100]/容量 ∈ 設計の50–110% | 線形モデルの動作範囲外での非物理的な値 |
| 3 | レート制限 Rate limiting | |Δx| ≤ r·x | 容量更新の ±10% クランプ(式6.3) | 単発の異常値による状態の破壊 |
| 4 | デバウンス Debouncing | c が T 秒連続 | 満充電判定 180秒(式5.4)/静止 OCV 600秒(式5.3) | 瞬時ノイズによる誤トリガ(誤較正) |
| 5 | ロバスト統計 Robust estimation | med{·} (破綻点 50%) | 発電係数 k(式8.2)/ポテンシャル係数 kp(式9.2)/負荷プロファイル(式10.1) | 外れ値(積雪・落葉・欠測・旅行)による推定の破壊 |
| 6 | 1次 IIR 平滑化 EMA / low-pass | x ← x + α(u − x) | 実効容量の更新(式6.3、α=0.25) | 推定ノイズがそのまま表示に出ること |
| 7 | 条件付き検知 Conditioned FDI | alarm ⟺ r<θ ∧ Λcj | 発電性能低下(式13.2)― 好天 かつ 非満充電のときのみ | 正常な理由で残差が出る状況での誤警報 |
| 8 | 冗長性による突合 Reconciliation | Σin − Σout = loss | 収支の閉じ残り(式12.4)/積算SOC vs 実機SOC(§05-8)/満充電判定の OR 条件(§09-4) | 単独では検証できないセンサー異常・設定ミス |
15-1. 技法を貫く共通思想 ― 時定数の分離
技法 5・6・そして負荷プロファイルの窓長設計は、すべて同じ問いに答えています。 「どのくらいの速さの変化を、信号として拾い、どのくらいを雑音として捨てるか」。
分離条件
(15.1)
| 対象 | τnoise(捨てたい) | τfilter(設計値) | τsignal(拾いたい) |
|---|---|---|---|
| 実効容量 | 1イベントの推定誤差 | EMA 3.5イベント ≒ 2–3週 | 電池の劣化(年オーダー) |
| 負荷プロファイル | 日々の変動(1日) | 窓 14日 | 季節変化(1–3か月) |
| 発電係数 k | 雲・汚れの日変動 | 全期間中央値 | 季節・経年劣化 |
| SOC 積算 | 電流ノイズ(5秒) | 積算そのもの | 実際の充放電 |
設計の勘所:定数を「当てる」のではなく、分離が成立する範囲を確保すること。 α=0.25 が α=0.20 でも α=0.30 でも結果はほとんど変わりません。 重要なのは α=1.0(分離なし)や α=0.02(信号まで潰す)を避けることです。 頑健な設計とは、パラメータの微調整に依存しない設計を指します。
15-2. 非対称な設計 ― 安全側に倒す方向
| 判断 | 2つの誤り | どちらを重く見るか | 実装 |
|---|---|---|---|
| SOC 表示 | 過大表示 / 過小表示 | 過大表示が危険(急に落ちる・過放電) | ηchg=0.99 で保守的に、表示 SOC で下限マージン |
| 捨て量の検出 | 見逃し / 過検出 | 見逃しが問題(改善の機会を失う) | 満充電判定を SOC OR 電圧の冗長条件に |
| 家電提案 | 提案しすぎ / 提案しなさすぎ | 提案しなさすぎが問題(ツールの意味が消える) | 閾値 0.5、単体制約 1.1倍で幅を持たせる |
| 容量学習 | 追従が遅い / 誤学習 | 誤学習が致命的(SOC 全体が狂う) | ゲート+クランプ+EMA の三重防御 |
| 異常検知 | 見逃し / 誤警報 | 誤警報が問題(通知が無視される) | 3.5σ の厳しいしきい値+前提条件 |
項目ごとに「安全側」の向きが違います。SOC は過小表示が安全ですが、 捨て量は過検出(多めに出す)が安全、異常検知は逆に見逃し側が安全(誤警報を嫌う)。
「保守的に作る」という一言では設計できません。その判断で誤ったとき、 ユーザーが何を失うかを個別に考え、損失の大きい側を避けるように非対称なしきい値を置く。 これが 137 回の改修で繰り返してきた作業の実体です。
16 産業技術との対応表
本システムの各アルゴリズムが、産業・学術のどの技術に対応するかを示します。 「家庭用に独自実装した」のではなく、確立された手法を家庭用の制約下で再構成したことの確認です。
| 本システムの実装 | 産業・学術での対応物 | 使われている分野 | 家庭用向けの簡略化 |
|---|---|---|---|
| クーロン積算+端点較正(§05) | TI Impedance Track™ EKF/UKF ベースの SOC 推定 | EV・産業用BMS・ノートPC | カルマンゲインの連続計算を、ゲート方式(較正する/しない)に離散化 |
| OCV–SOC テーブル逆引き(§05-3) | OCV ルックアップ+緩和時間補償 | 全 BMS | ヒステリシスモデル(充放電で OCV が異なる)を省略 |
| 実効容量の EMA 学習(§06) | 容量フェード追従 RLS(再帰的最小二乗)による SOH 推定 | EV バッテリー診断 | RLS の共分散更新を、固定 α の1次 IIR に簡略化 |
| 日射→発電の係数同定(§08) | Performance Ratio(IEC 61724-1) PVWatts の DC/AC 損失モデル | メガソーラー監視・発電量保証 | 温度・入射角・分光の個別モデルを、1つの係数に一括吸収 |
| 打ち切りサンプル除外(§09-2) | Tobit モデル/打ち切り回帰 完全観測サブサンプル法 | 計量経済学・生存時間解析 | 尤度最大化を行わず、非打ち切り部分集合での中央値で代替 |
| 出力抑制量の推定(§09-4) | Curtailment estimation 反実仮想ベースライン推定 | 系統運用・再エネ出力抑制の精算 | 近傍発電所との相互参照を使わず、自設備の非抑制時データのみ |
| 中央値による推定(§08-2) | ロバスト統計 L1 推定量・Huber 損失・破綻点 | 統計学・信号処理全般 | M推定の反復計算を行わず、単純中央値で代替 |
| 1日シミュレーション(§09-5) | MPC の予測ホライズン内プラントモデル 前向きオイラー積分 | プロセス制御・エネルギーマネジメント | 最適化は行わず、開ループの前向き積分のみ(提案は貪欲法) |
| 家電割当(§11-3) | 0-1 ナップサック問題 貪欲近似(保証比 1/2) | 組合せ最適化・スケジューリング | 厳密解(DP・分枝限定)を使わず、説明可能な貪欲法 |
| 残差ベース異常検知(§13) | FDI(Fault Detection and Isolation) モデルベース診断 | 航空・プラント・車載 | 残差生成器の設計を、単純な比とゲートで代替 |
| 収支の閉じ残り(§12-2) | データ・リコンシリエーション 物質・エネルギー収支の整合 | 化学プラント・製鉄・精製 | 最小二乗による測定値の補正は行わず、逸脱の検出のみ |
| 時定数分離(§15-1) | 特異摂動法/スケール分離 | 制御理論全般 | 理論的な分離条件の検証を、経験的な不等式の確認で代替 |
右端の列が本システムの設計の核心です。どの行でも「厳密な手法を、 入力の少なさ・計算資源・欠測の多さという家庭用の制約下で成立する形に落とした」 という同じ変換が行われています。簡略化する場所を、理論を理解したうえで選ぶ―― これが「産業レベルの考え方を家庭用に組み込む」の実際の作業内容でした。
17 137回の改修が残したもの ― 主要な33件と失敗モード
2年間・137回の改修のうち、ロジックの構造そのものを変えた主要な33件を、 「何が起きたか → なぜ起きたか → どう直したか」の形で一覧にします。 現行コードにある定数やガードは、ほぼすべてこの表のどこかに対応しています。
| # | 領域 | 観測された失敗モード | 原因 | 実装した対策 | 参照 |
|---|---|---|---|---|---|
| 1 | SOC | 重い家電を使った瞬間に残量がストンと落ち、切ると戻る | Wh(電力量)で積算していたため、内部抵抗の熱損失を「消費」に誤計上 | Ah(電荷)積算へ変更。I²R 項が式から消える | §02-1 |
| 2 | SOC | SOC 表示が負荷に合わせて上下にばたつく | 全域で電圧から SOC を推定していた。LFP の平坦域では電圧が残量を語らない | 平坦域(3.15–3.35V/cell)では較正禁止 | §05-2 |
| 3 | SOC | 放電中だけ SOC が実際より低く出る | 端子電圧をそのまま OCV として使用。IR ドロップ未補正 | OCV = V − I·Rint の補正+静止条件 | §05-3 |
| 4 | SOC | 雲の切れ間で誤って 100% に較正される | 瞬時値で満充電判定していた | 180秒(36サンプル)連続のデバウンス | §05-4 |
| 5 | SOC | SOC 80% で満充電と誤判定 | 電圧のみで判定。大電流時は IR で端子電圧が上限に届く | 電圧 AND 尾電流(0.02C)の連言に変更 | §05-4 |
| 6 | SOC | スリープ復帰時に SOC が 20% 飛ぶ | Δt に上限が無く、1時間分を1サンプルで外挿 | Δt > 30秒の区間は積算しない | §03-2 |
| 7 | SOC | 電池を使い切って寿命を削っていた | 物理 SOC をそのまま表示。0% が「本当の空」だった | 表示 SOC の線形写像(0% = 50.0V) | §05-5 |
| 8 | SOC | 「使用可能時間」が実際より約10%短く出る | 表示 SOC で残時間を計算していた(写像後の値を使った) | 物理 SOC と Qeff で計算し、最後に表示へ変換 | §05-6 |
| 9 | SOC | 起動直後の推定値が実測と同等に見えていた | 信頼度の概念が無かった | 信頼度(高/中/低)を併記。較正からの経過・欠測で判定 | §05-7 |
| 10 | 容量 | 経年で残量%が実態からずれ続ける | 設計容量(固定値)を分母に使用 | 実効容量 Qeff の学習を導入 | §06-1 |
| 11 | 容量 | 容量推定値が毎回大きく暴れる | 小さな充放電でも学習していた(ΔSOC 10% など) | ΔSOC ≥ 37% のゲート(誤差伝播から逆算) | §06-2 |
| 12 | 容量 | 1回の誤推定で容量が飛び、SOC 全体が狂う | 推定値をそのまま代入していた | EMA(α=0.25)でなじませる | §06-3 |
| 13 | 容量 | 異常値が入ったとき EMA でも被害が大きい | 入力に上限が無かった | ±10% クランプ(レート制限) | §06-5 |
| 14 | 容量 | 冬に容量が下がり、春になっても戻らない | 低温での見かけの容量減を「劣化」と誤学習 | 温度 10–40℃ のゲート | §06-6 |
| 15 | 容量 | 通信断をまたいだ区間で容量が過小に出る | 欠測で ΔAh が過小になっていた | 積算の穴 < 60秒のゲート | §06-6 |
| 16 | 容量 | 質の悪い推定が良い推定と同じ重みで入る | 重み付けなし | w = min(1, ΔSOC/100) の信頼度重み | §06-4 |
| 17 | PV | 発電量が常に約半分に見える | PV2 非対応機で1系統しか読めていなかった | PV_W_SCALE = 2 による近似(設備固有の設定) | §04-1 |
| 18 | 符号 | 充放電の向きが逆に表示される機体がある | 符号規約が機種依存で、変換が複数箇所に散っていた | BATT_SIGN で読み出し直後に1回だけ正規化 | §01 |
| 19 | 予測 | 積雪・落葉の1日で発電予測が数%狂ったまま戻らない | 係数を平均で学習していた(破綻点 0%) | 中央値へ変更(破綻点 50%) | §08-2 |
| 20 | 予測 | 捨てているのに「捨て量ゼロ」と表示 | 絞られたサンプルを含めて係数学習 → 係数が下方バイアス(打ち切り問題) | SOC < 98% の非打ち切りサンプルのみで学習 | §09-2 |
| 21 | 予測 | 定格を超える発電予測が出る | 雲エッジ効果で日射 1200W/m² を線形外挿 | min(kpG, Pmax) でクリップ | §09-3 |
| 22 | 予測 | 薄明時に係数が異常値になる | 比 P/G の分母が小さく、分散が発散 | G < 80 W/m² を除外 | §09-2 |
| 23 | 予測 | SOC 推定が少しずれた日、捨て量が丸ごと計上されない | 満充電判定を SOC 単独で行っていた | SOC ≥ 98% OR 電圧 ≥ フロートの冗長判定 | §09-4 |
| 24 | 予測 | 昼の余剰を過大評価し、提案が外れる | 負荷を1日平均で代表していた | 時刻別(24点)の負荷プロファイル | §10-1 |
| 25 | 予測 | 旅行・来客の1日でプロファイルが揺れる | 平均で学習していた | 時刻別中央値へ変更 | §10-3 |
| 26 | 予測 | 曜日によってプロファイルが揺れる | 窓長が 7 の倍数でなく、含まれる休日数が変動 | 窓長 14日(休日が必ず4日入る) | §10-2 |
| 27 | 予測 | 翌日の満充電時刻が 2〜4 時間ずれる | 現在 SOC をそのまま翌朝の初期値にしていた | 夜明け SOC の推定(夜間消費を差し引く) | §09-6 |
| 28 | 提案 | 同時に出せない家電を提案してしまう | エネルギー制約だけを見て、電力制約を見ていなかった | 単体制約 Pi ≤ 1.1·Ppeak を追加 | §11-4 |
| 29 | 提案 | 提案がほとんど出ず、機能が死んでいた | 「全量まかなえる」を条件にしていた | 採用閾値 0.5(半分以上)に緩和 | §11-4 |
| 30 | 提案 | 提案に従っても捨て量があまり減らない | 小さい家電から割り当てていた | 定格の降順に貪欲割当へ変更 | §11-3 |
| 31 | 検知 | 晴天の午後に毎日「発電性能低下」の警告が出る | 満充電による正常な絞りを異常と判定 | 好天 AND 非満充電の前提条件を追加 | §13-2 |
| 32 | 検知 | 倍率設定ミスに数週間気づけなかった | 系統横断の整合チェックが無かった | 収支の閉じ残り |·| > 18% で警告 | §12-2 |
| 33 | 運用 | ログファイルが肥大し、1年表示が実用にならない | 5秒生データを全期間保持していた | 1分平均へ集約+ISO週ファイル分割 | §03-4 |
教訓① — 表示が「それらしい」ことは何の保証でもない: #20(捨て量ゼロ)と #32(倍率設定ミス)は、どちらも表示が正常に見えていたケースです。 数値が妥当な範囲に収まっていても、ロジックが根本的に間違っていることがある。 横断的な整合チェック(技法8)だけがこれを検出できます。
教訓② — 学習は「壊す」方向にも効く: #14(低温での誤学習)、#19(平均による汚染)、#20(打ち切りバイアス)は、 いずれも学習機能そのものが誤りを固定化した例です。 学習を入れるときは、必ず学習してよい条件(ゲート)を同時に設計する必要があります。
教訓③ — 長期ログが唯一の検証手段だった: 上の 33 件のうち、リアルタイム画面を見ているだけで気づけたものは数件です。 大半は数週間〜数か月のログを後から並べて初めて見えました。 仮想レジスタに学習値まで記録した(0xF020–F022)ことが、 改修を安全に進める基盤でした。ログ設計は、開発手法そのものです。
教訓④ — 定数には必ず根拠を残す: 37%・0.25・±10%・180秒・0.02C・14日・0.65・18%・1.1倍・0.5 ―― これらは全部「なぜその値か」を説明できます(§18)。 根拠のない定数は、後から誰も(自分でも)触れなくなります。
18 定数一覧と決定根拠
本システムに現れる全定数を、「なぜその値か」と一緒に並べます。 根拠のない定数はマジックナンバーであり、後から誰も触れなくなります。
18-1. 電池・SOC
| 定数 | 値 | 決定根拠 | 変更時の影響 |
|---|---|---|---|
| 直列数 | 16S | 設備構成(LFP 3.2V × 16 = 51.2V 系) | 全電圧しきい値が連動して変わる |
| 満充電電圧 Vfull | 3.55 V/cell → 56.8 V | LFP の推奨充電上限。3.65V まで上げられるが寿命が縮む | 較正の発生頻度と電池寿命 |
| 表示 0% 電圧 | 3.125 V/cell → 50.0 V | 過放電回避のマージン。物理 SOC 約10%に相当 | 使える容量と電池寿命のトレードオフ |
| 公称電圧 Vnom | 3.20 V/cell → 51.2 V | LFP の公称値。Ah ↔ Wh 換算に使用 | エネルギー換算全体のスケール |
| 設計容量 Qdesign | 20 kWh ≈ 390.6 Ah | 20000 / 51.2(§02-4) | SOH の基準値 |
| 尾電流 Itail | 0.02 C ≈ 7.8 A | C/50 は電池業界の慣行。残る未充電分が容量の1%未満に収まる水準。厳しくすると較正イベントが発生しなくなる | 較正の精度と発生頻度 |
| 静止電流 | 0.05 C ≈ 19.5 A | IR ドロップを 0.2V 以下に抑える水準(R=10mΩ 想定) | OCV 較正の精度 |
| 充電効率 ηchg | 0.99 | LFP のクーロン効率 99.5%+ に、自己放電・バランシング消費を上乗せした保守値 | SOC がわずかに保守側/楽観側へ |
| 満充電デバウンス | 180 秒 | 5秒周期に対し 36 サンプル連続。雲の切れ間(数十秒)を排除できる最小水準 | 誤較正の確率 |
| OCV 緩和待ち | 600 秒 | LFP の拡散緩和時定数(数分)の数倍。10分で緩和がほぼ完了 | OCV 較正の精度 |
| 平坦域(較正禁止) | 3.15 – 3.35 V/cell | この帯で dV/dSOC が最小(16Sで 0.04 V/%)。電圧法の誤差が積算誤差を上回る領域 | SOC のばたつき |
| Δt 上限 | 30 秒 | 公称5秒の6倍。Modbus リトライ・一時的な CPU 負荷を許容し、スリープは弾く | 欠測時の SOC 飛び |
| 安全圏 SOC | 15 % | 表示 0%(物理 10%)より手前で警告を出すための余裕 | 使用可能時間の表示 |
18-2. 容量学習
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| 最小 ΔSOC | 37 % | アンカー誤差 ±1.5%(合成 2.1%)から、1回の推定誤差を 6% 以内にする下限:2.1/0.06 ≈ 35% に余裕を加算 | §06-2 |
| EMA 係数 α | 0.25 | 時定数 3.5イベント ≒ 2–3週間。推定ノイズ(1イベント)より遅く、劣化(年)より速い。ノイズは 1/2.6 に圧縮 | §06-3 |
| レート制限 | ±10 % | 1回の更新で動ける幅を α×10% = 2.5% に固定。異常値の被害を限定 | §06-5 |
| 温度ゲート | 10 – 40 ℃ | LFP の利用可能容量が定格付近を保つ範囲。0℃では 80% 程度に落ちる | §06-6 |
| 積算の穴 | < 60 秒 | アンカー区間に通信断が入ると ΔAh が過小になる。Δt 上限(30秒)の2倍を許容 | §06-6 |
| 絶対範囲 | 設計の 50 – 110 % | 物理的にありえない容量を弾く最終防衛線 | §06-6 |
18-3. 発電・予測・学習
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| MJ→Wh 換算 cMJ | 277.8 | 106/3600 = 277.777…(SI 単位から一意) | §02-3 |
| 発電係数の目安 | kW × 0.75 | IEC 61724 の PR(0.72–0.80)の中央。温度・汚れ・配線・変換・ミスマッチ・入射角の損失の積 | §08-1 |
| ポテンシャル係数の目安 | kW × 0.80 | 瞬時のポテンシャルは日積算より損失が少ない(温度が上がりきる前の時間帯を含む)ため、やや高めに設定 | §09-2 |
| 発電学習の最低実績 | 3 日 | 中央値が意味を持つ最小サンプル数。n=3 で破綻点 33% を確保。「正確」ではなく「目安値より良い」が切替基準 | §08-3 |
| ポテンシャル係数の最低点数 | 12 点 | 非打ち切りサンプルは朝夕・曇天に偏る。晴れ間のある日が数日あれば充足する水準 | §09-2 |
| 満充電しきい(予測用) | SOC ≥ 98 % | 実機が絞りを始める SOC。100% にすると絞り開始直後のサンプルを拾えない | §09-2 |
| 弱日射の除外 | < 80 W/m² | 比 P/G の分母が小さいと分散が発散。日の出後 30–60 分に相当し、入射角の影響も大きい | §09-2 |
| 負荷プロファイル窓長 | 14 日 | 7の倍数(曜日効果)+ SE=0.33σ + 季節遅れ約1週間、の3条件の交点 | §10-2 |
| 夜明け SOC の下限 | 10 % | 負の SOC という非物理的な値を防ぐ。実運用では商用切替か消費抑制が働く水準 | §09-6 |
| 学習値キャッシュ | 900 秒 | 学習値は数日スケールでしか動かない。15分ごとの再計算で十分かつ CPU 負荷を抑制 | — |
18-4. 提案・検知
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| 家電の採用閾値 | 0.5(半分以上) | 1.0 では提案がほぼ出ない(予測誤差のぶん常に不足判定)。0 では損をする提案が出る。残り半分は昼のうちに再充電される見込みがある | §11-4 |
| 単体制約 | 1.1 × Ppeak | ピーク余剰は予測値であり RMSE ≈ ±10%。その 1σ 相当を許容幅に。見逃しの損失 > わずかな超過の損失、という非対称性を反映 | §11-4 |
| 発電性能低下 | 比 < 0.65 | 好天・非満充電時の比の分布(平均1.0、σ≈0.10)に対する 3.5σ。誤警報率 ≈0.02%。かつ1系統脱落(比0.5)は確実に検出 | §13-2 |
| 収支異常 | |残差率| > 18 % | 定格変換損失 5–7%、軽負荷時 10–15% を超える水準。これ以上は変換効率では説明できない | §12-2 |
| SOC 信頼度「低」 | 未較正 > 72 時間 | バイアス 0.5A なら 72時間で約 9% の誤差蓄積(§03-3)。実用上の許容 ±3% を明確に超える | §05-7 |
| エネルギー保存周期 | 30 秒 | 異常終了時の損失が最大 25Wh(発電3kW時)=日次 20kWh の 0.1% | §07-2 |
| 生ログ保持 | 約 14 日 | 5秒 × 全レジスタで 1日 17,280行。SOC 積算の再検証に必要な期間を確保しつつ肥大を抑制 | §03-4 |
設備を変更したときに再設定が必要な定数: 直列数・満充電電圧・設計容量・PV_W_SCALE・Pmax・インバーター定格・電気単価。 これらはこの設備に固有の値であり、学習では決まりません(原則②の適用範囲外)。 残りの定数は設備が変わっても概ねそのまま使えます。
19 正しさの検証手順
計算が正しいことは、どうやって確かめるのか。137回の改修で確立した検証手順を、 誰でも再現できる形で記します。
19-1. 次元解析 ― 最初の防波堤
すべての式について、左辺と右辺の次元が一致することを確認する。 例)発電量[Wh] = 日射量[MJ/m²] × 277.8[Wh·m²/(MJ·m²)] × k[–] ✓ 例)SOC[%] = 100 × Ah / Ah ✓ 例)ポテンシャル[W] = k_p[m²] × G[W/m²] ✓ 次元が合わない式は、値がそれらしく見えても必ずどこかが間違っている。
19-2. 保存則による突合(技法8)
| 検算 | 成立すべき関係 | 許容範囲 | 破れたときの示唆 |
|---|---|---|---|
| 瞬時のエネルギー保存 | Pin − Pout = Ploss ≥ 0 | 残差率 5–15 % | 倍率設定・相の取りこぼし |
| 日次のエネルギー保存 | Epv+Egrid+Edis = Eload+Echg+Eloss | 同上 | 積算のどこかで取りこぼし |
| KPI の相補性 | roff + rgrid = 100 | 誤差ゼロ(恒等式) | 集計順序の誤り(比率の平均) |
| 電荷の往復 | 満充電→満充電で ΔSOC = 0 | ±3 % | Qeff の学習値が実態と乖離 |
| 夜間の発電 | 日没後の Epv 増分 = 0 | < 50 Wh/夜 | PV センサーのオフセット |
19-3. 学習値の妥当性チェック
| 学習値 | 期待される範囲 | 範囲外なら疑うこと |
|---|---|---|
| 発電係数 k | 設備容量kW × 0.60 – 0.85 | 0.60 未満 → 影・汚れ・故障/0.85 超 → PV_W_SCALE か定格の設定ミス |
| ポテンシャル係数 kp | 設備容量kW × 0.65 – 0.90 | 同上。k より一貫して低いなら、打ち切り除外が効いていない |
| 実効容量 Qeff | 設計の 80 – 105 % | 80% 未満 → 実劣化か誤学習(温度ゲート・ΔSOC ゲートを確認) |
| 負荷プロファイル | 深夜 < 昼 < 夕方のパターン | フラットなら平均で計算している/時刻がずれているならタイムゾーン設定 |
| SOH トレンド | 年 −2 〜 −3 % | 急降下 → 誤学習の可能性が高い(実劣化がこの速さで進むことは稀) |
19-4. 実測との突合(最終確認)
- 満充電較正が入った時刻を記録(SOC = 100% が確定した点)
- そこから意図的に大きく放電し、次の満充電まで運転する
- その区間で流れた電荷 ΔAh をログから積算
- Q = ΔAh / (ΔSOC/100) を手計算し、システムの Qeff と比較
- 差が 10% 以内なら健全。超えるならゲート条件・電流スケールを確認
- 晴天日の午前中、満充電到達前の時刻で P_obs / G を数点手計算
- それらの中央値がシステムの kp と一致するか確認
- 満充電到達後、大きな家電を1つ入れる(例:エコキュート 1.5kW)
- PV 出力が家電のぶんだけ増えれば、その時刻に確かに絞られていた証拠
- 増えた量が予測捨て量と整合するか確認
手順②の 4 行目が決定的です。「捨てている」という主張は反実仮想であり、 通常は直接検証できません。しかし負荷を追加したときに PV 出力が実際に増えるなら、 その差分は「出せたのに出していなかった電力」そのものです。 能動的な摂動を加えて反実仮想を実測に変える――これが唯一の直接検証法です。
19-5. 回帰テスト ― 137回の改修を安全に進めた方法
方法:保存した1分平均ログ(samples_1m)を入力として、 改修前後のロジックを同じデータで再実行し、出力(SOC・捨て量・予測)を比較します。
なぜこれが可能か:本システムの計算は決定論的だからです。 乱数も外部状態も使わないため、同じ入力からは必ず同じ出力が出ます。 ログさえあれば、任意の過去の日を何度でも再現できます。
検証すべき代表日:晴天日(捨てが出る)/曇天日(学習ゲートが働かない)/ 通信断のあった日(Δt ゲート)/満充電に達しなかった日(較正なし)/ 冬の低温日(温度ゲート)。これらを「回帰テストのデータセット」として固定し、 改修のたびに全部を通します。
効果:「新しい失敗モードを直したら、昔直した失敗モードが復活した」という 最も消耗するパターンを防げます。2年・137回の改修を進められた実務上の基盤がこれでした。
20 マルチデバイス配信 ― 独自URL発行によるどこでもモニタリング
計算がどれだけ正確でも、見たいときに見られなければ運用は変わりません。 本システムは HTML 単体で完結する構成を選び、独自URLを発行することで PC・スマートフォン・タブレットのどこからでも同じ解析結果を参照できます。
20-1. HTML 形式を選んだ理由
| 選択肢 | 利点 | この用途での問題 | 採否 |
|---|---|---|---|
| ネイティブアプリ (iOS/Android) | 動作が軽い・通知が強い | OS ごとに開発が必要。ストア審査。ロジック変更のたびに配布し直し(137回の改修とは相性が最悪) | 不採用 |
| デスクトップ専用GUI | 実機との接続が素直 | その PC の前でしか見られない。外出先で残量が分からない | 不採用 |
| HTML + URL 発行 | 全デバイス共通。更新が即時反映。インストール不要 | ネットワーク到達性の確保が必要 | 採用 |
見落とされがちな点:ロジックを頻繁に改修する開発では、 配信形式が開発速度を直接決めます。ネイティブアプリなら、 137回の改修は137回のビルド・配布・更新待ちを意味します。
HTML の決定的な利点:本体側のファイルを差し替えれば、 次にユーザーがページを開いた瞬間に新ロジックが動きます。 改修のサイクルタイムが「分」単位になる。これが2年で137回という 改修回数を可能にした実務上の条件でした。
副次的な利点:本書のような技術文書も同じ HTML で書けるため、 ロジックとドキュメントを同じ形式で並べられます。式の変更とその説明の更新が乖離しません。
20-2. 配信の構成
① 実機
インバーター
Modbus RTU / data.db3
→ ② 本体 PC
Python が 5秒ごとに収集
SQLite へ記録・重い計算
→ ③ 内蔵HTTPサーバ
ローカルで HTML/JSON を配信
URL を発行
→ ④ 各デバイス
PC・スマホ・タブレットの
ブラウザで同一URLを開く
計算は本体 PC で1回だけ行われ、結果を各デバイスが参照します。 端末側で再計算しないため、どの画面を見ても数値が一致します。 端末ごとに計算する構成だと、丸め・タイミング・キャッシュの差で値がずれ、 「スマホとPCで残量が違う」という信頼を損なう事態が起きます。
20-3. 実機のスマートフォン表示
同じ URL をスマートフォンで開いたときの表示です。PC 版とまったく同じ計算結果を、 縦画面に合わせて並べ替えています。
スマートフォン表示(同一URL)

並べ替えの原則は「外出先で最初に知りたい順」です。 オフグリッド率 → オフグリッド資産(累計で買わずに済んだ額)→ バッテリー残量(67%)→ 瞬時電力の各カード → エネルギーフロー → 余剰活用アドバイス、の順。 PC 版(前掲)では横に並ぶ情報を、重要度の降順に縦へ積み直しています。
値は PC 版と完全に一致します(消費 236W・バッテリー −434W・ロス 198W・SOC 67%)。 §20-2 のとおり計算は本体 PC で1回だけ行い、端末は描画のみを担当しているためです。 端末側で再計算する構成にすると、丸めやタイミングの差で「スマホと PC で残量が違う」という 信頼を損なう事態が起きます。
20-4. 設計上の要件
| 要件 | 理由 | 実装方針 |
|---|---|---|
| 単一の真実源 (Single Source of Truth) | 端末ごとに計算すると値がずれ、信頼が崩れる | 積算・学習は本体側で一元化。端末は描画のみ |
| レスポンシブ | スマホの縦画面とPCの横画面では、読める情報量が違う | 画面幅でレイアウトを切替。重要度の高いカードを上に |
| 低帯域で動く | 外出先のモバイル回線を想定 | 必要な集計値だけを JSON で送る(生ログは送らない) |
| オフライン耐性 | 接続が切れても直前の値は見たい | 直近値をブラウザ側に保持し、鮮度(何分前の値か)を明示 |
| URL の限定公開 | 自宅の電力消費パターンは生活パターンそのもの | 推測困難なパスを発行し、URL を知る人だけがアクセスできる形にする |
プライバシー上の注意:電力消費の時系列は在宅・不在・起床・就寝の時刻を高い精度で露出します。 URL を外部から到達可能にする場合は、推測困難なパスに加えて、 アクセス制限(認証・IP 制限・VPN 経由など)の併用を強く推奨します。 利便性のために公開範囲を広げる判断は、この性質を理解したうえで行う必要があります。
最も使うのはスマートフォン:外出先で「今日は満充電になったか」「捨てていないか」を 確認し、帰宅前に家電のタイマーを決める、という使い方が定着しました。 PC の前でしか見られない構成だったら、この使い方は生まれていません。
タブレットは据置きダッシュボードとして:常時表示しておくと、 家族が「今は電気が余っている/足りない」を意識するようになります。 可視化が行動を変えるという §11-5 の知見は、この据置き表示で最も強く現れました。
設計判断の答え合わせ:「計算は1か所、表示は多数」という構成にしたことで、 137回の改修すべてが全デバイスに同時に反映されました。 端末ごとにロジックを持っていたら、バージョン差による数値の食い違いの調査に 改修と同じだけの時間を取られていたはずです。
付録A 実装ソフトウェアの仕様 ― この式は、どこで動いているのか
本書の数式は紙の上の話ではありません。Windows のデスクトップアプリとして実装され、 この設備で実際に動いています。ここでは、そのソフトウェアの仕様と設計判断を開示します。 本文の各節が、実装のどこに対応するかも併記します。
これは開発途中のテスト版です。特定の設備・特定の機種・特定の気候に 合わせて作っているため、ご縁のある方にのみお渡ししています。一般配布はしておらず、 このページからのダウンロード提供もありません。掲載するのは仕様と設計判断だけです。
なぜ仕様を出すのか:本書は「なぜその式なのか」を書いた文書です。 実装の制約を伏せたままでは、定数の根拠が宙に浮きます。 動いているものの形を示さないと、根拠の説明が完結しないと判断しました。
A-1. 全体の構成
| 層 | 採用したもの | 選んだ理由 |
|---|---|---|
| 実機との通信 | USB シリアル(CH340 / CH341)+ Modbus RTU | メーカー製ツールを介さず直接読む。間に別アプリを挟むと、そのアプリの停止がそのまま欠測になる |
| 本体 | Python 3.12 / 単一実行ファイル化 | シリアル・SQLite・HTTP・外部プロセス管理を1言語で完結させる |
| 画面 | 単一の HTML ファイル(約 290KB)/ Edge WebView2 で描画 | 計算も表示も1ファイル。差し替えれば次に開いた瞬間に新ロジックになる(→ §20) |
| 記録 | SQLite(ISO 週ごとにファイル分割) | 1ファイルが肥大化しない。週単位でバックアップ・受け渡しができる |
| 外部公開 | 一時 URL の発行(読み取り専用) | 固定 IP もルーター設定も要らない。読み取り以外は外へ出さない(→ A-6) |
| 気象 | Open-Meteo(予報・日射量) | APIキー不要。日射量が取れるので発電予測(→ §08)に直接使える |
| 配布形態 | ユーザー単位インストーラ(管理者権限なし) | 現場の PC に管理者権限がないことが多い |
実装スタック。「計算は1か所、表示は多数」という §20 の方針が、そのまま構成に出ています。
図A-1 ― 実装の構成。読み取りと計算を同じプロセスに置いたのが要点です。 別プロセスに分けると COM ポートを二重に開くことになり、片方が必ず失敗します。
A-2. 実機との通信 ― Modbus RTU
通信条件は 9600bps / 8bit / パリティ無 / ストップ1。読み取りは ファンクション 0x03(保持レジスタ)と 0x04(入力レジスタ)、およびスレーブアドレスを 起動時に自動判定します。機体によって割り当てが違い、固定値では現場ごとに繋がらないためです。
| アドレス | 内容 | 倍率 | 符号 | 本書での使い道 |
|---|---|---|---|---|
| 0x0100 | バッテリー残量(実機 SOC) | 1 | ― | 自前の積算 SOC と並走記録(§05-8) |
| 0x0101 / 0x0102 | バッテリー電圧 / 電流 | 0.1 | 電流のみ有 | クーロン積算の入力(§05-1)・内部抵抗補正 |
| 0x0107〜0x0109 | 太陽光 電圧 / 電流 / 電力 | 0.1 / 0.1 / 1 | ― | 発電予測の学習(§08)・カーテイル判定(§09) |
| 0x0213〜0x0215 | 商用 電圧 / 電流 / 周波数 | 0.1 / 0.1 / 0.01 | ― | オフグリッド率・買電量の KPI(§12) |
| 0x021B | 負荷 有効電力 | 1 | ― | 負荷プロファイル学習(§10) |
| 0x0220 | 本体温度(DC側) | 0.1 | 有 | 容量学習の温度ゲート(§06-6) |
| 0x022A〜0x0233 | 商用 B/C相・負荷 B/C相 | 0.1 / 1 | ― | 分相機で片相だけ読むと実際より小さく出るため合算 |
主要レジスタと、本書のどの節で使うか。倍率は機器付属の定義ファイルの値に合わせています。
問題:連続読み出しは 1 回で済ませたほうが速い。ところが 機体によっては、長いブロックや未対応レジスタを含む読み出しを丸ごと拒否します。 1 ブロックにまとめていると、1 つの非対応レジスタで全項目が欠測になります。
解:(0x0100,3) (0x0107,3) (0x0213,14) (0x022A,16) の 4 つに割りました。 分相非対応の機体では 4 番目だけが失敗し、A相のみで動作を続けます。 被害を局所化する、という一点だけのための分割です。
本書との関係:この「一部だけ欠ける」欠測を積算に混ぜないためにあるのが、 §03-2 の Δt ゲートです。実装側の上限は 30 秒。 これを超える間隔があったら、その区間は積算しません。
A-3. 記録の設計
| 項目 | 値 | 理由 |
|---|---|---|
| 記録間隔 | 30 秒 | 当初は 5 秒。積算に必要な精度は保ったまま、ファイル量を現実的にした |
| 間引き | しない | 古いデータを1分平均へ潰すと、あとから細かい粒度で振り返れなくなる。異常検知(§13)は残差を見るので、潰した平均では効かない |
| 保持期間 | 無期限 | 30秒 × 約30列で、1年あたり概ね数十MB。SQLite なら数年分でも実用上の問題はない |
| ファイル分割 | ISO 週ごと | 1ファイルが肥大化しない。週単位で切り出して渡せる |
| 日次集計 | 別ファイルに保存 | 生ログとは寿命が違う。日報・月報・不具合記録はこちらに残す |
| 書き出し | Markdown(期間指定 / 全期間一括) | 解析にも報告にもそのまま使える形にした |
ログ設計。「間引かない」という判断が、本書の検証(§19)を可能にしています。 平均に潰したデータからは、137回の改修のうち多くが再現できません。
A-4. SOC まわりの実装定数
§18 の定数一覧は、実装では 1 か所の設定ブロックにまとまっています。 48V・16直列の設備での実際の値は次のとおりです。
| 定数 | 値 | 意味と、その値である理由 | 本書 |
|---|---|---|---|
| 満充電しきい値 | 3.55 V/セル (16S: 56.8 V) | 実測のフロート電圧。ここに到達し、かつ尾電流 0.02C 以下が 180 秒連続して初めて 100% 較正 | §05-4 |
| 表示 0% | 3.125 V/セル (16S: 50.0 V) | 実測の完全放電は 44.6V だが、そこまで使うと寿命を大きく削る。ここでの残量は「物理的な残量」ではなく「安全に使える残量」 | §05-5 |
| 充電効率 | 0.99 | LFP の値。よく見る 0.95 は鉛蓄電池の数字で、そのまま使うと積算が系統的にずれる | §02-2 |
| 内部抵抗 | 0.3 mΩ/セル (パック約 4.8 mΩ) | 負荷時の電圧降下を差し引いて静止 OCV を求める。多少ずれても、下の電流ゲートが守る | §05-3 |
| Δt 上限 | 30 秒 | これを超える間隔は積算しない。通信断・アプリ停止の穴を埋めない | §03-2 |
| 較正の電流ゲート | 0.005C(約 2 A) | 実質ゼロ電流でのみ較正を許す。この値の設定ミスが A-5 の事故 | §05-4 |
| 静止判定の時間 | 3600 秒 | LFP の開放電圧が整定するには 1〜4 時間かかる | §05-3 |
| 平坦域(較正禁止帯) | 3.15 〜 3.45 V/セル | この帯では電圧が残量を語らない。境界の引き方そのものが難しい(A-5) | §05-2 |
| 容量学習の最小 ΔSOC | 37 % | これ以上 SOC が動いたアンカー間でしか学習しない | §06-2 |
| 学習の温度範囲 | 10 〜 40 ℃ | 範囲外では容量が温度で変わるため学習しない | §06-6 |
| なじませ係数 / 変化率上限 | 0.25 / ±10 % | 1 回の学習で容量を大きく動かさない。誤学習の固定化を防ぐ | §06-3・§06-5 |
実装されている定数。本書の §18 は、この表の「なぜ」を書き下したものです。
A-5. 実際に起きた誤較正と、その修正
§17 で扱った失敗モードのうち、最も新しい 1 件を実例として置きます。 2026-08-03 15:20、残量表示が 38.6% から 89% へ飛びました。
図A-2 ― 2026-08-03 の誤較正。「残量は低いのに端子電圧は高い」という、 深放電から回復する日にしか現れない条件でした。通常運転では セル 3.35V 到達時に積算値も 90% 付近まで上がっているため、両者が一致して発火しません。
| 定数 | 変更前 | 変更後 | なぜ間違っていたか |
|---|---|---|---|
| 平坦域の上限 | 3.35 V | 3.45 V | OCV 表自身が 3.35→90% / 3.40→99%。3.35〜3.40V は 50mV で 9% しか動かない(5.6mV/1%)。禁止帯としていた 3.13〜3.20V(7.0mV/1%)より鈍い。つまり境界が「まだ平坦な場所」に引かれており、解禁された直後が最も危険だった |
| 静止とみなす電流 | 0.05C(19.5 A) | 0.005C(約 2 A) | 11.6A で充電している最中を「静止」と誤認していた。大電流充電の直後は表面電荷で端子電圧が持ち上がり、内部抵抗補正だけでは追いつかない |
| 静止の継続時間 | 600 秒 | 3600 秒 | LFP の開放電圧が整定するには 1〜4 時間必要。充電が立ち上がっていく最中に「静止が続いた」と判定されていた |
修正した 3 定数。積算の式(Ah 積分・容量学習・満充電アンカー・空アンカー)には一切手を入れていません。
式より、ゲートのほうが壊れやすい:本書で扱う数式のうち、 2 年間で書き換えたものはごく僅かです。改修の大半は「その式をいつ適用してよいか」の条件でした。 §15 の 8 技法が、式そのものではなくゲートと時定数の話に 集中しているのはこのためです。
正のフィードバックの怖さ:誤較正は表示が飛ぶだけでは終わりません。 ずれた SOC は次に容量学習(§06)を汚染し、 誤った容量がさらに SOC をずらします。だから容量学習は「較正済みの 2 点間」でしか行いません。
検証の限界も正直に書きます:この修正は、当日のログを使って 「変更後の定数なら較正禁止と判定されること」を再計算で確認しています。 一方で実機での起動テストは行っていません。稼働中の監視とシリアルポートが競合し、 ライブ監視そのものを止めてしまうためです。修正後、上側で頼れる較正点は満充電アンカーだけになるので、 一度満充電まで通して較正を入れ直す運用が要ります。
A-6. 外から見るための設計
§20 の「独自URL発行」の実装です。設計の芯は 1 つだけで、 外へ出すのは読み取りだけということを、禁止リストではなく許可リストで担保しています。 設定変更・接続操作・機器への書き込みは、許可リストに載っていないので外からは届きません。 発行した URL は、渡した相手ごとに個別に無効化できます。
禁止リストは、機能を足すたびに漏れます。 新しい操作を1つ実装したとき、それを禁止リストに書き足し忘れれば、その瞬間から外へ露出します。 書き忘れが「露出」に倒れる設計は、いつか必ず事故ります。
許可リストなら、書き忘れは「使えない」に倒れます。 不便ではありますが、安全側です。§15-2 の 「非対称な設計 ― 安全側に倒す方向」と同じ考え方を、通信の外面にも適用しています。
具体的な公開経路・認証の作りは、ここには書きません。 仕組みを説明する利益より、稼働中の設備の攻撃面を描いてしまう不利益のほうが大きいと判断しました。
A-7. 画面の構成
| 画面 | 置いてあるもの |
|---|---|
| ダッシュボード | オフグリッド率/オフグリッド資産/バッテリーモニター/太陽光・消費・バッテリー電力・商用・本体温度の KPI。エネルギーフロー図(粒子の向き=流れる方向、速さ=電力の大きさ)。SOC カード(積算値と実機値の並走・信頼度・実効容量)。天気と発電予測。余剰電力の活用アドバイス |
| ログ | 30 秒粒度の記録、日次集計、不具合・点検・作業・メモの記録、日報および期間・全期間の Markdown 出力 |
| 電力グラフ | 30分〜1年の期間切替。電力/直流電圧・電流/交流電圧・電流/日射量(発電量と見比べる)/気温・雲量・湿度/負荷と商用 |
| メール通知 | 条件を満たしたときの転送、日報・週報・月報、商用料金の上限超過、翌日の発電予測が下限未満。同一条件の再送間隔を持つ |
| インバーター設定 | 機器内部のパラメーターを読み取り専用で一覧(出力優先モード・充電モード・電池タイプ・各電圧しきい値・充電電流など) |
5 画面。§11 の余剰活用アナウンス、§13 の異常検知は、 それぞれダッシュボードとメール通知として出口を持っています。計算しただけでは運用は変わりません。
技術的には書き込めます。設定は保持レジスタなので、 Modbus で書き込む実装自体は難しくありません。それでも読み取り専用に留めています。
理由:機器付属の定義ファイルには 最小値・最大値・初期値が入っていません。 つまり書き込もうとしている値が妥当かどうかを、こちらで検証できない。 誤った設定はインバーターや電池を壊しえます。検証できない書き込みはしない、という判断です。
代わりに:しきい値の決め方そのものは LFP 電圧パラメーターの関係に、 実機への入力はパラメーター管理アシストツールに 分けてあります。人が確認してから入れる、という順序を崩さないためです。
A-8. 開発の経緯と、現時点の制限
2026 年 7 月末から 8 月にかけて、24V 系(3kW)と 48V 系(10kW・分相)の 2 系列を並行して 作っています。版は 10 日ほどで 1.0.0 から 7 系列まで進みました。 本書でいう「137回の改修」は、こういう粒度の積み重ねです。
| 制限 | 現状 |
|---|---|
| 配布 | していません。この設備に合わせた開発途中のツールです。ダウンロード提供もありません |
| 対象機種 | 固定。負荷率・蓄電量目安の基準値を機種ごとに持つため、選択式にしていません |
| 設定の書き込み | 非対応(意図的。上の理由) |
| 同時接続 | COM ポートは 1 つのアプリしか開けません。メーカー製ツールと同時には使えません |
| 実機テスト | 最新の修正は再計算による検証のみ。稼働中の監視を止められないため、実機起動テストは未実施 |
| 較正の前提 | 上側の較正は満充電アンカーに依存します。曇天が続いて満充電に届かない期間は、残量表示の信頼度が落ちます(→ §05-7 の信頼度表示) |
正直に書いておく制限。できることより、できないことのほうが運用では効きます。
21 全数式早見表
本書に登場した全数式を、番号・意図・参照先とともに1か所にまとめます。 実装を読むとき、この表から該当節へ戻れるようにしてあります。
基礎・単位
(2.1) q(t) = q(t₀) + ∫I dτ 電荷保存。SOC を Ah で数える根拠 (2.2) V_bat = OCV(SOC) + I·R_int 端子電圧モデル。Wh 積算が壊れる理由 (2.3) P_pv+|P_grid|+P_dis = P_load+P_chg+P_loss エネルギー保存。ノード方程式 c_MJ = 10⁶/3600 = 277.78 Wh/MJ 単位換算(SIから一意) Q_design = E_batt/V_nom = 20000/51.2 = 390.6 Ah
離散化・誤差
(3.1) Δq_k = I_k·Δt_k/3600 if 0 < Δt_k ≤ 30s, else 0 Δt ゲート バイアス誤差: δSOC = 100·b·T/(3600·Q) 時間 T に比例して発散 ランダム誤差: δSOC = 100·σ·√(Δt·T)/(3600·Q) √T でしか増えない → バイアスが支配的 ⇒ 定期的な較正が必須
リアルタイム電力
P_pv = P_pv1 + P_pv2 (非対応機は P_pv1 × PV_W_SCALE) P_bat = V_bat × I × BATT_SIGN (充電 +, 放電 −) (4.1) P_loss = P_in − P_out, η_conv = P_out/P_in × 100
SOC
(5.1) SOC(t) = SOC(t₀) + (100/Q_eff)·∫η(I)·I dτ クーロン積算 (5.2) δSOC = δV / S_V, S_V = dV/dSOC 電圧法の誤差伝播 S_V(平坦域)=0.040 V/%, S_V(端部)=0.48 V/% 12倍の感度差 (5.3) OCV ≈ V_bat − I·R_int (|I| ≤ 0.05C が 600s) 静止 OCV (5.4) (V ≥ 56.8) ∧ (0 < I ≤ 0.02C) が 180s 連続 ⟹ SOC ← 100 (5.5) SOC_disp = 100·clamp((SOC_phys − SOC_floor)/(100 − SOC_floor), 0, 1) 使用可能時間 = (SOC_phys − 15)/100 · Q_eff · V_nom / P_dis
実効容量(SOH)
(6.1) Q_meas = ΔAh / (ΔSOC/100) アンカー間でのみ (6.2) (δQ/Q)² = (δAh/ΔAh)² + (δSOC/ΔSOC)² → ΔSOC ≥ 37% の根拠 (6.3) Q ← Q + α·w·(clamp(Q_meas, ±10%) − Q), α=0.25, w=min(1,ΔSOC/100) 時定数 N_τ = −1/ln(1−α) = 3.48 回, ノイズ圧縮 √(α/(2−α)) = 0.378 (6.4) SOH = Q_eff / Q_design × 100
エネルギー積算
(7.1) E_x += max(0, P_x)·Δt/3600 x ∈ {pv, grid, load, chg, dis, loss}
発電予測
(8.1) E_pv = H · c_MJ · k 日射量 → 発電量 k = (P_rated[kW]) × PR, PR = Π(各損失) ≈ 0.72–0.80 (8.2) k̂ = med{ E_i / (H_i·c_MJ) }, n ≥ 3 中央値(破綻点 50%) n < 3 のとき k = P_rated[kW] × 0.75
カーテイルメント(打ち切り問題)
(9.1) P_i = min(P*_i, P_lim(SOC_i)), P*_i = k_p·G_i + ε_i 観測は右側打ち切り (9.2) k̂_p = med{ P_i/G_i : SOC_i < 98 ∧ G_i ≥ 80 }, |U| ≥ 12 (9.3) P*_h = min(k̂_p·G_h, P_max) 飽和(クリップ) (9.4) W_meas = Σ_{i∈C} max(0, min(k̂_p·G_i, P_max) − P_i)·Δt_i C = { SOC_i ≥ 98% OR V_bat,i ≥ V_float } 冗長判定(OR)
1日シミュレーション
(9.5) S_h = P*_h − L̂_h 余剰 (9.6) C_h = min( max(0,S_h), (E_cap − B_{h−1})/Δh, P_chg,max ) 充電(受入制約) (9.7) B_h = B_{h−1} + (C_h − D_h)·Δh, D_h = max(0, −S_h) 状態更新 (9.8) W_h = (max(0,S_h) − C_h)·Δh 捨て (9.9) h* = min{h : B_h ≥ 0.98·E_cap} h*_fine = h*−1 + (0.98·E_cap − B_{h*−1})/(C_{h*}·Δh) 時間内補間 (9.10) SOC_dawn = max(10, SOC_now − (100/E_cap)·Σ_{h∈N}(L̂_h − P*_h)·Δh) 感度: dh*/dSOC₀ = −E_cap/(100·S(h*)) SOC 10%誤差 → 約48分のずれ
負荷プロファイル
(10.1) L̂_h = med{ L_{d,h} : d ∈ 直近14日 }, h = 0..23 中央値の標準誤差 SE ≈ 1.253·σ/√n
余剰活用(最適化)
(11.1) E_sur = ΣW_h, P_peak = max{W_h/Δh}, P_avg = E_sur/(余剰時間幅) (11.2) max Σ x_i·E_i x_i ∈ {0,1} (11.3) s.t. Σ x_i·P_i ≤ min(P_peak, P_inv) 電力制約 Σ x_i·E_i ≤ E_sur エネルギー制約 P_i ≤ 1.1·P_peak 単体制約 解法: 定格の降順に貪欲。採用条件は 残余 R ≥ 0.5·E_i かつ 残余電力 Q ≥ P_i
KPI・検知
(12.1) r_off = (E_load − E_grid)/E_load × 100, r_grid = E_grid/E_load × 100 (12.2) r_self = (E_pv − W)/E_pv × 100 自家消費率(別の軸) (12.3) Cost = (E_grid/1000)·p (12.4) r_res = E_loss/E_in × 100 収支の閉じ残り(計測の検算) (13.1) 異常 ⟺ (r < θ_lo) ∧ Λ c_j 前提条件つき残差検定 (13.2) P_obs/min(k_p·G, P_max) < 0.65 ∧ (G ≥ G_min) ∧ (SOC < 98) |r_res| > 18 %
学習の収束
(14.1) σ²_total = σ²_param + σ²_input 学習で減る分 + 減らない分 (14.2) SE(med) ≈ 1.253·σ/√n √n 則 n=3 → 0.58, n=7 → 0.38, n=14 → 0.27, n=30 → 0.18(初日を1.00として) (15.1) τ_noise ≪ τ_filter ≪ τ_signal 時定数分離(全フィルタ設計の共通条件)
この早見表を読むときの視点:式そのものより、各式に付いている制約(ゲート・クランプ・条件)に 注目してください。素朴な式は数行で書けます。137回の改修が加えたのは、 ほぼすべて「いつその式を適用してよいか」の条件でした。 実運用に耐えるアルゴリズムとは、式と条件の組で構成されます。
オフグリット AI 研究所 / LVYUAN インバーター モニタリング
2年間の連続実測データと 137回の改修に基づく、計算ロジックの数式・定数・設計根拠の技術文書。
数値は実装(src/app.py / src/web/index.html)を反映します。設備構成の変更時はコード側の定数が優先されます。
電気・設計の順路 9 / 9
前へ:インバーター パラメーター管理アシストツール
あわせて読む
- オフグリッドシステムの電線(電気編)
電圧降下は推定誤差にそのまま乗る。ケーブル選定の実務。 - 専門経歴書
この計算ロジックを、どんな現場の人間が書いているか。
