― 数式・公式と、その「根拠」
オフグリットAI研究所が、実稼働するオフグリッド設備から2年間にわたって連続収集した 独自ログを解析し、137回の改修を重ねて到達した計算ロジックの全記述です。 式を並べるだけでなく、なぜその式なのか/なぜその定数なのか/その式が無いと何が壊れるのかを、 誤差伝播・ロバスト統計・制御工学の観点から一つずつ説明し、 さらに2年分の実データで何が裏付けられたかを各式に添えています。
本システムは汎用ツールではありません。この家庭・この設備・この気候に合わせて、 パラメータを実測から同定する設計です。産業用BMS・発電所監視で使われる考え方を、 家庭用の計算規模と、欠測だらけの現実のデータに耐えるよう作り直しました。 HTML 単体で動作し、独自URL発行により PC・スマートフォン・タブレットのどこからでも 同じ解析結果を参照できます(→ §20)。
このシステムの全ロジックは、3つの設計原則から導かれています。個々の数式は思いつきではなく、 この原則を満たす形として選ばれています。
「センサーが返した値」と「モデルが推定した値」を絶対に混ぜません。両者は誤差の性質がまったく違うためです。
| 層 | 誤差の源 | 誤差の振る舞い | 時間で改善するか |
|---|---|---|---|
| 実測層 PV電力・負荷・電圧・電流・温度 | センサー精度・A/D分解能・スケール設定 | 白色ノイズ+固定バイアス。大きさは一定 | しない(ハード依存) |
| 積算層 SOC・日次エネルギー | 実測層のバイアス × 時間 | 時間に比例して発散(ドリフト) | 較正しないと悪化する一方 |
| 推定層 発電予測・捨て予測・負荷予測 | モデルの構造誤差+パラメータ誤差+入力(気象)誤差 | パラメータ誤差は 1/√n で減る | する(学習で改善) |
問題:SOC を「実測値」だと思うと、較正の必要性が見えなくなります。実機が返す SOC レジスタ
0x0100 も、内部でクーロン積算した推定値です。実測のように見える値ほど危険です。
帰結:本システムは実機SOCを鵜呑みにせず、自前の積算SOC(仮想レジスタ 0xF000)を並走させ、
両者を同じ時系列に記録します。ずれ方そのものが、電池・BMSの状態を語る診断情報になります。
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%に制限。異常値が入っても被害を局所化。
目標へ α=0.25 ずつ寄せる1次フィルタ。ノイズを 1/2.6 に圧縮しつつ劣化には追従。
以降の全数式で使う記号を先に定義します。単位の取り違えは最も多いバグ源のため、 単位を式そのものの一部として扱います。
| 記号 | 意味 | 単位 | 符号規約・出所 |
|---|---|---|---|
| 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) |
BATT_SIGN で1回だけ正規化し、以降のすべての式は
「充電 > 0」で書かれています。符号変換をロジックのあちこちに散らすと、
式を1つ足すたびに符号バグの可能性が増えるためです(→ §17 改良#14)。
このシステムの計算は最終的に2つの保存則に還元されます。電荷保存とエネルギー保存です。 どちらをどこで使うかの選択が、精度を大きく左右します。
電池に出入りする電荷 q は保存量です。端子で測った電流を時間で積めば、電池内部に蓄えられた電荷が分かります。
電池の端子電圧は、内部抵抗による電圧降下を含んでいます。
ここで 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)。
一方、インバーターのノードではエネルギー保存が成り立ちます。入る電力の合計は、出る電力の合計と 変換損失の和に等しくなります。
この式を Ploss について解いたものが「ロス」表示、出力/入力が「効率」表示です。
電池の中身を数えるときは電荷保存(Ah)、系統全体の辻褄を見るときはエネルギー保存(W・Wh)。 この使い分けが本システムの計算構造そのものです。混ぜると、どちらの保存則も成り立たない中途半端な値になります。
気象データの日射量は 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.1)を、5秒ごとの離散サンプルでどう近似するか。ここに積算精度の大部分がかかっています。
サンプル 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% に上書きされるため、誤差が持ち越されません。
上限がないとどうなるか: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)。
電流測定の誤差を、バイアス(オフセット)とランダムノイズに分解し、積算後にどう育つかを比較します。
- 測定電流を Î = 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 % |
問い:電流センサーをより高精度なものに替えれば SOC は正確になるか?
答え:ならない。バイアス誤差はどれだけ高精度なセンサーでもゼロにはできず、 時間に比例して育つ以上、いつか必ず許容範囲を超えます。必要なのは定期的なリセット機構であり、 それが較正アンカー(§05-4)です。「精度を上げる」ではなく「誤差の蓄積を断ち切る」という発想の転換が、 産業用BMS(TI Impedance Track™ など)と共通する設計です。
| テーブル | 粒度 | 保持 | 設計意図 |
|---|---|---|---|
samples | 5 秒 | 約14日 | SOC積算・過渡現象の解析に必要な生の分解能。ただし1日 17,280行 × 全レジスタで肥大するため短期保持。 |
samples_1m | 1 分平均 | 長期(週ファイル) | 1/12 に圧縮。日次・週次・年次の傾向分析には1分で十分。学習の入力はこちら。 |
ファイルは ISO 週単位で分割します。1年分を表示するとき、52個の小ファイルの必要な範囲だけを開けばよく、 巨大な単一ファイルを走査する必要がありません(→ §17 改良#24)。
5秒ごとに得られる生レジスタから、瞬時の電力状態を組み立てます。ここは「実測層」であり学習は入りません。 ただし符号と合成の規約を厳密に決めておかないと、以降の全計算が汚染されます。
なぜ必要か:一部の機体は PV2 のレジスタ 0x010F–0111 を返しません。
しかし物理的には2系統のストリングが接続されており、実際の発電は PV1 の約2倍です。
ここを補正しないと、発電量が常に半分に見え、係数学習も自給率もすべて狂います。
なぜ「×2」で足りるのか:同一容量・同一方位のストリングを2系統に分けた構成であれば、 両者の出力はほぼ等しくなります。誤差は主に、片側だけに影がかかった時間帯に出ます。
限界の明示:方位や枚数が違う2系統では成り立ちません。その場合
PV_W_SCALE を実測比から決め直す必要があります。この定数は「この設備専用のパラメータ」であり、
汎用ツールなら置けない類の設定です(原則②)。
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つがおかしい」ことを検出できます。
BATT_SIGN を読み出し直後に1回だけ適用します。
他の3系統は片方向なので符号の曖昧さがありません。
以下は実稼働中のダッシュボードです。右下の「直流側/電力収支」に、 式(2.3)・式(4.1)がそのまま数値として出ています。
なお左のフロー図で商用電源が 0W、つまりこの瞬間は完全に太陽光だけで負荷と充電を賄っています。 右上の SOC カードが「積算 19.0% / 実機 60%」と大きく乖離している点は §05-8 で扱います。
本システムで最も改修を重ねた部分です。LFP(リン酸鉄リチウム)電池は残量 20〜80% で電圧がほぼ平坦であり、 「電圧を見れば残量が分かる」が根本的に成り立ちません。ここを正面から解いたのが本章です。
t0 は最後に較正した時刻(起動時刻ではない)。 η(I) = 0.99(充電時 I>0)、1.00(放電時)。Qeff は §06 の学習値。
物理:クーロン効率とは「押し込んだ電荷のうち、実際に蓄えられた割合」です。 LFP のクーロン効率は 99.5〜99.9% と非常に高い(副反応がほとんど無い)のですが、 自己放電・BMSのバランシング回路の消費が加わるため、実効的には 99% 程度と見積もります。
放電側に掛けない理由:放電時に「出てきた電荷」はそのまま外部に流れた電荷であり、 測定した電流がそのまま減った電荷です。ここに効率を掛けるのは二重計上になります。 非対称にするのが正しい扱いです。
値の保守性:0.99 は「押し込んだ分の1%は残らない」という控えめな見積りです。 これにより SOC はわずかに保守側(低め)に出ます。残量を過大に表示して突然落ちるより、 過小に表示して余る方が実用上安全である、という判断です。
電圧 V から SOC を推定する場合、誤差は次のように伝播します。
分母 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% 上乗せ
補正だけでは足りない理由:Rint 自体が SOC・温度・電流方向・ 経年で変わります。つまり補正項 I·R にも誤差があり、電流が大きいほどその誤差も大きい。 誤差のある量を、誤差のある補正で直しても、誤差は消えません。
静止条件(0.05C = 約19.5A 以下が 600秒)の意味:電流を小さくすれば 補正項そのものが小さくなり、Rint の誤差も比例して小さくなります。 19.5A × 10mΩ = 0.195V なので、Rint の見積りが 50% ずれても電圧誤差は 0.1V に収まります。
600 秒待つ理由 ― 拡散緩和:電流を止めた直後の端子電圧はまだ真の OCV ではありません。 電極内のリチウム濃度勾配が均一化するまで(拡散緩和)、電圧はゆっくり回復し続けます。 LFP の場合この時定数は数分オーダー。10分待つことで緩和のほぼ全部を消化します。 産業用BMSでいう「リラクゼーション時間」の確保です。
§03-3 で見たとおり、積算誤差は時間に比例して育ちます。それを定期的にゼロに戻すのが較正アンカーです。
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 を採ります。
満充電に到達しない日(曇天が続く冬など)でも較正を効かせるための第2のアンカーです。 §5-3 の条件下で OCV を求め、OCV–SOC テーブルを逆引きします。
素朴な発想:「電圧が読めるなら常に較正すればいい」
実際に起きること:平坦域では δSOC が 2.5〜12.5%(§5-2)。
積算SOCの誤差(数時間なら 1% 未満)より、電圧推定の誤差のほうが1桁大きい。
そこで較正すれば、正確な値を不正確な値で上書きすることになります。
結論:較正は「情報が増えるとき」だけ行う。平坦域は情報が無い区間なので、 積算を信じて何もしないのが正解です。これは推定理論でいう 「観測ノイズが大きいときは観測を重み付けしない」(カルマンゲインが小さくなる状況)を、 ゲート方式で単純化したものです。
負荷が入るたびに電圧が下がり、それを「残量が減った」と誤解して SOC を下げます。 負荷を切ると電圧が戻り、SOC が上がります。結果、SOC 表示が負荷に合わせて上下にバタつく。 ユーザーからは「残量表示が信用できない」に見えます。平坦域ガードはこの挙動を根絶するためのものです(→ §17 改良#2)。
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)。
同じ「SOC 62%」でも、10分前に満充電較正した直後の 62% と、 3日間較正できずに積み上げた 62% では意味がまったく違います。それを表示に反映します。
| 信頼度 | 条件(要旨) | 推定誤差の目安 | UI の扱い |
|---|---|---|---|
| 高 | 最後の較正から 24 時間以内、その間の欠測ゼロ | ±1〜3 % | 通常表示 |
| 中 | 較正から 24〜72 時間、または軽微な欠測あり | ±3〜8 % | 信頼度バッジ表示 |
| 低 | 起動直後で電圧推定から開始/72時間以上未較正/大きな欠測 | ±8 % 以上 | バッジ+較正を促す案内 |
工学的理由:推定値を点推定(62%)だけで出すのは、情報を捨てる行為です。 本来は分布(62% ± 3%)で持つべき量です。信頼度はその分散を3段階に離散化した簡易表現です。
実用的理由:ユーザーが「残り 20% だから大丈夫」と判断するとき、 それが ±3% なのか ±10% なのかで行動が変わります。推定値を実測値のように見せるのは ユーザーに嘘をつくことだという判断です(原則①)。
運用上の効果:「低」が続くなら、それは電池が満充電に到達していないサインでもあります。 信頼度は SOC の但し書きであると同時に、運用状態の診断情報にもなっています。
実機が返す SOC(0x0100)と、自前の積算SOC(仮想レジスタ 0xF000)を
同じ時系列に記録します。両者は原理的に一致しません。
| ずれ方 | 示唆される状態 |
|---|---|
| 実機SOC が常に高め | 実機BMS の容量設定が実際より大きい(劣化を反映していない) |
| 実機SOC が階段状に飛ぶ | 実機が電圧ベースの推定に切り替わっている(平坦域で不安定) |
| 両者が徐々に離れ、満充電で一致 | 正常。積算誤差が較正でリセットされている証拠 |
| 満充電後も一致しない | 実効容量 Qeff の学習値が実態と乖離 → §06 を確認 |
ログ画面には、専用のパネル「バッテリー残量 SOC(%)/ 実機 と 積算 の比較」を置いています。 1か月ぶんを並べると、両者の関係が一目で分かります。
0xF000)、青=実機SOC(0x0100)。
毎日の充放電サイクルでどちらも同じ形に振れており、電流積算が実際の充放電を正しく追えていることが分かります。
一方で絶対値には一貫したオフセットがあり(この期間は積算 69% に対し実機 22%)、
これは §05-8 の表でいう「実機BMS の容量設定が実態を反映していない」パターンに該当します。
片方だけを見ていては絶対に気づけない種類の情報です。最下段の日射量(W/m²)は仮想レジスタ
0xF011。1段目の実発電と同じ時間軸に置くことで、
§08 の発電係数 k と §09 のポテンシャル係数 kp の学習を、
後から目視で裏付けられます(§14-4)。なお 7/21〜7/23 付近で交流電圧・電流が落ちている区間は、実際の系統側の状態がそのまま記録されたものです。 異常も含めて生のまま残すことが、後からの原因追跡を可能にします。
式(5.1)の分母 Qeff は、SOC 全体のスケールを決める最重要パラメータです。 ここが 10% ずれれば、SOC も 10% ずれます。カタログ値を使わず、2つの較正アンカーの間で実測から同定します。
tA, tB は連続する2つの較正アンカーの時刻。 ΔSOC はその2点での(較正済み=信頼できる)SOC の差。
この式は「SOC が確実に分かっている2点の間で、実際に何 Ah 流れたか」を突き合わせるものです。 アンカーでない時刻の SOC は積算値であり、そこには Qeff 自身が入っています。 アンカー以外で式(6.1)を使うと、推定したい量を推定に使う循環論法になり、 どんな Qeff を入れても式が成立してしまいます(情報がゼロ)。
式(6.1)は割り算なので、相対誤差は次のように合成されます。
- 各アンカーの 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 | 最良 |
α = 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回」という運用実態から選んだ値です。
統計の原則:複数の推定値を合成するとき、最適な重みは分散の逆数 (逆分散重み付け)です。§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。良質なイベントほど強く効くが、悪い方も完全には無視しない、という設計です。
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% ずつ)。劣化は年オーダーなので、 数イベント(数週間)で追いつけば十分です。速さを犠牲にして安全を買うという明示的な選択です。
制御工学での対応物:アクチュエータのスルーレート制限そのものです。 「指令値がどれだけ飛んでも、実際に動ける速度には物理的上限がある」という考え方を、 ソフトウェアの学習ループに持ち込んでいます。
| ゲート | 条件 | 意図(これが無いと何が起きるか) |
|---|---|---|
| Δ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℃ のゲートは、この季節性の誤学習を遮断します。
SOH は仮想レジスタ 0xF022 として時系列に記録されます。日々の値は誤差を含みますが、
数か月の傾きが劣化速度そのものです。年 2〜3% の低下が一般的な LFP の目安であり、
これを大きく超える下降トレンドが見えたら、運用条件(高温での使用、深い放電の頻度)を見直す材料になります。
SOC(%)とは独立に、各系統を通った電力量(Wh)を積算します。SOC の較正やリセットの影響を受けず、 単調増加することが設計上の要件です。
物理的理由:「本日の発電量」は発電した分の合計であり、 ノイズで一瞬マイナスになった値を差し引くべきではありません。 センサーのオフセットで夜間に −3W と読めることがありますが、 これを積算すると夜のあいだ発電量が減っていくという不合理が起きます。
充放電を分けて積む理由:Pbat は双方向なので、 そのまま積算すると充電と放電が相殺され、「今日どれだけ電池を使ったか」が分からなくなります。 正負を分離して2本の単調増加量として持つことで、往復の総量(電池の稼働量)が見えます。
副作用の自覚:この切り捨てにより、微小なオフセットが積算に片側だけ入ります。 夜間 12 時間 × 3W = 36Wh 程度。日発電が 20kWh なら 0.2% で無視できますが、 センサーのオフセットが大きい機体では日発電の見かけが増えます。夜間の E_pv 増加量を見れば このオフセットを直接測れるので、診断項目として使えます。
「この日射量なら、この家の屋根はいくら発電するか」を予測します。 物理の骨格(発電は日射に比例)は固定し、比例係数 k だけを実測から同定する グレーボックス同定です。
H=日射量 [MJ/m²](Open-Meteo)、cMJ=277.8、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 の根拠 |
個別モデル化に必要なもの:パネル裏面温度センサー、方位・傾斜角の正確な値、 周囲構造物の3D形状(影の計算)、パネルの分光応答曲線。家庭にはどれも無い。
一括同定の利点:これらの積は、その設備ではほぼ一定です (季節変動はありますが、中央値を取れば代表値が出ます)。 未知パラメータを1個に絞ることで、実績3日で意味のある推定ができます。 6個の未知パラメータを個別推定しようとすれば、必要データ量は桁違いになります。
これが「汎用でない」ことの具体的な中身:汎用ツールは
PR = 0.75 のような固定値を使います。しかし北向き斜面の家、
午後に隣家の影が入る家、雪国の家では実際の PR は 0.6 にも 0.85 にもなります。
この家の k を、この家のログから決めるのが本システムの設計です。
- 破綻点(breakdown point)=推定量を無限に壊すのに必要な汚染データの割合
- 平均:0 %(1点でも異常値があれば無限に動く)
- 中央値:50 %(半数が異常でも壊れない)
- 代償 — 正規分布での相対効率:2/π ≈ 63.7 %(分散が π/2 = 1.57 倍)
- つまり中央値は、同じ精度を出すのに 約 1.57 倍のサンプルが要る
- 判断:日射→発電のデータには「雪でパネルが埋まった日」「落葉で半分隠れた日」「通信断で発電が欠測した日」が 必ず混じる。57% のサンプル効率損失より、50% の破綻点を買う方が実運用では圧倒的に得
§00 の同定式 argmin Σ ρ(残差) において、 ρ(e) = e²(二乗損失)の解が平均、 ρ(e) = |e|(絶対値損失)の解が中央値です。
二乗損失は大きな残差を2乗で罰するため、外れ値に引きずられます。 絶対値損失は残差の大きさに線形にしか反応しないため、外れ値が1点増えても 推定値は隣のデータ点まで動くだけです。中央値を使うという実装上の選択は、 損失関数の選択という理論的な判断と同じものです。
中央値の下限:中央値が意味を持つ最小サンプル数は 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 を記録して推移を追えるようにしています。
Open-Meteo の日別日射予報 Hd に同じ k を掛けて、7日分の発電量を出します。 週間カードの棒グラフはこの値を高さで表現しています。
晴れた日に午前中で満充電になると、電池がそれ以上受け取れず、インバーターは PV の出力を絞ります。 発電できたはずの電力が消える――これがカーテイルメント(出力抑制)です。 本章はこの「見えない損失」を定量化し、予測し、家電提案に変換するまでの全アルゴリズムです。
観測される PV 出力 Pi は、真のポテンシャル P*i をそのまま見せてくれません。 満充電状態では、インバーターの制御によって上から抑えられた値が観測されます。
P*=真のポテンシャル(絞られなければ出ていた電力)、 Plim=満充電時に許される上限(≈ そのときの負荷)、 G=日射強度 [W/m²]、kp=ポテンシャル係数 [m² 相当]。
推定したいもの:捨て量 W = Σ(P* − P)·Δt。 しかし P* は定義上、観測できない(絞られているから)。
循環の罠:P* を求めるには kp が要る。 kp を求めるには観測 P と日射 G の関係を見る。 しかし観測 P は絞られている。絞られたデータで係数を学習すると、 その係数は「絞られた発電」を予測するようになり、捨て量がゼロと出る。
統計学での名前:これは右側打ち切り(right-censoring)そのものです。 観測値が真値の上界でクリップされている。ナイーブな回帰は必ず下方バイアスを持ちます (計量経済学の Tobit モデルが扱う問題と同型)。
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
- 結論:捨てを検出するはずの式が、捨てを完全に隠す。しかも表示上は「捨てゼロ=優秀」に見える
確認できた事実①:晴天の春・秋(気温が低く発電効率が高い、かつ冷暖房負荷が小さい)で 最も早く満充電に到達し、打ち切り区間が最長になります。「一番発電する日に、一番捨てる」という 直感に反する構造が、ログ上で明確に確認できました。
確認できた事実②:非打ち切りサンプルは、朝方・夕方・曇天の時間帯に集中します。 つまり kp の学習データは低〜中日射域に偏る。 高日射域への外挿が必要になるため、物理の骨格が線形であること(P* = kp·G)が効きます。 黒箱モデルなら、学習していない高日射域で何を出すか保証できません。
確認できた事実③:12点という最低サンプル数は、実運用では 晴れ間のある日が数日あれば充足します。逆に真冬の連続曇天では非打ち切り点ばかりになり サンプルは潤沢ですが、そもそも捨てが発生しないので実害がありません。 係数が必要な状況と、係数が集まる状況が概ね一致しているのは幸運な性質です。
式(9.2)は比 P/G を取ります。G が小さいと分母が小さく、 比の分散が爆発します(δ(P/G)/(P/G) ≈ δG/G なので G→0 で発散)。
加えて薄明時は、日射計の値と実際のパネル面への入射に方位差による系統的なずれが出ます (太陽高度が低いと入射角の効きが大きい)。80 W/m² は概ね日の出後 30〜60 分に相当し、 それ以前を切ることで比の安定性と入射角の妥当性を同時に確保します。
物理的事実:雲の縁で太陽光が反射・集光される「クラウドエッジ効果」により、 日射計は瞬間的に 1200〜1400 W/m² を記録することがあります(STC の 1000 を超える)。
線形モデルの破綻:式 P* = kp·G をそのまま適用すると、 定格 5kW の設備が 6〜7kW を発電したことになります。物理的に不可能です (パワコンの定格、ストリングの短絡電流、いずれも上限がある)。
クリップしないと何が壊れるか:捨て量 W = P* − P が 実在しない発電分だけ水増しされます。「今日は 8kWh 捨てました」という表示が出て、 それに基づく家電提案が存在しない余剰を前提に行われる。ユーザーが従うと買電が増えます。
工学的な位置づけ:これは飽和非線形性(saturation)の明示です。 実システムは必ず有界であり、線形モデルは動作範囲の中でだけ妥当です。 範囲外に出たときに何をするかを決めておくのが、実装可能なモデルの条件です。
ログを後から走査して、実際に捨てた量を積算します。予測ではなく事後の計測なので、 実際の日射・実際の SOC を使えるぶん高精度です。
SOC は推定値であり、誤差を持ちます(§05)。SOC だけで満充電を判定すると、 SOC が 96% と誤推定されている日は捨て量が丸ごと計上されません。
一方、フロート電圧への到達はインバーターが実際に絞り始めた物理的な証拠です。 2つの独立な判定を OR で結ぶことで、どちらか一方が誤っても捨てを見逃さない構成にしています。 安全側(見逃さない側)に倒す設計です。
ここからが予測の中核です。時間別の日射予報・学習した係数・学習した負荷プロファイル・ 現在の SOC を入力に、1日の電池の動きを1時間刻みで前向きに解きます。
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 が「本日の捨て見込み」
1時間刻みのままでは「11時」としか言えませんが、その時間内での線形補間により 「11:20 頃」まで解像度を上げられます。充電電力はその1時間内でほぼ一定なので、線形補間で十分です。
翌日をシミュレーションするには、翌朝の出発点が要ります。今の SOC ではなく、 今夜の消費で下がったあとの SOC です。
省略した場合:現在 SOC 90%(夕方)をそのまま翌朝の出発点にすると、 翌朝は「ほぼ満タン」から始まるので、翌日は朝から捨てるという予測になります。
実際:夜間に照明・冷蔵庫・待機電力で 3〜5 kWh 消費すれば、 20kWh 容量なら翌朝は SOC 65〜75%。満充電到達は数時間遅れ、捨て量も大きく減ります。
誤差の大きさ:この一手間の有無で、満充電時刻が 2〜4 時間、 捨て量が 2 倍以上変わります。翌日の家電提案が「朝から回せ」なのか「昼過ぎから」なのかを分ける、 実用上きわめて大きい差です。
下限 SOCmin を置く理由:実際の運用では、SOC が下限に近づけば 商用に切り替わるか、ユーザーが消費を抑えます。無制限に引き算すると負の SOC という 非物理的な値になるため、10% 程度で下限を設けます。
予測の信頼性を理解するには、「どの入力がどれだけ効くか」を知る必要があります。 式(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 精度が支配的 | 今すぐ家電を回すかの判断 |
| 翌日 (12〜36時間先) | 式(9.10) の夜明け SOC(推定) | 時間別予報 | 夜間負荷の見積り+日射予報 | 明日の家事の段取り |
| 週間 (2〜7日先) | —(日積算のみ) | 日別予報 | 気象予報誤差が支配的 | 大きな消費の計画 |
式(9.5)の L̂h――「この家は何時に何 W 使うか」。 シミュレーションの入力のうち、唯一この家の生活そのものを表すパラメータです。
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 個の独立した推定量を持つのが最小限の構造です。
- 統計精度:中央値の標準誤差は正規近似で 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か月
① ≪ ② ≪ ③。窓長は「ノイズより十分長く、トレンドより十分短い」範囲に入っていればよく、 この条件を満たす範囲では細かい値は結果を大きく変えません。 設計の勘所は「値を当てる」ことではなく「分離が成立する範囲を確保する」ことです。
実際に混入するもの:来客のあった日、旅行で不在の日、 エアコンを終日つけた猛暑日、給湯器を追い焚きした日、通信断で負荷が 0W と記録された日。
平均を使った場合の壊れ方:1日の旅行(負荷ほぼゼロ)が 14日窓に入ると、 平均は約 7% 下がります。逆に猛暑日1日で 10% 以上上がることもある。 プロファイルが数日おきに揺れ、予測が安定しません。
中央値の挙動:14 点中 1〜2 点が外れても、中央値は 7 番目・8 番目の値の間に留まります。 7 点以上(半数)が同時に外れない限り動かない。実運用でそれは「生活が本当に変わった」場合であり、 そのときは追従すべきです。ロバスト統計は「無視すべき変化」と「追従すべき変化」を自動で切り分けます。
§09 で「今日 6.2kWh 捨てる見込み」と分かっても、それだけでは行動になりません。 「どの家電を、いつ、何台まで回せばよいか」に変換するのがこの章です。 ここは制約付き組合せ最適化の問題として定式化されます。
| 指標 | 単位 | 何を制約するか | 使い方 |
|---|---|---|---|
| 総量 Esur | Wh | その日に吸収できるエネルギーの総量 | 「エコキュート1回分は入るか」の判定 |
| ピーク Ppeak | W | 同時に出せる瞬時電力の上限 | 単体で回せる最大の機器を決める |
| 平均 Pavg | W | 継続的に使える安全側の目安 | 長時間運転する機器の判断 |
総量だけでは不十分:「6.2kWh 余る」からといって、3kW の EV 充電器を回せるとは限りません。 余剰が 1kW × 6時間 に分散していれば、3kW は一瞬たりとも太陽光でまかなえない。 差額 2kW は電池か商用から出ることになり、買電が増えます。
ピークだけでも不十分:ピークが 3kW あっても、それが 20 分だけなら エコキュート(1.5kW × 3時間 = 4.5kWh)は完走できません。
エネルギーと電力は別の制約:これは電力システムにおける 容量制約(kW)とエネルギー制約(kWh)の区別そのものです。 両方を独立に満たさなければ、提案は物理的に実行不可能になります。
xi=家電 i を回すか(0/1)、Pi=定格 [W]、 Ei=1回の運転で消費する量 [Wh]、Pinv=インバーター出力定格。
- 単体制約でふるい落とす: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 以上を保証します(最良の単品と貪欲解の良い方を取る場合)。 実際には家電数が少なく定格が離散的なため、ほぼ最適解に一致します。 厳密解に対する改善余地より、計算の透明性(なぜその提案かを説明できる)を優先しました。
閾値を 1.0(全量まかなえる)にすると: 余剰がぴったり足りる日しか提案が出ません。実運用ではほぼ何も提案されないツールになります。 予測には誤差があるため、1.0 を要求すると誤差のぶんだけ常に不足判定になります。
閾値を 0(無条件)にすると:余剰 100Wh しかなくても 4kWh の エコキュートを提案します。実質 97% を買電・電池から取るので、提案に従うと損をする。
0.5 の意味:「半分以上を太陽光でまかなえるなら、 その家電を昼に回す価値がある」という判断です。残り半分は電池から出ますが、 その電池は昼のうちに再充電される見込みがあります(まだ余剰時間帯が続くため)。 実質的な自家消費率は 50% を大きく上回るケースが多くなります。
確認可能性:提案には常に「合計 W」と「それでも残る捨て見込み」を併記します。 ユーザーは 0.5 という内部閾値を知らなくても、提案に従った場合の結果を数字で確認できます。
Ppeak は予測値である:§09 の感度解析のとおり、 日射予報・係数・SOC の誤差が乗っています。実運用での予測 RMSE は概ね ±10% 程度。
厳密に切った場合:予測ピーク 2.40kW のとき、定格 2.45kW の家電は除外されます。 しかし実際のピークが 2.6kW だったなら、それは回せた家電です。 予測誤差のせいで有用な提案を落とすことになります。
1.1 倍の意味:予測誤差の 1σ 相当を許容幅として上乗せします。 わずかに超える家電は「回せる可能性が高い」として提案に含め、 大きく超える家電(EV 充電 3.0kW vs ピーク 2.4kW = 1.25倍)は明確に除外します。
超過した場合の実害:瞬間的に不足したぶんは電池が補います。 10% の超過が数分続く程度なら、電池から数十 Wh 出るだけで、 その後の余剰で充電し直されます。非対称なリスク(見逃しの損失 > わずかな超過の損失)を 反映した非対称な閾値です。
| 内部の計算結果 | そのまま出した場合 | 実際のアナウンス |
|---|---|---|
| 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 充電は太陽光だけでは足りません。時間をずらすか夜間に」 |
右上の週間予測:棒=式(8.1)による発電予測 [kWh]、その下の「予測係数: 実績から学習(実績11日ぶん)」が §08-3 の学習状況表示です。3日を超えているので目安値ではなく実測学習に切り替わっており、 §14-2 の √n 則でいえば相対誤差はまだ 0.3 前後――「使えるが完成はしていない」段階であることが読み取れます。
右下の今日の集計:オフグリット率(今月)100% / 0%、変換ロス 77Wh、効率 75.2%(軽負荷のため低め)。 §12-1 の roff・rgrid と §12-2 の残差率がそのまま並んでいます。
最も効くのは春と秋:日射が強く、冷暖房負荷が小さいため 午前中に満充電に到達しやすい。捨てが最大になる季節に、提案の価値も最大になります。
効かないのは真夏と真冬:真夏は冷房負荷が大きく余剰が出にくい、 真冬は日射が弱く満充電に達しない。この時期は提案がほとんど出ませんが、 それが正しい挙動です(捨てていないのだから提案する必要がない)。
副次的な発見:捨て量を可視化すると、ユーザー自身が 「では給湯のタイマーを昼に変えよう」という恒久的な設定変更をするようになります。 毎日の提案より、この一度きりの設定変更のほうが年間の効果は大きい。 可視化そのものが最大の機能だった、というのが2年で得た知見です。
§07 の日次エネルギー(days)から、自給の度合いとコストを算出します。
KPI は「良い/悪い」を測るだけでなく、計測系が壊れていないかを検算する役割も持ちます。
よくある誤解:「オフグリット率 100% = 完璧」ではありません。 商用をまったく使わずに、同時に発電を大量に捨てている、という状態がありえます。
2軸で見る:
オフグリット率= 消費の側から見た自立度(買電に頼らなかったか)
自家消費率= 発電の側から見た有効利用度(作った電気を使い切れたか)
4象限: 両方高い=理想(発電を使い切り、買電もゼロ)。 オフグリット高・自家消費低=捨てている(→ §11 の提案が効く状況)。 オフグリット低・自家消費高=発電容量不足(設備増設の検討材料)。 両方低い=設備か運用に問題あり。
だから両方表示する:片方だけでは改善の方向が分からない。 2つの KPI を並べることで、次に何をすべきかが決まります。
理論値:インバーターの変換効率が 93〜95% なら、残差率は 5〜7%。 軽負荷時は待機電力の比率が上がって 10〜15% まで上昇します。
18% を超えたら:もはや変換効率では説明できません。原因の候補は――
・レジスタの倍率設定ミス(×0.1 と ×1 の取り違え)
・PV2 非対応機での PV_W_SCALE の設定誤り
・相の取りこぼし(負荷 C 相を読んでいない)
・電流センサーの大きなオフセット
なぜこの指標が要るのか:個々のセンサーは単独では検証できません。 4系統が同時に整合するかどうかという横断的な条件だけが、 「どれか1つがおかしい」ことを検出できます。化学プラントの物質収支突合、 会計の複式簿記と同じ、冗長な関係式による誤り検出です。
「モデルが予測した値」と「実際に観測された値」の差=残差を監視します。 残差が説明できないほど大きいとき、モデルか設備のどちらかに問題があります。
重要なのは第2項 Λ cj(前提条件の連言)です。条件を付けずに残差だけを見ると、 正常な理由で残差が大きくなる状況まで異常と判定してしまいます。
条件① 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系統の脱落、著しい汚れ・積雪
| 検知 | 残差の定義 | 前提条件 | しきい値 | 示唆される原因 |
|---|---|---|---|---|
| 発電性能の低下 | Pobs/P* | 好天 かつ 非満充電 | < 0.65 | 汚れ・影・積雪・ストリング脱落・故障 |
| 収支異常 | Eloss/Ein | —(常時) | |·| > 18 % | 倍率設定ミス・相の取りこぼし・センサー異常 |
| いま絞り中 | — | 満充電 かつ 余剰あり | — | 異常ではない。余剰活用の案内トリガー |
| SOC 信頼度の低下 | 較正からの経過時間 | — | > 72 h | 満充電に到達できていない(曇天が続く・容量設定が過大) |
| 積算の欠損 | Δt > 30s の発生率 | — | — | 通信品質・PC のスリープ設定 |
「データが溜まると精度が上がる」を、どれだけ・どの速さで・どこまで上がるのかを数式で示します。 誇張せず、上がらないものは上がらないと明示します。
発電予測の誤差は、独立な2つの成分に分解できます。
| 成分 | 正体 | 大きさ(目安) | 学習で減るか |
|---|---|---|---|
| σparam パラメータ誤差 | k・kp・L̂h・Qeff の推定誤差 | 初期 15〜25 % 収束後 2〜4 % | 減る(1/√n) |
| σinput 入力誤差 | 日射予報の外れ(気象庁・Open-Meteo の精度) | 翌日 10〜20 % 3日後 25〜40 % | 減らない |
| (構造誤差) | 線形モデルで表せない部分(部分影の非線形性など) | 3〜8 % | 減らない |
係数 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回観測。季節依存も同定可能 |
| 発電係数 k | 3日で切替、以降 1/√n |
| ポテンシャル係数 kp | 12点以上で学習開始 |
| 負荷プロファイル | 14日で一巡・安定 |
| 実効容量 Qeff | 大きな充放電のたび |
| SOC の実態一致度 | Qeff の改善に連動 |
| 捨て量・満充電時刻 | 上記すべての合成 |
| 天気予報そのもの | 外部(気象庁・Open-Meteo)の精度 |
| リアルタイム実測 | センサーの生値。学習と無関係 |
| 商用(買電)の実測 | 専用の学習なし。計算値 |
| 突発的な負荷 | 来客・臨時の家電。原理的に予測不能 |
| ハードウェアの精度 | A/D 分解能・センサー確度 |
| 仮想レジスタ | 記録内容 | 後から何が分かるか |
|---|---|---|
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回の改修を安全に進められたのは、この「学習の履歴」があったからです。
本システムに散らばっているガードは、実は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) | 単独では検証できないセンサー異常・設定ミス |
技法 5・6・そして負荷プロファイルの窓長設計は、すべて同じ問いに答えています。 「どのくらいの速さの変化を、信号として拾い、どのくらいを雑音として捨てるか」。
| 対象 | τnoise(捨てたい) | τfilter(設計値) | τsignal(拾いたい) |
|---|---|---|---|
| 実効容量 | 1イベントの推定誤差 | EMA 3.5イベント ≒ 2–3週 | 電池の劣化(年オーダー) |
| 負荷プロファイル | 日々の変動(1日) | 窓 14日 | 季節変化(1–3か月) |
| 発電係数 k | 雲・汚れの日変動 | 全期間中央値 | 季節・経年劣化 |
| SOC 積算 | 電流ノイズ(5秒) | 積算そのもの | 実際の充放電 |
| 判断 | 2つの誤り | どちらを重く見るか | 実装 |
|---|---|---|---|
| SOC 表示 | 過大表示 / 過小表示 | 過大表示が危険(急に落ちる・過放電) | ηchg=0.99 で保守的に、表示 SOC で下限マージン |
| 捨て量の検出 | 見逃し / 過検出 | 見逃しが問題(改善の機会を失う) | 満充電判定を SOC OR 電圧の冗長条件に |
| 家電提案 | 提案しすぎ / 提案しなさすぎ | 提案しなさすぎが問題(ツールの意味が消える) | 閾値 0.5、単体制約 1.1倍で幅を持たせる |
| 容量学習 | 追従が遅い / 誤学習 | 誤学習が致命的(SOC 全体が狂う) | ゲート+クランプ+EMA の三重防御 |
| 異常検知 | 見逃し / 誤警報 | 誤警報が問題(通知が無視される) | 3.5σ の厳しいしきい値+前提条件 |
項目ごとに「安全側」の向きが違います。SOC は過小表示が安全ですが、 捨て量は過検出(多めに出す)が安全、異常検知は逆に見逃し側が安全(誤警報を嫌う)。
「保守的に作る」という一言では設計できません。その判断で誤ったとき、 ユーザーが何を失うかを個別に考え、損失の大きい側を避けるように非対称なしきい値を置く。 これが 137 回の改修で繰り返してきた作業の実体です。
本システムの各アルゴリズムが、産業・学術のどの技術に対応するかを示します。 「家庭用に独自実装した」のではなく、確立された手法を家庭用の制約下で再構成したことの確認です。
| 本システムの実装 | 産業・学術での対応物 | 使われている分野 | 家庭用向けの簡略化 |
|---|---|---|---|
| クーロン積算+端点較正(§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) | 特異摂動法/スケール分離 | 制御理論全般 | 理論的な分離条件の検証を、経験的な不等式の確認で代替 |
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)。 根拠のない定数は、後から誰も(自分でも)触れなくなります。
本システムに現れる全定数を、「なぜその値か」と一緒に並べます。 根拠のない定数はマジックナンバーであり、後から誰も触れなくなります。
| 定数 | 値 | 決定根拠 | 変更時の影響 |
|---|---|---|---|
| 直列数 | 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%)より手前で警告を出すための余裕 | 使用可能時間の表示 |
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| 最小 Δ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 |
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| 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 負荷を抑制 | — |
| 定数 | 値 | 決定根拠 | 参照 |
|---|---|---|---|
| 家電の採用閾値 | 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・インバーター定格・電気単価。
これらはこの設備に固有の値であり、学習では決まりません(原則②の適用範囲外)。
残りの定数は設備が変わっても概ねそのまま使えます。
計算が正しいことは、どうやって確かめるのか。137回の改修で確立した検証手順を、 誰でも再現できる形で記します。
| 検算 | 成立すべき関係 | 許容範囲 | 破れたときの示唆 |
|---|---|---|---|
| 瞬時のエネルギー保存 | 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 センサーのオフセット |
| 学習値 | 期待される範囲 | 範囲外なら疑うこと |
|---|---|---|
| 発電係数 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 % | 急降下 → 誤学習の可能性が高い(実劣化がこの速さで進むことは稀) |
- 満充電較正が入った時刻を記録(SOC = 100% が確定した点)
- そこから意図的に大きく放電し、次の満充電まで運転する
- その区間で流れた電荷 ΔAh をログから積算
- Q = ΔAh / (ΔSOC/100) を手計算し、システムの Qeff と比較
- 差が 10% 以内なら健全。超えるならゲート条件・電流スケールを確認
- 晴天日の午前中、満充電到達前の時刻で P_obs / G を数点手計算
- それらの中央値がシステムの kp と一致するか確認
- 満充電到達後、大きな家電を1つ入れる(例:エコキュート 1.5kW)
- PV 出力が家電のぶんだけ増えれば、その時刻に確かに絞られていた証拠
- 増えた量が予測捨て量と整合するか確認
方法:保存した1分平均ログ(samples_1m)を入力として、
改修前後のロジックを同じデータで再実行し、出力(SOC・捨て量・予測)を比較します。
なぜこれが可能か:本システムの計算は決定論的だからです。 乱数も外部状態も使わないため、同じ入力からは必ず同じ出力が出ます。 ログさえあれば、任意の過去の日を何度でも再現できます。
検証すべき代表日:晴天日(捨てが出る)/曇天日(学習ゲートが働かない)/ 通信断のあった日(Δt ゲート)/満充電に達しなかった日(較正なし)/ 冬の低温日(温度ゲート)。これらを「回帰テストのデータセット」として固定し、 改修のたびに全部を通します。
効果:「新しい失敗モードを直したら、昔直した失敗モードが復活した」という 最も消耗するパターンを防げます。2年・137回の改修を進められた実務上の基盤がこれでした。
計算がどれだけ正確でも、見たいときに見られなければ運用は変わりません。 本システムは HTML 単体で完結する構成を選び、独自URLを発行することで PC・スマートフォン・タブレットのどこからでも同じ解析結果を参照できます。
| 選択肢 | 利点 | この用途での問題 | 採否 |
|---|---|---|---|
| ネイティブアプリ (iOS/Android) | 動作が軽い・通知が強い | OS ごとに開発が必要。ストア審査。ロジック変更のたびに配布し直し(137回の改修とは相性が最悪) | 不採用 |
| デスクトップ専用GUI | 実機との接続が素直 | その PC の前でしか見られない。外出先で残量が分からない | 不採用 |
| HTML + URL 発行 | 全デバイス共通。更新が即時反映。インストール不要 | ネットワーク到達性の確保が必要 | 採用 |
見落とされがちな点:ロジックを頻繁に改修する開発では、 配信形式が開発速度を直接決めます。ネイティブアプリなら、 137回の改修は137回のビルド・配布・更新待ちを意味します。
HTML の決定的な利点:本体側のファイルを差し替えれば、 次にユーザーがページを開いた瞬間に新ロジックが動きます。 改修のサイクルタイムが「分」単位になる。これが2年で137回という 改修回数を可能にした実務上の条件でした。
副次的な利点:本書のような技術文書も同じ HTML で書けるため、 ロジックとドキュメントを同じ形式で並べられます。式の変更とその説明の更新が乖離しません。
Modbus RTU / data.db3
SQLite へ記録・重い計算
URL を発行
ブラウザで同一URLを開く
同じ URL をスマートフォンで開いたときの表示です。PC 版とまったく同じ計算結果を、 縦画面に合わせて並べ替えています。
値は PC 版と完全に一致します(消費 236W・バッテリー −434W・ロス 198W・SOC 67%)。 §20-2 のとおり計算は本体 PC で1回だけ行い、端末は描画のみを担当しているためです。 端末側で再計算する構成にすると、丸めやタイミングの差で「スマホと PC で残量が違う」という 信頼を損なう事態が起きます。
| 要件 | 理由 | 実装方針 |
|---|---|---|
| 単一の真実源 (Single Source of Truth) | 端末ごとに計算すると値がずれ、信頼が崩れる | 積算・学習は本体側で一元化。端末は描画のみ |
| レスポンシブ | スマホの縦画面とPCの横画面では、読める情報量が違う | 画面幅でレイアウトを切替。重要度の高いカードを上に |
| 低帯域で動く | 外出先のモバイル回線を想定 | 必要な集計値だけを JSON で送る(生ログは送らない) |
| オフライン耐性 | 接続が切れても直前の値は見たい | 直近値をブラウザ側に保持し、鮮度(何分前の値か)を明示 |
| URL の限定公開 | 自宅の電力消費パターンは生活パターンそのもの | 推測困難なパスを発行し、URL を知る人だけがアクセスできる形にする |
最も使うのはスマートフォン:外出先で「今日は満充電になったか」「捨てていないか」を 確認し、帰宅前に家電のタイマーを決める、という使い方が定着しました。 PC の前でしか見られない構成だったら、この使い方は生まれていません。
タブレットは据置きダッシュボードとして:常時表示しておくと、 家族が「今は電気が余っている/足りない」を意識するようになります。 可視化が行動を変えるという §11-5 の知見は、この据置き表示で最も強く現れました。
設計判断の答え合わせ:「計算は1か所、表示は多数」という構成にしたことで、 137回の改修すべてが全デバイスに同時に反映されました。 端末ごとにロジックを持っていたら、バージョン差による数値の食い違いの調査に 改修と同じだけの時間を取られていたはずです。
本書に登場した全数式を、番号・意図・参照先とともに1か所にまとめます。 実装を読むとき、この表から該当節へ戻れるようにしてあります。
2年間の連続実測データと 137回の改修に基づく、計算ロジックの数式・定数・設計根拠の技術文書。
数値は実装(
src/app.py / src/web/index.html)を反映します。設備構成の変更時はコード側の定数が優先されます。
