ハイブリットインバーターモニターシステム SOCアルゴリズムと予測 

計算ロジック超詳細解説
オフグリット 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秒)
クーロン積算 + 端点較正 ロバスト統計(中央値) 打ち切りデータ補正 グレーボックス同定 残差ベース異常検知 時定数分離 マルチデバイス配信
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 がさらにずれる正のフィードバック
商用切替・発電機起動の判断手遅れになってから気づく/不要な買電が発生実損失
電池の保護(過放電回避)下限を割って使い、電池寿命そのものを削る資産の毀損
SOC は下流の全モジュールの入力です。ここが不正確だと、下流でどれだけ精緻な計算をしても意味がありません。
最も厄介だった構造 ― 自己増幅ループ

4行目に注目してください。SOC の誤差 → ΔSOC の誤差 → 実効容量の誤学習 → SOC の誤差拡大という 正のフィードバックが存在します。一度ずれ始めると、学習が誤差を固定化してしまう。

この構造を断ち切るために、容量学習は「較正済みの2点間」でしか行わない(§06-1)、 較正は情報量のある端部でしか行わない(§05-4)という2重のゲートを置いています。 ループを切る場所を数学的に特定したことが、SOC 精度が安定した転換点でした。

2年の運用で確認できたこと

初期版(電圧ベース推定):負荷の増減に合わせて表示 SOC が上下にばたつき、 重い負荷をかけた瞬間に十数%落ちる。日をまたぐと実態との乖離が読めない。

現行版(Ah 積算+端点較正+容量学習):満充電較正が入る日であれば、 誤差はその日のうちにリセットされ、蓄積しません(§03-3 の鋸歯構造)。 残量表示が運用判断に耐えるようになり、はじめて「余剰をどう使うか」という次の問題に進めました。

教訓:SOC は「表示項目のひとつ」ではなくシステムの基準座標です。 ここを固めない限り、予測も提案も砂上の楼閣になります。本書で §05・§06 に最も紙面を割いているのは、 2年の開発でそこが最大の投資対象だったことの反映です。

原則② パラメータは「この設備」から同定する

日射から発電への変換係数、負荷の時間帯パターン、電池の実効容量 ― これらはカタログ値では決まりません。屋根の方位・傾斜・周囲の影・パネルの汚れ具合・配線長・ その家の生活リズム・電池の劣化度合いが全部混ざった結果だからです。

同定の考え方 θ^= arg minθ i ρ(yi f(ui;θ)) θ = 学習パラメータ

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原則がロジック全体をどう貫くか
設計原則 → 具体ロジックへの展開 原則① 実測と推定を分離 誤差の性質が違う 原則② この設備から同定 カタログ値を使わない 原則③ 保守的更新 壊れる方向に動かさない 積算SOC を実機SOCと並走記録 端点でのみ較正・平坦域は禁止 信頼度(高/中/低)を必ず併記 発電係数 k を実績の中央値で学習 負荷プロファイルを14日で同定 実効容量を充放電から同定 全学習にゲート・レート制限・クランプ 結果として得られるもの ・SOC が「最後の較正以降」の誤差に閉じる ・予測が数日〜2週間でこの家に馴染む ・捨てているPVを具体的な家電提案に変換
読み方:左の原則が中央の具体ロジックを決め、右の性質が結果として出てきます。以降の章は中央の各項目を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·IW計算。充電 +(緑)/放電 −(青)
Pchg, Pdis充電・放電の大きさWmax(0, ±Pbat)
Ploss変換ロスW計算(入力−出力)
Ex各項の日次エネルギーWh電力の時間積分
Tdc本体DC温度実測 0x0220 ×0.1
電池状態
記号意味単位備考
SOCphys物理残量(電池としての充電率)%クーロン積算の出力
SOCdisp表示残量(安全に使える残量)%0% = 50.0V 相当
SOCfloor表示0%に対応する物理SOC%≈ 10%(設備により変動)
Qeff実効容量(学習値)AhSOC積算の分母
Qdesign設計容量Ah20kWh ÷ 51.2V ≈ 390.6Ah
Ecap電池のエネルギー容量WhQeff × 公称電圧
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²学習(非絞りサンプルの中央値)
cMJMJ/m² → Wh/m² 換算277.78定数(§02 で導出)
PmaxPV/PCS の出力上限W設備定格。クリップに使用
h時刻 h の予測負荷W学習(過去14日の時刻別中央値)
Wカーテイルメント量(捨てた発電)Wh計算(実測版・予測版の2系統)
PR性能比(Performance Ratio)系統全損失の積。k の物理的意味
時間・統計
記号意味単位備考
Δtサンプル間隔s公称5秒。実際は可変(→ §03)
Δh時間刻み(時間単位)hΔt/3600
αEMA(なじませ)係数0.25
n学習サンプル数日数・点数
σ標準偏差誤差解析に使用
δxx の不確かさ誤差伝播に使用
med中央値演算子平均ではなく中央値を使う(§08)
符号規約を1か所に固定する理由:電池電流の符号は、機種によって「充電が正」「放電が正」が分かれます。 レジスタ読み出し直後に BATT_SIGN1回だけ正規化し、以降のすべての式は 「充電 > 0」で書かれています。符号変換をロジックのあちこちに散らすと、 式を1つ足すたびに符号バグの可能性が増えるためです(→ §17 改良#14)。
02 土台となる保存則と単位換算

このシステムの計算は最終的に2つの保存則に還元されます。電荷保存エネルギー保存です。 どちらをどこで使うかの選択が、精度を大きく左右します。

2-1. 電荷保存 ― SOC が Ah で数えられる理由

電池に出入りする電荷 q は保存量です。端子で測った電流を時間で積めば、電池内部に蓄えられた電荷が分かります。

電荷の定義 q(t)= q(t0)+ t0t I(τ)dτ [Ah] = [A]·[h](2.1)
なぜ Wh(電力量)で数えてはいけないのか

電池の端子電圧は、内部抵抗による電圧降下を含んでいます。

端子電圧モデル Vbat= OCV(SOC)+ I·Rint 充電 I>0 で電圧上昇(2.2)

ここで Wh を積算するとどうなるかを展開してみます。

導出:Wh 積算に混入する誤差項
  1. 電力量の積算は ∫ V·I dt = ∫ (OCV + I·R)·I dt
  2. 展開すると ∫ OCV·I dt + ∫ I²·R dt
  3. 第1項が「本当に電池に出入りしたエネルギー」、第2項 ∫I²R dt は内部抵抗で熱になった分
  4. 第2項は電流の2乗に比例 → 重い負荷ほど急激に膨らむ
  5. 結果:同じ電荷量を出し入れしても、使い方(負荷の重さ)によって Wh 積算の結果が変わる
  6. 一方 ∫I dtR を含まない → 使い方に依存しない
なぜ Ah なのか

結論:SOC は「電池の中にどれだけ電荷が残っているか」であり、 熱として失われた分は残量ではありません。Ah で数えると内部抵抗の項が式から消えるため、 負荷の重さに依存しない残量が得られます。

具体的な差:内部抵抗 10mΩ、放電 100A のとき電圧降下は 1.0V。 51.2V に対して 約2% です。この2%を「消費した」と数えると、重負荷で使うほど残量が過小に、 軽負荷で使うほど過大に出ます。日をまたぐと数%〜10%オーダーのずれになります。

この式が無いと起きること

Wh 積算のまま運用すると、エアコンや IH を使った直後だけ残量がストンと落ち、切ると少し戻るという 挙動になります。ユーザーからは「バッテリーが壊れた」ように見えますが、実際は測り方の問題です。 これは初期版で実際に発生し、Ah 積算への変更で解消しました(→ §17 改良#1)。

2-2. エネルギー保存 ― 電力バランスとロス

一方、インバーターのノードではエネルギー保存が成り立ちます。入る電力の合計は、出る電力の合計と 変換損失の和に等しくなります。

ノード方程式 Ppv+ |Pgrid|+ Pdis 入力 = Pload+ Pchg 出力 + Ploss (2.3)

この式を Ploss について解いたものが「ロス」表示、出力/入力が「効率」表示です。

使い分けの原則

電池の中身を数えるときは電荷保存(Ah)、系統全体の辻褄を見るときはエネルギー保存(W・Wh)。 この使い分けが本システムの計算構造そのものです。混ぜると、どちらの保存則も成り立たない中途半端な値になります。

2-3. 単位換算 ― cMJ = 277.78 の導出

気象データの日射量は MJ/m²、発電は Wh。この換算定数はマジックナンバーではなく、SI単位から一意に決まります。

導出:1 MJ は何 Wh か
  1. 1 MJ = 106 J(定義)
  2. 1 W = 1 J/s(定義)→ 1 Wh = 1 J/s × 3600 s = 3600 J
  3. したがって 1 MJ = 10⁶ / 3600 Wh = 277.777… Wh
  4. 実装値 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 · ΔtO(Δt²)採用
台形則Δq = (Ik−1+Ik)/2 · ΔtO(Δt³)不採用
なぜ精度の低い矩形則を選ぶのか

理由1 — 誤差が支配的でない:Δt = 5秒に対して、家庭の負荷電流の変化はほとんどが 分〜時間スケール(エアコンのコンプレッサー、給湯)です。ナイキスト的に十分オーバーサンプリングされており、 離散化誤差より電流センサーのバイアス誤差のほうが2桁大きい(→ 3-3)。より高次の積分則を使っても、 支配的でない誤差を減らすだけです。

理由2 — 欠測に強い:台形則は前サンプルを必要とします。通信断で Ik−1 が 欠けた瞬間、台形則は使えません。矩形則は各サンプルが独立なので、欠測区間を単に飛ばすという 素直な処理ができます。実運用では欠測は必ず起きます。

理由3 — 保守側に倒れる:矩形則は「電流が次のサンプルまで一定だった」と仮定します。 充電中に電流が減っていく局面(CV充電の終盤)ではやや過大に見積もる方向ですが、 その局面は満充電較正(§05-4)で 100% に上書きされるため、誤差が持ち越されません。

3-2. Δt ゲート ― 欠測区間を積算しない
積算ゲート Δqk= { Ik·Δtk/3600 if 0<ΔtkΔtmax 0otherwise Δtmax = 30 s(3.1)
なぜ 30 秒で切るのか

上限がないとどうなるか: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. 誤差の分類 ― どちらを潰すべきか

電流測定の誤差を、バイアス(オフセット)とランダムノイズに分解し、積算後にどう育つかを比較します。

導出:積算誤差の成長則
  1. 測定電流を Î = I + b + ε と置く(b=固定バイアス[A]、ε=平均0・標準偏差σのノイズ)
  2. バイアス成分:時間 T 積算すると Δq_bias = b·T/3600 [Ah] → T に比例して増える
  3. ノイズ成分:独立な N = T/Δt 個の和なので分散が加算 → σ_q = σ·Δt·√N/3600 = σ·√(Δt·T)/3600√T でしか増えない
  4. SOC に換算:δSOC = 100·Δq/Q_eff
誤差源仮定値1時間後1日後1週間後
バイアス b = 0.5 A定格の0.1%程度0.13 %3.07 %21.5 %
ノイズ σ = 2 AΔt=5s0.02 %0.09 %0.25 %
Qeff = 390.6 Ah として計算。バイアスが圧倒的に支配的で、1週間放置すれば残量表示は無意味になります。
積算誤差の成長 ― 較正が無ければ発散、あれば鋸歯状に有界 縦軸:積算SOCの誤差(%) / 横軸:経過時間(日) 0510 1520 012 345 67 経過日数(日) 実用上の許容誤差 ±3% 較正なし(バイアス0.5A) 7日で 21.5% ― 表示として破綻 較正あり(満充電で毎日リセット) 誤差は「最後の較正以降」に閉じる ▲ = 較正イベント(満充電到達)
この図が §05 の存在理由です。赤=較正しない場合の誤差は時間に比例して伸び、1週間で 21.5%(表示として無意味)。 緑=1日1回の満充電較正があれば、誤差は毎回ゼロに戻され常に許容帯の中に留まります。 重要なのは誤差が「起動からの累積」ではなく「最後の較正以降」に閉じ込められる点です。
この誤差解析が設計に与えた答え

問い:電流センサーをより高精度なものに替えれば SOC は正確になるか?

答え:ならない。バイアス誤差はどれだけ高精度なセンサーでもゼロにはできず、 時間に比例して育つ以上、いつか必ず許容範囲を超えます。必要なのは定期的なリセット機構であり、 それが較正アンカー(§05-4)です。「精度を上げる」ではなく「誤差の蓄積を断ち切る」という発想の転換が、 産業用BMS(TI Impedance Track™ など)と共通する設計です。

3-4. ログの粒度設計
テーブル粒度保持設計意図
samples5 秒約14日SOC積算・過渡現象の解析に必要な生の分解能。ただし1日 17,280行 × 全レジスタで肥大するため短期保持。
samples_1m1 分平均長期(週ファイル)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 非対応機を「×2」で近似する意図と限界

なぜ必要か:一部の機体は PV2 のレジスタ 0x010F–0111 を返しません。 しかし物理的には2系統のストリングが接続されており、実際の発電は PV1 の約2倍です。 ここを補正しないと、発電量が常に半分に見え、係数学習も自給率もすべて狂います。

なぜ「×2」で足りるのか:同一容量・同一方位のストリングを2系統に分けた構成であれば、 両者の出力はほぼ等しくなります。誤差は主に、片側だけに影がかかった時間帯に出ます。

限界の明示:方位や枚数が違う2系統では成り立ちません。その場合 PV_W_SCALE を実測比から決め直す必要があります。この定数は「この設備専用のパラメータ」であり、 汎用ツールなら置けない類の設定です(原則②)。

4-2. 電力バランスとロス・効率
ロスと効率 Ploss= PinPout , ηconv= Pout Pin ×100 %(4.1)

Pin = Ppv + |Pgrid| + PdisPout = Pload + Pchg

なぜ「ロス」を独立した表示項目にしたのか

直接の意味:インバーターの変換損失(DC/AC変換、MPPT、待機電力)です。 定格付近で 5〜7%、軽負荷時は待機電力の比率が上がって 10〜15% になります。

本当の役割 — 計測の検算:この値は4つの独立したセンサー系(PV・商用・電池・負荷)が 互いに矛盾していないかを検算しています。もしどれか1つのスケール設定が間違っていれば、 ロスは物理的にありえない値(マイナス、あるいは 30% 超)になります。 化学プラントのデータ・リコンシリエーション(物質収支の突合)と同じ発想です。

だから閾値監視する:|ロス率| > 18% を異常として通知します(→ §13)。 これは「インバーターが壊れた」ではなく、多くの場合「設定かセンサーがおかしい」を意味します。

この検算が無いと起きること

レジスタの倍率設定(×0.1 か ×1 か)を1か所間違えても、各カードは「それらしい数字」を出し続けます。 負荷が 10 倍に出ていても、単体では気づけません。ロス率という横断的な整合指標だけが、 「どれか1つがおかしい」ことを検出できます。

4-3. エネルギーフロー図の意味づけ
ノードとしてのインバーター ― 入る電力 = 出る電力 + ロス インバーター 変換ノード 太陽光 P_pv (入力・正) 商用 |P_grid| (入力) バッテリー 充電=出力 / 放電=入力(両方向) 負荷 P_load (出力) P_loss (熱として散逸) 粒子の向き=電力の向き。バッテリーだけが双方向ノードであり、符号の正規化が必要な唯一の系統。
設計上の要点:バッテリーだけが「入力にも出力にもなる」双方向ノードです。 だから符号規約が必要になり、だから BATT_SIGN を読み出し直後に1回だけ適用します。 他の3系統は片方向なので符号の曖昧さがありません。
4-4. 実機画面での確認 ― 式(4.1)が実際に閉じている例

以下は実稼働中のダッシュボードです。右下の「直流側/電力収支」に、 式(2.3)・式(4.1)がそのまま数値として出ています。

実機ダッシュボード LVYUANインバーター モニタリングのダッシュボード。上段に太陽光発電6.60kW・消費電力18W・バッテリー電力+6.00kW・商用電源0W・変換ロス583W・本体温度57.4℃の数値カード、中央にエネルギーフロー図、右側にSOCカードと直流側/電力収支の内訳を表示。
入力合計(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. 支配方程式
クーロン積算 SOC(t)= SOC(t0)+ 100Qeff t0t η(I) I(τ)dτ %(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 を推定する場合、誤差は次のように伝播します。

電圧法の誤差伝播 δSOC= δV |dV/dSOC| δVSV SV = 電圧感度 [V/%](5.2)

分母 SV が小さいほど、同じ電圧誤差が大きな SOC 誤差に化けます。 LFP の OCV 曲線でこの値を実際に計算すると、領域によって1桁以上違います。

計算:領域ごとの電圧感度(16直列)
  1. 平坦域:セル電圧は SOC 15→95%(80%幅)でおよそ 3.20→3.40V(0.20V幅) → S_V = 0.20/80 = 0.0025 V/%/cell → 16S で 0.040 V/%
  2. 上端(充電末期):SOC 95→100%(5%幅)で 3.40→3.55V(0.15V幅) → S_V = 0.030 V/%/cell → 16S で 0.48 V/%
  3. 下端(放電末期):SOC 10→0%(10%幅)で 3.10→2.80V(0.30V幅) → S_V = 0.030 V/%/cell → 16S で 0.48 V/%
  4. 感度比 0.48 / 0.040 = 12 倍 ― 端部は平坦域より12倍正確に読める
さらに悪いこと:内部抵抗による電圧降下
計算:IRドロップが SOC 誤差に化ける量
  1. 16S パック全体の内部抵抗を R_int = 10 mΩ と仮定
  2. 放電電流 50A のとき電圧降下 ΔV = 50 × 0.010 = 0.50 V
  3. これを補正せず平坦域で電圧法を使うと δSOC = 0.50 / 0.040 = 12.5 %
  4. 同じ 0.50V を端部で使った場合 δSOC = 0.50 / 0.48 = 1.04 %
  5. 加えて電圧の読み取り分解能 0.1V(レジスタ ×0.1)が ±1.25% / ±0.21% 上乗せ
LFP の OCV 曲線と、電圧法で生じる SOC 推定誤差 上:セル電圧の実測的な形 / 下:同じ電圧誤差 0.1V が SOC 誤差に化ける量 2.82.93.1 3.33.5 セル電圧 (V) 平坦域 3.15–3.35 V / 較正禁止区間 読める 読める 表示 0% = 50.0V (3.125V/cell) 満充電 56.8V (3.55V/cell) 0246 δSOC (%) 0.2% 2.5%(平坦域では 12 倍の誤差) 0.2% 02040 6080100 残量 SOC (%) 較正可(誤差小) 較正禁止(誤差大)
上段=LFP の OCV 曲線。中央 80% の区間で電圧は 0.2V しか動きません。 下段=同じ 0.1V の電圧誤差が、どれだけの SOC 誤差になるか。平坦域では 2.5%、端部では 0.2%。 さらに負荷電流による IR ドロップ(0.5V)まで含めると、平坦域の誤差は 12.5% に達します。 これが「中央では電流を積み、両端でだけ電圧で答え合わせする」という構造の理由です。
5-3. 内部抵抗補正 ― 静止 OCV の取り出し
OCV 復元 OCVVbat I·Rint |I| 0.05C が 600s  継続時のみ (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 で見たとおり、積算誤差は時間に比例して育ちます。それを定期的にゼロに戻すのが較正アンカーです。

アンカー① 満充電較正(最も信頼できる)
満充電判定 [ (VbatVfull) (0<IItail) ] 180s連続 SOC100 (5.4)

Vfull = 56.8 V(3.55 V/cell × 16S)、 Itail = 0.02 C ≈ 7.8 A(Qeff = 390.6 Ah のとき)。

3つの条件それぞれの意図

条件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 SOCdisp= 100× clamp( SOCphysSOCfloor 100SOCfloor ,0,1) (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か月表示) ログ画面。上から電力(W)、バッテリー残量SOC(%)の実機と積算の比較、直流電圧、直流電流、交流電圧、交流電流、日射量(W/m²)の時系列グラフを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. 推定式
容量の実測 Qmeas= ΔAh ΔSOC/100 , ΔAh= tAtB ηIdτ [Ah](6.1)

tA, tB は連続する2つの較正アンカーの時刻。 ΔSOC はその2点での(較正済み=信頼できる)SOC の差。

なぜアンカー間でしか測れないのか

この式は「SOC が確実に分かっている2点の間で、実際に何 Ah 流れたか」を突き合わせるものです。 アンカーでない時刻の SOC は積算値であり、そこには Qeff 自身が入っています。 アンカー以外で式(6.1)を使うと、推定したい量を推定に使う循環論法になり、 どんな Qeff を入れても式が成立してしまいます(情報がゼロ)。

6-2. なぜ ΔSOC ≥ 37% を要求するのか ― 誤差伝播からの決定

式(6.1)は割り算なので、相対誤差は次のように合成されます。

相対誤差の合成 (δQQ)2 = (δAhΔAh)2 + (δSOCΔSOC)2 (6.2)
計算:許容誤差から下限 ΔSOC を逆算する
  1. 各アンカーの SOC 不確かさを δSOC_anchor ≈ ±1.5% と見積る(満充電較正の精度)
  2. 2点の差なので合成 δSOC = √2 × 1.5 ≈ 2.1%
  3. 電流積算側の相対誤差は数時間スケールなら δAh/ΔAh ≈ 1% 程度で、第2項が支配的
  4. よって近似的に δQ/Q ≈ 2.1 / ΔSOC
  5. 1回の推定を誤差 6% 以内に収めたい → ΔSOC ≥ 2.1/0.06 = 35%
  6. 実装値 37%(余裕を持たせた値)
ΔSOC1回の推定誤差 δQ/Q390.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 が小さいほど、割り算の分母が小さくなって誤差が拡大します。37% は「1回で 6% 以内」を満たす下限。
容量推定の相対誤差は ΔSOC に反比例する δQ/Q ≈ 2.1 / ΔSOC ― 小さな充放電で学習してはいけない理由 0510 1520 δQ/Q (%) 許容域(1回の推定誤差 ≤ 6%) 学習しない領域 ΔSOC < 37% ΔSOC = 37 %(実装のしきい値) ここで δQ/Q = 5.7 % 02040 6080100 アンカー間の ΔSOC (%)
双曲線の形が本質です。ΔSOC が小さい領域では誤差が急激に立ち上がるため、 「たくさん学習すれば平均で良くなる」という発想が通用しません(1回の誤差が大きすぎて、 平均するのに必要な回数が現実的でなくなる)。だから小さい充放電は最初から使わない
6-3. なじませ(EMA)― なぜ α = 0.25 なのか
容量の更新 Qn= Qn1+ α· w· ( clamp(Qmeas, 0.9Qn1, 1.1Qn1) Qn1 ) (6.3)

α = 0.25、w = min(1, ΔSOC/100) は信頼度重み、clamp は前回値の ±10% に制限するレート制限。

解析:1次IIRフィルタとしての性質
  1. 重み w = 1、真値一定と置くと誤差は e_n = (1−α)ⁿ e_0 で幾何減衰
  2. 時定数(1/e に減る回数)N_τ = −1/ln(1−α) = −1/ln 0.75 = 3.48 回
  3. 95% 収束に必要な回数 n = ln(0.05)/ln(0.75) = 10.4 回
  4. ノイズ抑圧:定常状態の出力分散 σ_out² = σ_in² · α/(2−α) = σ_in² × 0.143
  5. 標準偏差では √0.143 = 0.378 倍ノイズが約 1/2.6 に圧縮
  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回」という運用実態から選んだ値です。

EMA 係数 α の比較 ― 追従の速さとノイズ抑圧のトレードオフ 真値が 390 Ah から 360 Ah に劣化したときの、各 α での追従(ノイズ込み) 400385 370355 実効容量 (Ah) 真値(劣化後 360 Ah) α = 1.0(そのまま代入)― 毎回 ±6% 暴れる α = 0.25(実装) 3.5回で 63%、10回で 95% 収束 α = 0.05 ― 劣化に追いつけない 048 1216 劣化発生からの学習イベント数(回) α=1.0 α=0.25 α=0.05 真値
赤(α=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 の弱点: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 の意味
健全度 SOH= QeffQdesign ×100 %(6.4)

SOH は仮想レジスタ 0xF022 として時系列に記録されます。日々の値は誤差を含みますが、 数か月の傾きが劣化速度そのものです。年 2〜3% の低下が一般的な LFP の目安であり、 これを大きく超える下降トレンドが見えたら、運用条件(高温での使用、深い放電の頻度)を見直す材料になります。

学習が精度に効く経路:Qeff は式(5.1)の分母です。 つまり実効容量の学習は、SOC の全区間のスケールを直接補正します。 「使うほど残量%が実態に合っていく」の主要因はここです。
07 エネルギー積算(本日・累計)

SOC(%)とは独立に、各系統を通った電力量(Wh)を積算します。SOC の較正やリセットの影響を受けず、 単調増加することが設計上の要件です。

7-1. 積算式
エネルギー積算 Ex(t)= tdayt max(0, Px(τ)) dτ 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
なぜ max(0, ·) で切るのか

物理的理由:「本日の発電量」は発電した分の合計であり、 ノイズで一瞬マイナスになった値を差し引くべきではありません。 センサーのオフセットで夜間に −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. モデル
発電予測 Epv= H·cMJ·k [Wh] = [MJ/m²]·[Wh·m²/MJ]·[–](8.1)

H=日射量 [MJ/m²](Open-Meteo)、cMJ=277.8、k=学習係数。

k の物理的な正体
導出:k を物理パラメータに分解する
  1. PV モジュールの定格 P_rated は、標準試験条件 G_STC = 1000 W/m² での出力
  2. したがって等価受光性能は A_eff = P_rated / G_STC [m² 相当]
  3. 実運用では各種損失が掛かる → k = A_eff × PR = (P_rated[W]/1000) × PR
  4. 単位を 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 の根拠
IEC 61724-1 の Performance Ratio に相当。実測学習前の初期値 kW × 0.75 はこの中央付近です。
なぜ損失を個別にモデル化しないのか

個別モデル化に必要なもの:パネル裏面温度センサー、方位・傾斜角の正確な値、 周囲構造物の3D形状(影の計算)、パネルの分光応答曲線。家庭にはどれも無い

一括同定の利点:これらの積は、その設備ではほぼ一定です (季節変動はありますが、中央値を取れば代表値が出ます)。 未知パラメータを1個に絞ることで、実績3日で意味のある推定ができます。 6個の未知パラメータを個別推定しようとすれば、必要データ量は桁違いになります。

これが「汎用でない」ことの具体的な中身:汎用ツールは PR = 0.75 のような固定値を使います。しかし北向き斜面の家、 午後に隣家の影が入る家、雪国の家では実際の PR は 0.6 にも 0.85 にもなります。 この家の k を、この家のログから決めるのが本システムの設計です。

8-2. 学習則 ― なぜ平均でなく中央値なのか
係数の学習 k^= mediD { Ei HicMJ } (|D|3) (8.2)
統計:平均と中央値の頑健性比較
  1. 破綻点(breakdown point)=推定量を無限に壊すのに必要な汚染データの割合
  2. 平均:0 %1点でも異常値があれば無限に動く
  3. 中央値:50 %(半数が異常でも壊れない)
  4. 代償 — 正規分布での相対効率:2/π ≈ 63.7 %(分散が π/2 = 1.57 倍)
  5. つまり中央値は、同じ精度を出すのに 約 1.57 倍のサンプルが要る
  6. 判断:日射→発電のデータには「雪でパネルが埋まった日」「落葉で半分隠れた日」「通信断で発電が欠測した日」が 必ず混じる。57% のサンプル効率損失より、50% の破綻点を買う方が実運用では圧倒的に得
1日の異常値が平均と中央値に与える影響 14日ぶんの「実発電/日射」比。8日目に積雪でパネルがほぼ隠れた(比が 0.12) 00.20.4 0.60.8 k = E / (H·c) 積雪日(0.12) 中央値 0.75 ― ほぼ動かない 平均 0.70 ― 1日で 6.7% 引き下げられた 148 1114 日次の実績比 中央値 平均
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 日で切り替えるのか

中央値の下限:中央値が意味を持つ最小サンプル数は 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日は「学習の開始点」であって「完成点」ではありません。 そのため学習状況(実測学習中/日数)を常に表示し、 仮想レジスタ 0xF020k×100 を記録して推移を追えるようにしています。

8-4. 週間予測への展開

Open-Meteo の日別日射予報 Hd に同じ k を掛けて、7日分の発電量を出します。 週間カードの棒グラフはこの値を高さで表現しています。

誠実に言うべきこと:週間予測の誤差は、ほとんどが気象予報の誤差です。 k がどれだけ正確になっても、3日後の日射量予報が外れれば発電予測は外れます。 学習で改善するのは「日射 → 発電」の変換部分だけであり、 「明日の日射がいくらか」は外部予報の精度に完全に依存します。この分解は §14 で定量化します。
09 カーテイルメント予測 ― 「捨てているPV」を見つける 学習

晴れた日に午前中で満充電になると、電池がそれ以上受け取れず、インバーターは PV の出力を絞ります。 発電できたはずの電力が消える――これがカーテイルメント(出力抑制)です。 本章はこの「見えない損失」を定量化し、予測し、家電提案に変換するまでの全アルゴリズムです。

この章が本システムの独自性の中心です。市販の監視ツールは「発電した量」を表示しますが、 「発電できたのに捨てた量」は表示しません。捨てた電力はセンサーのどこにも現れないからです。 存在しないデータを推定するには、反実仮想(もし満充電でなかったら何W出ていたか)を モデルで作る必要があります。
9-1. 問題の定式化 ― これは「打ち切りデータ」問題である

観測される PV 出力 Pi は、真のポテンシャル P*i をそのまま見せてくれません。 満充電状態では、インバーターの制御によって上から抑えられた値が観測されます。

観測モデル(打ち切り) Pi= min( Pi*, Plim(SOCi,Li) ) Pi*= kpGi+ε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. 解 ― 「絞られていないサンプル」だけで学習する
ポテンシャル係数 k^p= mediU {PiGi} , U= {i: SOCi<98 Gi80 } |U| ≥ 12(9.2)

U非打ち切り(uncensored)サブサンプル。SOC が 98% 未満なら電池はまだ充電を受け入れており、 PV は絞られていない ⇒ その時刻の観測は真のポテンシャルそのもの。

定量化:打ち切りサンプルを混ぜたときのバイアス
  1. 晴天日に 11 時満充電とすると、日射のある時間帯 6–18 時のうち 11–18 時(7/12 ≈ 58%)が打ち切り区間
  2. 打ち切り区間の観測値は「そのときの負荷」に張り付く。負荷 600W、ポテンシャル 2500W とすると比は 0.24
  3. 全サンプルで中央値を取ると、サンプルの過半が打ち切り側なので中央値は打ち切り側に落ちる
  4. すなわち k_p^naive ≈ 0.24 × k_p^true(極端な場合)
  5. この k_p で捨て量を計算すると W = max(0, k_p·G − P) ≈ 0
  6. 結論:捨てを検出するはずの式が、捨てを完全に隠す。しかも表示上は「捨てゼロ=優秀」に見える
打ち切りサンプルを混ぜると、ポテンシャル係数は下方バイアスを持つ 横軸:日射強度 G [W/m²] 縦軸:PV 出力 P [W] ― 満充電後の点は「負荷の高さ」に張り付く 01k2k 3k4k PV 出力 P (W) 真の関係 P* = k_p·G(非打ち切り点から同定) 全点で学習した係数 ― 大幅な過小 打ち切り天井 ≈ そのときの負荷(600W) SOC = 98% 到達(満充電) これ以降のサンプルは学習から除外する この面積 = 捨てた発電 0250500 7501000 日射強度 G (W/m²) 非打ち切り(学習に使う) 打ち切り(除外する)
緑の点だけで直線を引くのが式(9.2)です。赤の点(満充電後)を混ぜると、 回帰直線は赤の破線まで寝てしまい、橙の面積=捨て量がゼロに潰れます。 「捨てを推定するために、捨てていない時間帯のデータだけを使う」という一見遠回りな設計が、 この問題では唯一の正解です。
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. 出力上限クリップ ― 線形モデルの飽和
ポテンシャル(有界) Ph*= min( k^pGh ,Pmax ) (9.3)
なぜクリップが必須なのか

物理的事実:雲の縁で太陽光が反射・集光される「クラウドエッジ効果」により、 日射計は瞬間的に 1200〜1400 W/m² を記録することがあります(STC の 1000 を超える)。

線形モデルの破綻:P* = kp·G をそのまま適用すると、 定格 5kW の設備が 6〜7kW を発電したことになります。物理的に不可能です (パワコンの定格、ストリングの短絡電流、いずれも上限がある)。

クリップしないと何が壊れるか:捨て量 W = P* − P が 実在しない発電分だけ水増しされます。「今日は 8kWh 捨てました」という表示が出て、 それに基づく家電提案が存在しない余剰を前提に行われる。ユーザーが従うと買電が増えます。

工学的な位置づけ:これは飽和非線形性(saturation)の明示です。 実システムは必ず有界であり、線形モデルは動作範囲の中でだけ妥当です。 範囲外に出たときに何をするかを決めておくのが、実装可能なモデルの条件です。

9-4. 実測の捨て量(振り返り・高精度)

ログを後から走査して、実際に捨てた量を積算します。予測ではなく事後の計測なので、 実際の日射・実際の SOC を使えるぶん高精度です。

実測カーテイル量 Wmeas= iC max(0, min(k^pGi,Pmax) Pi )·Δti C = 満充電状態の時刻集合(9.4)
満充電状態の判定 C: SOC_i ≥ 98 % または V_bat,i ≥ V_float (≈ 56.8V 付近) ↑ SOC 推定に誤差があっても、電圧側の条件で拾えるよう OR にしている(冗長判定)
なぜ OR 条件にしたのか

SOC は推定値であり、誤差を持ちます(§05)。SOC だけで満充電を判定すると、 SOC が 96% と誤推定されている日は捨て量が丸ごと計上されません。

一方、フロート電圧への到達はインバーターが実際に絞り始めた物理的な証拠です。 2つの独立な判定を OR で結ぶことで、どちらか一方が誤っても捨てを見逃さない構成にしています。 安全側(見逃さない側)に倒す設計です。

9-5. 1日シミュレーション ― 状態方程式による前向き積分

ここからが予測の中核です。時間別の日射予報・学習した係数・学習した負荷プロファイル・ 現在の SOC を入力に、1日の電池の動きを1時間刻みで前向きに解きます

状態方程式
余剰 Sh= Ph*L^h [W](9.5)
充電(受入制約) Ch= min( max(0,Sh), EcapBh1Δh ,Pchg,max ) (9.6)
状態更新 Bh= Bh1+ (ChDh)Δh , Dh=max(0,Sh) (9.7)
捨て Wh= (max(0,Sh)Ch) Δh [Wh](9.8)

Bh=時刻 h 終了時の電池エネルギー [Wh]、 EcapQeff×Vnom(§06 の学習値が効く)、 Dh=放電、Δh=1 時間。

アルゴリズム:1日を前向きに解く
  1. 初期状態 B_0 = SOC_now/100 × E_cap を置く(SOC 精度がここで効く
  2. 各時刻 h について、日射予報 G_h から式(9.3)でポテンシャル P*_h
  3. 負荷プロファイル L̂_h(§10)を引いて余剰 S_h(式9.5)
  4. 電池の空き E_cap − B_{h−1} と充電上限で頭打ちにして充電 C_h(式9.6)
  5. 入りきらなかった余剰が捨て W_h(式9.8)
  6. 状態を更新(式9.7)して次の時刻へ
  7. 日終わりまで繰り返し、Σ W_h が「本日の捨て見込み」
満充電到達時刻の算出と、時間内補間
満充電時刻 h*= min{h: Bh0.98Ecap } 補間: hfine*= h*1+ 0.98EcapBh*1 Ch*Δh (9.9)

1時間刻みのままでは「11時」としか言えませんが、その時間内での線形補間により 「11:20 頃」まで解像度を上げられます。充電電力はその1時間内でほぼ一定なので、線形補間で十分です。

9-6. 翌日予測 ― 夜明け SOC の推定

翌日をシミュレーションするには、翌朝の出発点が要ります。今の SOC ではなく、 今夜の消費で下がったあとの SOC です。

夜明け SOC SOCdawn= max(SOCmin, SOCnow 100Ecap hN (L^hPh*) Δh ) N = 今夜〜翌日の出(9.10)
なぜこの一手間が決定的なのか

省略した場合:現在 SOC 90%(夕方)をそのまま翌朝の出発点にすると、 翌朝は「ほぼ満タン」から始まるので、翌日は朝から捨てるという予測になります。

実際:夜間に照明・冷蔵庫・待機電力で 3〜5 kWh 消費すれば、 20kWh 容量なら翌朝は SOC 65〜75%。満充電到達は数時間遅れ、捨て量も大きく減ります。

誤差の大きさ:この一手間の有無で、満充電時刻が 2〜4 時間、 捨て量が 2 倍以上変わります。翌日の家電提案が「朝から回せ」なのか「昼過ぎから」なのかを分ける、 実用上きわめて大きい差です。

下限 SOCmin を置く理由:実際の運用では、SOC が下限に近づけば 商用に切り替わるか、ユーザーが消費を抑えます。無制限に引き算すると負の SOC という 非物理的な値になるため、10% 程度で下限を設けます。

9-7. 予測誤差の感度解析 ― どの入力が結果をどれだけ動かすか

予測の信頼性を理解するには、「どの入力がどれだけ効くか」を知る必要があります。 式(9.9) の満充電時刻 h* を各入力で偏微分します。

導出:満充電時刻の感度
  1. 満充電条件は B_0 + ∫₀^{h*} (P* − L) dt = 0.98·E_cap
  2. 両辺を B_0 で微分:1 + S(h*)·dh*/dB_0 = 0
  3. よって dh*/dB_0 = −1/S(h*)S=その時刻の余剰[W])
  4. SOC 単位に直すと dh*/dSOC_0 = −E_cap/(100·S(h*))
  5. 同様に係数の感度: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/SSOC₀=60%, S=2500W+19 分(遅れる)
ポテンシャル係数 kp が −10%≈ +h*·P*/S ×0.1h*=4h, P*=3000W, S=2500W+29 分
日射予報が −20%(曇り予報外れ)同上(×2)同上+58 分
負荷プロファイルが +20%≈ +h*·L/S ×0.2h*=4h, L=600W, S=2500W+12 分
S = 満充電到達時点での余剰電力。余剰が小さい日ほど、すべての感度が拡大します(分母が小さい)。
この表が示す最重要の結論:満充電時刻の予測精度を支配しているのは 現在 SOC の精度です。SOC が 10% ずれれば、それだけで予測が 1〜2 時間ずれる。 日射予報の誤差より効く場合すらあります。§05・§06 に最も投資した理由がここにあります―― SOC は表示項目ではなく、予測系全体の初期条件だからです。
1日シミュレーションの出力 ― 満充電時刻と捨て量の予測 上:電力の時間推移 下:電池残量(状態変数 B_h)の推移 01k2k3k 電力 (W) 捨て見込み ΣW_h ≈ 6.2 kWh P*_h(ポテンシャル) 実発電(満充電後は絞られる) L̂_h(負荷プロファイル) h* = 11:20(式9.9 の補間つき) 050100 SOC (%) 満充電 98% B_h(式9.7 の状態変数) ここから先、余剰は行き場を失う 6810 12141618 時刻 ポテンシャル 実発電 負荷 電池 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)の h――「この家は何時に何 W 使うか」。 シミュレーションの入力のうち、唯一この家の生活そのものを表すパラメータです。

10-1. 推定式
時刻別負荷プロファイル L^h= meddD14 {Ld,h} h=0,1,,23 24個の独立した中央値(10.1)

Ld,h=日 d の時刻 h における平均負荷 [W]、D14=直近14日。

なぜ「1日の平均消費」ではなく「時刻別」なのか

平均で代表した場合: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つの制約の交点
解析:窓長 n の3つのトレードオフ
  1. 統計精度:中央値の標準誤差は正規近似で SE ≈ 1.253·σ/√n → n が大きいほど良い(n=7 で 0.47σ、n=14 で 0.33σ、n=28 で 0.24σ)
  2. 曜日効果:平日5+休日2 の週構造がある。n は 7 の倍数であるべき (7 の倍数でないと、窓に含まれる休日数が日によって変わり、プロファイルが曜日で揺れる)
  3. 季節追従:冷暖房負荷は 2〜3 週間で目に見えて変わる。 窓が長すぎると過去の季節を引きずる(4月に3月の暖房負荷が残る)
  4. 候補: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. ここでも中央値である理由
2年のログが示した外れ日の実態

実際に混入するもの:来客のあった日、旅行で不在の日、 エアコンを終日つけた猛暑日、給湯器を追い焚きした日、通信断で負荷が 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つの指標
総量・ピーク・平均 Esur= hWh , Ppeak= maxh{Wh/Δh} , Pavg= Esur|{h:Wh>0}|Δh (11.1)
指標単位何を制約するか使い方
総量 EsurWhその日に吸収できるエネルギーの総量「エコキュート1回分は入るか」の判定
ピーク PpeakW同時に出せる瞬時電力の上限単体で回せる最大の機器を決める
平均 PavgW継続的に使える安全側の目安長時間運転する機器の判断
なぜ3つとも必要なのか

総量だけでは不十分:「6.2kWh 余る」からといって、3kW の EV 充電器を回せるとは限りません。 余剰が 1kW × 6時間 に分散していれば、3kW は一瞬たりとも太陽光でまかなえない。 差額 2kW は電池か商用から出ることになり、買電が増えます。

ピークだけでも不十分:ピークが 3kW あっても、それが 20 分だけなら エコキュート(1.5kW × 3時間 = 4.5kWh)は完走できません。

エネルギーと電力は別の制約:これは電力システムにおける 容量制約(kW)とエネルギー制約(kWh)の区別そのものです。 両方を独立に満たさなければ、提案は物理的に実行不可能になります。

11-2. 最適化問題としての定式化
目的関数 maxxi{0,1} ixiEi 吸収できるエネルギーを最大化(11.2)
制約条件 ixiPi min(Ppeak,Pinv) (電力制約) ixiEi Esur (エネルギー制約) Pi1.1Ppeak (単体制約) (11.3)

xi=家電 i を回すか(0/1)、Pi=定格 [W]、 Ei=1回の運転で消費する量 [Wh]、Pinv=インバーター出力定格。

問題の分類:これは2次元 0-1 ナップサック問題(電力とエネルギーの2つの容量制約)です。 厳密解は NP 困難ですが、家庭の対象家電は n ≤ 10 程度なので全探索(210 = 1024 通り)も可能です。 実装では、次に述べる理由から降順貪欲法を採用しています。
11-3. 降順貪欲アルゴリズム
アルゴリズム:提案の生成
  1. 単体制約でふるい落とす:P_i > 1.1·P_peak の家電を候補から除外
  2. 定格の降順にソート:P_1 ≥ P_2 ≥ … ≥ P_n
  3. 残余余剰 R ← E_sur、残余電力 Q ← min(P_peak, P_inv) で初期化
  4. 各家電について順に:R ≥ 0.5·E_i かつ Q ≥ P_i なら採用し、 R ← R − E_iQ ← Q − P_i
  5. 採用された家電の合計 W と、使い切れずに残る捨て量 R を併記して提示
なぜ「大きい順」なのか ― 3つの理由

理由1 — 価値密度が均一:ナップサック問題の貪欲法は通常 「価値/重量比の降順」で詰めます。ここではどの1 kWh も価値が同じ(同じだけ買電を減らす)ため 比が全家電で等しく、比による順序付けが意味を持ちません。そこで吸収量の絶対値で順序を決めます。

理由2 — 大きい機器ほど捨てを速く潰す:ピーク余剰は時間幅が限られています。 その限られた窓で最大量を吸収するには、電力の大きい機器を優先するのが有利です。 小さい機器から詰めると、ピーク時間帯を使い切る前に窓が閉じます。

理由3 — 実行可能性:エコキュート・EV 充電・食洗機のような大型機器ほど 運転タイミングの自由度が低い(沸き上げは連続運転が必要)。 先に大型機器の居場所を確保し、小型機器を隙間に入れるほうが、実際に実行できる提案になります。

近似の質:単一制約のナップサックにおいて、貪欲法は最適解の 1/2 以上を保証します(最良の単品と貪欲解の良い方を取る場合)。 実際には家電数が少なく定格が離散的なため、ほぼ最適解に一致します。 厳密解に対する改善余地より、計算の透明性(なぜその提案かを説明できる)を優先しました。

11-4. 2つのマジックナンバーの根拠
採用閾値 0.5 ―「半分以上まかなえるなら提案する」
なぜ 100% ではなく 50% なのか

閾値を 1.0(全量まかなえる)にすると: 余剰がぴったり足りる日しか提案が出ません。実運用ではほぼ何も提案されないツールになります。 予測には誤差があるため、1.0 を要求すると誤差のぶんだけ常に不足判定になります。

閾値を 0(無条件)にすると:余剰 100Wh しかなくても 4kWh の エコキュートを提案します。実質 97% を買電・電池から取るので、提案に従うと損をする

0.5 の意味:「半分以上を太陽光でまかなえるなら、 その家電を昼に回す価値がある」という判断です。残り半分は電池から出ますが、 その電池は昼のうちに再充電される見込みがあります(まだ余剰時間帯が続くため)。 実質的な自家消費率は 50% を大きく上回るケースが多くなります。

確認可能性:提案には常に「合計 W」と「それでも残る捨て見込み」を併記します。 ユーザーは 0.5 という内部閾値を知らなくても、提案に従った場合の結果を数字で確認できます。

単体制約の 1.1 倍 ―「ピーク余剰の 10% 増しまで許す」
なぜぴったり Ppeak で切らないのか

Ppeak は予測値である:§09 の感度解析のとおり、 日射予報・係数・SOC の誤差が乗っています。実運用での予測 RMSE は概ね ±10% 程度。

厳密に切った場合:予測ピーク 2.40kW のとき、定格 2.45kW の家電は除外されます。 しかし実際のピークが 2.6kW だったなら、それは回せた家電です。 予測誤差のせいで有用な提案を落とすことになります。

1.1 倍の意味:予測誤差の 1σ 相当を許容幅として上乗せします。 わずかに超える家電は「回せる可能性が高い」として提案に含め、 大きく超える家電(EV 充電 3.0kW vs ピーク 2.4kW = 1.25倍)は明確に除外します。

超過した場合の実害:瞬間的に不足したぶんは電池が補います。 10% の超過が数分続く程度なら、電池から数十 Wh 出るだけで、 その後の余剰で充電し直されます。非対称なリスク(見逃しの損失 > わずかな超過の損失)を 反映した非対称な閾値です。

降順貪欲による割り当て ― 単体制約 1.1×P_peak で自動除外 ピーク余剰 2.40 kW/許容上限 2.64 kW(=2.40×1.1) 01k2k3k 消費電力 (W) P_peak = 2.40 kW(太陽光でまかなえる上限) 1.1×P_peak = 2.64 kW(単体制約) 1.50 kW 1.20 kW 0.70 kW 0.70 kW 3.00 kW エコキュート① 採用 洗濯乾燥機② 採用 エアコン(居間)③ 採用 エアコン(寝室)未選択 EV 充電単体制約で除外 除外 降順(大きい順)に詰めるため、①→②→③ の順に評価。累積 3.40 kW はピークを超えるため、時間をずらす提案になる。 EV 充電(3.00 kW)は 2.64 kW を超えるため、単体で回すこともできない → 「夜間電力での充電」を別案内。
緑=提案採用、薄緑=未選択、赤=単体制約で自動除外。 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) ダッシュボード。左下に「余剰電力の活用アドバイス」、右上に週間の天気と発電予測の棒グラフおよび予測係数の学習状況、右下に今日の集計とオフグリット率・オフグリッド資産などの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 の roffrgrid と §12-2 の残差率がそのまま並んでいます。
この画面が示す設計の答え合わせ:アドバイス文には 「いつ(9〜13時ごろ)」「何が起きるか(満充電に達し余剰が出る)」「どれだけか(17.1kWh)」が入っています。 数式の出力である h* や ΣWh を、そのまま数字で見せるのではなく 行動できる文へ翻訳することが最後の一手間であり、ここまでやって初めて §09 の複雑な計算が意味を持ちます。
2年の運用で分かった、提案が効く条件

最も効くのは春と秋:日射が強く、冷暖房負荷が小さいため 午前中に満充電に到達しやすい。捨てが最大になる季節に、提案の価値も最大になります。

効かないのは真夏と真冬:真夏は冷房負荷が大きく余剰が出にくい、 真冬は日射が弱く満充電に達しない。この時期は提案がほとんど出ませんが、 それが正しい挙動です(捨てていないのだから提案する必要がない)。

副次的な発見:捨て量を可視化すると、ユーザー自身が 「では給湯のタイマーを昼に変えよう」という恒久的な設定変更をするようになります。 毎日の提案より、この一度きりの設定変更のほうが年間の効果は大きい。 可視化そのものが最大の機能だった、というのが2年で得た知見です。

12 収支KPI とデータ整合

§07 の日次エネルギー(days)から、自給の度合いとコストを算出します。 KPI は「良い/悪い」を測るだけでなく、計測系が壊れていないかを検算する役割も持ちます。

12-1. 自給に関する KPI
オフグリット率 roff= EloadEgridEload ×100 rgrid= EgridEload×100 roff + rgrid = 100(12.1)
自家消費率 rself= EpvWEpv ×100 発電のうち活用できた割合(12.2)
買電コスト Cost= Egrid1000·p Costmonth= dMCostd p = 単価 [円/kWh](12.3)
オフグリット率と自家消費率は「別の軸」である

よくある誤解:「オフグリット率 100% = 完璧」ではありません。 商用をまったく使わずに、同時に発電を大量に捨てている、という状態がありえます。

2軸で見る:

オフグリット率= 消費の側から見た自立度(買電に頼らなかったか)
自家消費率= 発電の側から見た有効利用度(作った電気を使い切れたか)

4象限: 両方高い=理想(発電を使い切り、買電もゼロ)。 オフグリット高・自家消費低=捨てている(→ §11 の提案が効く状況)。 オフグリット低・自家消費高=発電容量不足(設備増設の検討材料)。 両方低い=設備か運用に問題あり。

だから両方表示する:片方だけでは改善の方向が分からない。 2つの KPI を並べることで、次に何をすべきかが決まります。

2つの KPI による状態の分類 ― どちらか一方では改善方向が決まらない 理想 発電を使い切り買電もゼロ 発電容量が不足 作った分は全部使うが足りず買電している 捨てている 買電はゼロだが発電を余らせている → §11 の家電提案が効く 要調査 設備・運用・計測のいずれかに問題 オフグリット率 → 自家消費率 → 0 100% 100% 読み方の実例 春の晴天日:オフグリット 100% / 自家消費 62% → 買電ゼロだが、発電の 38% を捨てている → 昼に家電を回せば、光熱費をさらに下げられる 真冬の曇天日:オフグリット 48% / 自家消費 100% → 作った分は全部使ったが、半分は買電 → 家電提案は無意味。設備容量か消費側の見直し 同じ「オフグリット率 100%」でも、 自家消費率を見なければ次の一手が決まらない。
KPI を 2 軸で持つ設計意図。単一のスコアに丸めないことで、「今どの状態にいて、次に何をすべきか」が 一意に決まります。1つの総合スコアにまとめると、この情報は失われます。
12-2. 収支の閉じ残り ― データ・リコンシリエーション
残差率 rres= ElossEin×100 , Ein= Epv+Egrid+Edis (12.4)
これは KPI ではなく「計測の健康診断」

理論値:インバーターの変換効率が 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. 検知の一般形
残差検定 r=yobsy^model 異常 (r<θlo) jcj cj = 前提条件(13.1)

重要なのは第2項 Λ cj(前提条件の連言)です。条件を付けずに残差だけを見ると、 正常な理由で残差が大きくなる状況まで異常と判定してしまいます。

13-2. 発電性能低下の検知
性能残差 rpv= Pobsmin(kpG,Pmax) <0.65 (GGmin) (SOC<98) (13.2)
2つの前提条件がなぜ必須なのか

条件① SOC < 98%(非満充電): これが無いと、満充電で正常に絞っている状態を「性能低下」と判定します。 晴天日の午後は毎日アラートが出ることになり、通知が意味を失います (オオカミ少年効果 ― 誤警報が多い監視は無視されるようになる)。

条件② G ≥ Gmin(好天): 弱日射では比の分散が発散します(§09-2 と同じ理由)。曇天の朝に r が 0.5 になっても、 それは日射計とパネルの時間ずれや入射角の影響であって、故障ではありません。

一般原則:検知は「その現象が起きえない条件下」でのみ行う。 これが残差ベース診断(FDI: Fault Detection and Isolation)の基本作法です。 条件の設計は、しきい値の設計より重要です。

しきい値 0.65 の統計的根拠
  1. 前提条件を満たすサンプル(好天・非満充電)における r_pv の分布を2年分のログで確認
  2. 平均はほぼ 1.0(k_p が中央値で同定されているため定義的にそうなる)
  3. ばらつきの主因:雲の通過、入射角の日変化、パネル温度 → 標準偏差はおよそ σ ≈ 0.10
  4. しきい値 0.65 は (1.0 − 0.65)/0.10 = 3.5σ
  5. 正規近似での誤警報率 ≈ 0.02 % → 5秒サンプルでも実質的に鳴らない
  6. 逆に検出できるもの:パネル 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つの成分に分解できます。

誤差の分解 σtotal2= σparam2学習で減る + σinput2減らない (14.1)
成分正体大きさ(目安)学習で減るか
σparam
パラメータ誤差
kkphQeff の推定誤差初期 15〜25 %
収束後 2〜4 %
減る(1/√n)
σinput
入力誤差
日射予報の外れ(気象庁・Open-Meteo の精度)翌日 10〜20 %
3日後 25〜40 %
減らない
(構造誤差)線形モデルで表せない部分(部分影の非線形性など)3〜8 %減らない
14-2. パラメータ誤差の減り方 ― √n 則
中央値の標準誤差 SE(med) 1.253σn 正規分布での漸近式(14.2)

係数 1.253 = √(π/2)。これが「中央値は平均より 25% 効率が悪い」の正体です (その代わり破綻点 50% を得る、§08-2)。

学習日数 nSE / σ初日を 1.00 としたときの相対誤差この時点の状態
11.2531.00目安値(設備容量 × 0.75)を使用中
30.7230.58実測学習に切替(§08-3)
70.4740.38発電・捨て量が実態に馴染む
140.3350.27負荷プロファイルが一巡(§10-2)
300.2290.18ほぼ収束。以降は緩やか
900.1320.11季節ごとの特性が見え始める
730(2年)0.0460.037年周期を2回観測。季節依存も同定可能
√n 則の帰結:最初の1〜2週間で大部分が改善し、その後は緩やか。30日で 18%、そこから 90日かけても 11% にしかなりません。
運用日数 × 予測精度 ― 学習で減る誤差と、減らない誤差 縦軸:予測精度(100% − 相対誤差) 横軸:運用日数(対数的に配置) 506070 8090100 予測精度 (%) 漸近限界 ― 気象予報の誤差で決まる天井 どれだけ学習してもここは超えられない 総合精度(学習の効果) 3日実測学習へ切替 7日発電・捨てが馴染む 14日負荷プロファイル一巡 目安値 (容量×0.75) 037 143090730 運用日数(日・非線形目盛) 学習で減る誤差 σ_param(1/√n で減少) 減らない誤差 σ_input(外部の気象予報精度) 総合誤差 = √(σ_param² + σ_input²) ― 学習が進むと σ_input が支配的になり、曲線は天井に漸近する
曲線が 100% に届かないことが、この図の最も重要な情報です。 学習は σparam を減らしますが、σinput(気象予報の外れ)は手元では減らせません。 2年運用しても天井は動かない。「上がらないものは上がらない」と明示することが、 予測を実際に使える情報にします――どこまで信じてよいかが分かるからです。
14-3. 何が上がり、何が上がらないか
上がる 学習で改善するもの
発電係数 k3日で切替、以降 1/√n
ポテンシャル係数 kp12点以上で学習開始
負荷プロファイル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% が目安)
2年分の学習ログから見えたこと

発電係数 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) 外れ値(積雪・落葉・欠測・旅行)による推定の破壊
61次 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・そして負荷プロファイルの窓長設計は、すべて同じ問いに答えています。 「どのくらいの速さの変化を、信号として拾い、どのくらいを雑音として捨てるか」。

分離条件 τnoise τfilter τsignal (15.1)
対象τnoise(捨てたい)τfilter(設計値)τsignal(拾いたい)
実効容量1イベントの推定誤差EMA 3.5イベント ≒ 2–3週電池の劣化(年オーダー)
負荷プロファイル日々の変動(1日)窓 14日季節変化(1–3か月)
発電係数 k雲・汚れの日変動全期間中央値季節・経年劣化
SOC 積算電流ノイズ(5秒)積算そのもの実際の充放電
すべての行で ≪ が2重に成立しています。この不等式が成り立つ限り、フィルタ定数の細かい値は結果を大きく変えません。
設計の勘所:定数を「当てる」のではなく、分離が成立する範囲を確保すること。 α=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件を、 「何が起きたか → なぜ起きたか → どう直したか」の形で一覧にします。 現行コードにある定数やガードは、ほぼすべてこの表のどこかに対応しています。

#領域観測された失敗モード原因実装した対策参照
1SOC重い家電を使った瞬間に残量がストンと落ち、切ると戻るWh(電力量)で積算していたため、内部抵抗の熱損失を「消費」に誤計上Ah(電荷)積算へ変更。I²R 項が式から消える§02-1
2SOCSOC 表示が負荷に合わせて上下にばたつく全域で電圧から SOC を推定していた。LFP の平坦域では電圧が残量を語らない平坦域(3.15–3.35V/cell)では較正禁止§05-2
3SOC放電中だけ SOC が実際より低く出る端子電圧をそのまま OCV として使用。IR ドロップ未補正OCV = V − I·Rint の補正+静止条件§05-3
4SOC雲の切れ間で誤って 100% に較正される瞬時値で満充電判定していた180秒(36サンプル)連続のデバウンス§05-4
5SOCSOC 80% で満充電と誤判定電圧のみで判定。大電流時は IR で端子電圧が上限に届く電圧 AND 尾電流(0.02C)の連言に変更§05-4
6SOCスリープ復帰時に SOC が 20% 飛ぶΔt に上限が無く、1時間分を1サンプルで外挿Δt > 30秒の区間は積算しない§03-2
7SOC電池を使い切って寿命を削っていた物理 SOC をそのまま表示。0% が「本当の空」だった表示 SOC の線形写像(0% = 50.0V)§05-5
8SOC「使用可能時間」が実際より約10%短く出る表示 SOC で残時間を計算していた(写像後の値を使った)物理 SOC と Qeff で計算し、最後に表示へ変換§05-6
9SOC起動直後の推定値が実測と同等に見えていた信頼度の概念が無かった信頼度(高/中/低)を併記。較正からの経過・欠測で判定§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
17PV発電量が常に約半分に見える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
137回の改修から得た、方法論そのものの教訓

教訓① — 表示が「それらしい」ことは何の保証でもない: #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 系)全電圧しきい値が連動して変わる
満充電電圧 Vfull3.55 V/cell → 56.8 VLFP の推奨充電上限。3.65V まで上げられるが寿命が縮む較正の発生頻度と電池寿命
表示 0% 電圧3.125 V/cell → 50.0 V過放電回避のマージン。物理 SOC 約10%に相当使える容量と電池寿命のトレードオフ
公称電圧 Vnom3.20 V/cell → 51.2 VLFP の公称値。Ah ↔ Wh 換算に使用エネルギー換算全体のスケール
設計容量 Qdesign20 kWh ≈ 390.6 Ah20000 / 51.2(§02-4)SOH の基準値
尾電流 Itail0.02 C ≈ 7.8 AC/50 は電池業界の慣行。残る未充電分が容量の1%未満に収まる水準。厳しくすると較正イベントが発生しなくなる較正の精度と発生頻度
静止電流0.05 C ≈ 19.5 AIR ドロップを 0.2V 以下に抑える水準(R=10mΩ 想定)OCV 較正の精度
充電効率 ηchg0.99LFP のクーロン効率 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 飛び
安全圏 SOC15 %表示 0%(物理 10%)より手前で警告を出すための余裕使用可能時間の表示
18-2. 容量学習
定数決定根拠参照
最小 ΔSOC37 %アンカー誤差 ±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 換算 cMJ277.8106/3600 = 277.777…(SI 単位から一意)§02-3
発電係数の目安kW × 0.75IEC 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_SCALEPmax・インバーター定格・電気単価。 これらはこの設備に固有の値であり、学習では決まりません(原則②の適用範囲外)。 残りの定数は設備が変わっても概ねそのまま使えます。
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.850.60 未満 → 影・汚れ・故障/0.85 超 → PV_W_SCALE か定格の設定ミス
ポテンシャル係数 kp設備容量kW × 0.65 – 0.90同上。k より一貫して低いなら、打ち切り除外が効いていない
実効容量 Qeff設計の 80 – 105 %80% 未満 → 実劣化か誤学習(温度ゲート・ΔSOC ゲートを確認)
負荷プロファイル深夜 < 昼 < 夕方のパターンフラットなら平均で計算している/時刻がずれているならタイムゾーン設定
SOH トレンド年 −2 〜 −3 %急降下 → 誤学習の可能性が高い(実劣化がこの速さで進むことは稀)
19-4. 実測との突合(最終確認)
手順:SOC の実測検証(半日〜1日)
  1. 満充電較正が入った時刻を記録(SOC = 100% が確定した点)
  2. そこから意図的に大きく放電し、次の満充電まで運転する
  3. その区間で流れた電荷 ΔAh をログから積算
  4. Q = ΔAh / (ΔSOC/100) を手計算し、システムの Qeff と比較
  5. 差が 10% 以内なら健全。超えるならゲート条件・電流スケールを確認
手順:捨て量の検証(晴天日1日)
  1. 晴天日の午前中、満充電到達前の時刻で P_obs / G を数点手計算
  2. それらの中央値がシステムの kp と一致するか確認
  3. 満充電到達後、大きな家電を1つ入れる(例:エコキュート 1.5kW)
  4. PV 出力が家電のぶんだけ増えれば、その時刻に確かに絞られていた証拠
  5. 増えた量が予測捨て量と整合するか確認
手順②の 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回の改修は137回のビルド・配布・更新待ちを意味します。

HTML の決定的な利点:本体側のファイルを差し替えれば、 次にユーザーがページを開いた瞬間に新ロジックが動きます。 改修のサイクルタイムが「分」単位になる。これが2年で137回という 改修回数を可能にした実務上の条件でした。

副次的な利点:本書のような技術文書も同じ HTML で書けるため、 ロジックとドキュメントを同じ形式で並べられます。式の変更とその説明の更新が乖離しません。

20-2. 配信の構成
① 実機
インバーター
Modbus RTU / data.db3
② 本体 PC
Python が 5秒ごとに収集
SQLite へ記録・重い計算
③ 内蔵HTTPサーバ
ローカルで HTML/JSON を配信
URL を発行
④ 各デバイス
PC・スマホ・タブレットの
ブラウザで同一URLを開く
独自URL発行 ― 1つの計算結果を、すべてのデバイスへ インバーター Modbus RTU 5秒毎 本体 PC(常時稼働) Python:収集・積算・学習 SQLite:2年分のログ 内蔵 HTTP サーバ → 独自URLを発行 同一URL PC / ブラウザ 大画面・詳細グラフ スマートフォン 外出先・即時確認 タブレット 据置きダッシュボード この構成の性質 ・計算は本体 PC で 1 回だけ ・全デバイスが同じ数値を見る ・インストール/更新作業が不要 ・ロジック改修が即座に全端末へ ・端末が増えても計算負荷は不変 レスポンシブ設計により 画面幅に応じて自動でレイアウト変更
計算は本体 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回の改修すべてが全デバイスに同時に反映されました。 端末ごとにロジックを持っていたら、バージョン差による数値の食い違いの調査に 改修と同じだけの時間を取られていたはずです。

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)を反映します。設備構成の変更時はコード側の定数が優先されます。