Consigne reseau : la part voiture suit la puissance reelle quand la voiture plafonne (boost Volvo du 14/10 : batterie rechargee en HP)
This commit is contained in:
@@ -438,8 +438,28 @@ const dvccChargeLimitW =
|
||||
// l'existant, jamais pire.
|
||||
const setpointFromBalance = balanceUsableForSetpoint && dvccChargeLimitW !== null;
|
||||
|
||||
// 14/10/2026 : la part voiture suit ce que la voiture PREND quand elle plafonne
|
||||
// sous la consigne. Boost EDF de la Volvo XC90 T8 (invite) : consigne borne
|
||||
// 28 A, la voiture ne prend que 3,7 kW (chargeur embarque). La part valait
|
||||
// 28 A x 230 V = 6,4 kW : les 2,7 kW de trop ont recharge la batterie maison
|
||||
// en HEURES PLEINES (2,81 kWh de 20:09 a 22:01, batterie +30 A a SOC 86 %).
|
||||
// Voiture plafonnee = puissance reelle franchement sous la consigne (2 A de
|
||||
// tolerance de mesure) : la part vaut alors la puissance reelle ; la marge
|
||||
// d'un pas de courant (gridSetpointSlackW) laisse la voiture remonter. Sinon
|
||||
// (rampe en cours, voiture qui suit la consigne) : plafond de borne, inchange.
|
||||
const EVCS_SATURATION_TOLERANCE_A = 2;
|
||||
const evcsCommandW = Number.isFinite(derived.currentReferenceA)
|
||||
? derived.currentReferenceA * derived.acVoltageRef
|
||||
: null;
|
||||
const evcsCarSaturated =
|
||||
parsed.evcsVehicleConnected &&
|
||||
evcsCommandW !== null &&
|
||||
parsed.evcsAcPowerW >= params.currentMinA * derived.acVoltageRef * 0.5 &&
|
||||
parsed.evcsAcPowerW < evcsCommandW - EVCS_SATURATION_TOLERANCE_A * derived.acVoltageRef;
|
||||
const evcsSetpointShareW = parsed.evcsVehicleConnected
|
||||
? derived.physicalCapA * derived.acVoltageRef
|
||||
? (evcsCarSaturated
|
||||
? Math.min(derived.physicalCapA * derived.acVoltageRef, parsed.evcsAcPowerW)
|
||||
: derived.physicalCapA * derived.acVoltageRef)
|
||||
: 0;
|
||||
|
||||
// Recharger la batterie sur le reseau n'a de sens economique QUE dans une
|
||||
|
||||
217
tests/golden/fixtures/volvo-1410-2040.json
Normal file
217
tests/golden/fixtures/volvo-1410-2040.json
Normal file
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"ac_loads_max_safe_w": "9000.0",
|
||||
"acin1_last_changed_ts": 1792001345.162854,
|
||||
"afternoon_battery_max_discharge_a": "unknown",
|
||||
"afternoon_probe_pv_avg_min_w": "1000.0",
|
||||
"afternoon_probe_soc_min": "85.0",
|
||||
"allow_grid_departure_urgent": "off",
|
||||
"allow_grid_hc_midday": "on",
|
||||
"allow_grid_hc_night": "on",
|
||||
"balance_ecs_nuit": "off",
|
||||
"balance_energy_to_cover_kwh": "12.46",
|
||||
"balance_grid_energy_needed_kwh": "0.0",
|
||||
"balance_last_run": "14/10 20:35",
|
||||
"balance_night_vehicle_budget_kwh": "0.0",
|
||||
"balance_required_soc": "63.5",
|
||||
"balance_required_soc_prudent": "82.2",
|
||||
"balance_status": "ok",
|
||||
"balance_vehicle_grid_needed": "off",
|
||||
"base_load_remaining_kwh": "2.2",
|
||||
"batt_charge_reserve_25_40_a": "110.0",
|
||||
"batt_charge_reserve_40_60_a": "70.0",
|
||||
"batt_charge_reserve_60_80_a": "40.0",
|
||||
"batt_charge_reserve_80_90_a": "10.0",
|
||||
"batt_charge_reserve_gt90_a": "5.0",
|
||||
"batt_charge_reserve_lt25_a": "150.0",
|
||||
"batt_discharge_hard_25_40_a": "-15.0",
|
||||
"batt_discharge_hard_40_60_a": "-30.0",
|
||||
"batt_discharge_hard_60_80_a": "-50.0",
|
||||
"batt_discharge_hard_80_90_a": "-80.0",
|
||||
"batt_discharge_hard_gt90_a": "-100.0",
|
||||
"batt_discharge_hard_lt25_a": "-8.0",
|
||||
"batt_discharge_soft_25_40_a": "-5.0",
|
||||
"batt_discharge_soft_40_60_a": "-15.0",
|
||||
"batt_discharge_soft_60_80_a": "-20.0",
|
||||
"batt_discharge_soft_80_90_a": "-40.0",
|
||||
"batt_discharge_soft_gt90_a": "-50.0",
|
||||
"batt_discharge_soft_lt25_a": "-3.0",
|
||||
"batt_hard_tol_25_40_sec": "5.0",
|
||||
"batt_hard_tol_40_60_sec": "10.0",
|
||||
"batt_hard_tol_60_80_sec": "15.0",
|
||||
"batt_hard_tol_80_90_sec": "20.0",
|
||||
"batt_hard_tol_gt90_sec": "20.0",
|
||||
"batt_hard_tol_lt25_sec": "2.0",
|
||||
"batt_recovery_25_40_min": "12.0",
|
||||
"batt_recovery_40_60_min": "10.0",
|
||||
"batt_recovery_60_80_min": "8.0",
|
||||
"batt_recovery_80_90_min": "6.0",
|
||||
"batt_recovery_gt90_min": "6.0",
|
||||
"batt_recovery_lt25_min": "15.0",
|
||||
"batt_soft_tol_25_40_min": "2.0",
|
||||
"batt_soft_tol_40_60_min": "4.0",
|
||||
"batt_soft_tol_60_80_min": "6.0",
|
||||
"batt_soft_tol_80_90_min": "10.0",
|
||||
"batt_soft_tol_gt90_min": "12.0",
|
||||
"batt_soft_tol_lt25_min": "1.0",
|
||||
"battery_current_a": "31.600000381469727",
|
||||
"battery_discharge_hard_a": "-25.0",
|
||||
"battery_discharge_soft_a": "0.0",
|
||||
"battery_full_forecast_min_kwh": "4.5",
|
||||
"battery_full_soc": "90.0",
|
||||
"battery_neutral_band_a": "0.0",
|
||||
"battery_reserve_up_a": "8.0",
|
||||
"battery_soft_breach_at": "",
|
||||
"blocked_until": "2026-10-14 20:39:30",
|
||||
"bms_max_charge_current_a": "250.0",
|
||||
"bms_max_discharge_current_a": "250.0",
|
||||
"budget_remaining_kwh": "-13.6",
|
||||
"charge_permission_now": "on",
|
||||
"cloud_debt_kwh": "0.0",
|
||||
"cloud_debt_max_kwh": "1.2",
|
||||
"cloud_debt_started_at": "2026-10-14 16:03:00",
|
||||
"cloud_tolerance_minutes": "20.0",
|
||||
"control_latch": "on",
|
||||
"controller_enabled": "on",
|
||||
"current_change_cooldown_seconds": "30.0",
|
||||
"current_max_auto_a": "28.0",
|
||||
"current_min_a": "6.0",
|
||||
"current_step_down_a": "2.0",
|
||||
"current_step_up_a": "1.0",
|
||||
"day_start_time": "08:30:00",
|
||||
"day_stop_time": "20:15:00",
|
||||
"departure_day_ok": "on",
|
||||
"departure_priority_enabled": "on",
|
||||
"departure_time": "08:50:00",
|
||||
"departure_time_jeep": "06:30:00",
|
||||
"departure_time_zero": "08:50:00",
|
||||
"dvcc_max_charge_current_a": "30",
|
||||
"end_of_day_soc_guard": "85.0",
|
||||
"end_of_day_soc_target": "85.0",
|
||||
"evcs_ac_power_w": "3726.0",
|
||||
"evcs_auto_start_switch": "off",
|
||||
"evcs_charging_switch": "on",
|
||||
"evcs_charging_time": "29m 25s",
|
||||
"evcs_command_current_a": "28",
|
||||
"evcs_current_a": "28.0",
|
||||
"evcs_delivery_noise_ema": "0.003",
|
||||
"evcs_delivery_ratio_ema": "0.999",
|
||||
"evcs_device_connected": "on",
|
||||
"evcs_mode_fallback": "unknown",
|
||||
"evcs_mode_sensor": "Manuel",
|
||||
"evcs_night_session_start_at": "",
|
||||
"evcs_night_session_start_soc": "",
|
||||
"evcs_no_demand_filter_eval_at": "2026-10-14 20:39:30",
|
||||
"evcs_no_demand_score_ema": "0.001",
|
||||
"evcs_no_demand_semantic_active": "off",
|
||||
"evcs_no_demand_since_at": "2026-08-23 15:29:30",
|
||||
"evcs_priority_manual_mode": "normal",
|
||||
"evcs_priority_manual_override": "off",
|
||||
"evcs_priority_manual_reason": "unknown",
|
||||
"evcs_priority_manual_until": "2026-04-14 00:00:00",
|
||||
"evcs_session_energy_kwh": "1.6",
|
||||
"evcs_set_current_a": "28",
|
||||
"evcs_status_raw": "2",
|
||||
"evcs_total_energy_kwh": "4144.0",
|
||||
"evcs_vehicle": "VW",
|
||||
"evcs_vehicle_connected": "on",
|
||||
"evcs_vehicle_connected_ts": 1792001026.503855,
|
||||
"evening_battery_max_discharge_a": "-30.0",
|
||||
"evening_soc_start_min": "85.0",
|
||||
"evening_soc_stop_min": "80.0",
|
||||
"evening_start_time": "17:00:00",
|
||||
"evening_stop_time": "20:30:00",
|
||||
"flexible_safety_margin_kwh": "0.9",
|
||||
"force_mode_auto_revert_minutes": "120.0",
|
||||
"forecast_commit_min_kwh": "10.0",
|
||||
"forecast_commit_soc_floor": "35.0",
|
||||
"forecast_mode_enabled": "off",
|
||||
"grid_battery_hard_a": "-20.0",
|
||||
"grid_battery_soft_a": "-10.0",
|
||||
"grid_current_max_a": "28.0",
|
||||
"grid_power_w": "6279.0",
|
||||
"grid_setpoint_idle_w": "unknown",
|
||||
"grid_setpoint_w": "7777",
|
||||
"grid_settle_seconds": "unknown",
|
||||
"grid_state": "on",
|
||||
"grid_switch_last_changed_ts": 1792001344.316242,
|
||||
"hard_stop_enabled": "on",
|
||||
"hc_midday_start_time": "12:24:00",
|
||||
"hc_midday_stop_time": "14:24:00",
|
||||
"hc_night_start_time": "01:24:00",
|
||||
"hc_night_stop_time": "07:24:00",
|
||||
"house_ac_headroom_w": "5000.0",
|
||||
"house_ac_power_prev_w": "4572.0",
|
||||
"house_ac_power_w": "4572.0",
|
||||
"house_spike_grace_minutes": "10.0",
|
||||
"last_block_reason": "none",
|
||||
"last_current_change_at": "2026-10-14 20:32:30",
|
||||
"last_signature": "charging_hold_grid|profile=outside_window|source=grid_forced|chg=1|perm=1|l=1|cur=28|block=none|stop=0|prio=1|night=0|ntrg=63.5|nurg=0|vdf=0|vdfs=0.001",
|
||||
"last_start_at": "2026-10-14 20:10:30",
|
||||
"last_stop_at": "2026-10-14 16:33:00",
|
||||
"midday_battery_max_discharge_a": "-40.0",
|
||||
"midday_probe_pv_avg_min_w": "0.0",
|
||||
"midday_soc_min": "75.0",
|
||||
"min_run_minutes": "29.0",
|
||||
"min_stop_minutes": "0.0",
|
||||
"modules_en_service": "13.0",
|
||||
"morning_battery_max_discharge_a": "-20.0",
|
||||
"morning_probe_pv_avg_min_w": "1500.0",
|
||||
"morning_probe_pv_trend_min_w": "-2000.0",
|
||||
"morning_soc_min": "35.0",
|
||||
"morning_start_time": "07:30:00",
|
||||
"morning_stop_time": "11:00:00",
|
||||
"mppt_operation_modes": "off,off,off,off,off,off,off",
|
||||
"night_battery_charge_enabled": "on",
|
||||
"night_battery_done_prev": "off",
|
||||
"night_budget_prev": "",
|
||||
"night_charge_mode": "sans_edf",
|
||||
"night_grid_session_committed_prev": "off",
|
||||
"night_takeover_prev": "off",
|
||||
"notifications_enabled": "on",
|
||||
"operating_mode_helper": "outside_window",
|
||||
"overload_hold_seconds": "30.0",
|
||||
"overload_step_down_a": "2.0",
|
||||
"overload_stop_after_seconds": "120.0",
|
||||
"prev_surplus_state": "charging_hold_grid",
|
||||
"probe_current_a": "6.0",
|
||||
"probe_enabled": "on",
|
||||
"probe_minutes": "3.0",
|
||||
"probe_retry_minutes": "45.0",
|
||||
"probe_started_at": "2026-03-31 00:00:00",
|
||||
"projected_end_soc_after_charge": "41.7",
|
||||
"pv_hold_min_w": "500.0",
|
||||
"pv_power_10m_avg_w": "2",
|
||||
"pv_power_w": "0.0",
|
||||
"pv_start_min_w": "700.0",
|
||||
"pv_trend_w": "unknown",
|
||||
"required_energy_kwh": "10.5",
|
||||
"reset_borne": "off",
|
||||
"soc_comfort_target": "85.0",
|
||||
"soc_percent": "87.0",
|
||||
"soc_start_min": "80.0",
|
||||
"soc_stop_min": "29.0",
|
||||
"solar_potential_grace_minutes": "12.0",
|
||||
"step_down_cooldown_seconds": "60.0",
|
||||
"step_up_cooldown_seconds": "30.0",
|
||||
"target_current_auto_a": "28.0",
|
||||
"today_remaining_kwh": "0.0",
|
||||
"tomorrow_kwh": "29.504",
|
||||
"vebus_ac_out_l1_current_a": "22.540000915527344",
|
||||
"vebus_ac_out_l1_power_w": "4585",
|
||||
"vebus_ac_out_l1_voltage_v": "222.69000244140625",
|
||||
"vebus_dc_current_a": "31.600000381469727",
|
||||
"vebus_dc_power_w": "1692.0",
|
||||
"vebus_dc_voltage_v": "50.400001525878906",
|
||||
"vebus_l1_low_battery": "off",
|
||||
"vebus_l1_overload": "off",
|
||||
"vebus_low_battery": "off",
|
||||
"vebus_main_state": "9",
|
||||
"vebus_overload": "off",
|
||||
"vebus_state": "4",
|
||||
"vehicle_capacity_kwh": "7.7",
|
||||
"vehicle_delivered_since_level_kwh": 1.6000000000003638,
|
||||
"vehicle_level_pct": "20.0",
|
||||
"vehicle_level_valid": true,
|
||||
"victron_acin1_available": "1",
|
||||
"victron_evcs_strategy": "force_grid_now"
|
||||
}
|
||||
@@ -184,6 +184,13 @@ for (const sc of scenarios) {
|
||||
|
||||
const diffs = [];
|
||||
for (const [k, v] of Object.entries(sc.expect || {})) {
|
||||
// 14/10/2026 : bornes sur la consigne reseau ecrite ce cycle.
|
||||
if (k === 'gridSetpointBelowW' || k === 'gridSetpointAtLeastW') {
|
||||
const w = got.gridSetpointW;
|
||||
const ok = Number.isFinite(w) && (k === 'gridSetpointBelowW' ? w < v : w >= v);
|
||||
if (!ok) diffs.push(`${k}: attendu ${k === 'gridSetpointBelowW' ? '<' : '>='} ${v}, obtenu ${JSON.stringify(w)}`);
|
||||
continue;
|
||||
}
|
||||
if (JSON.stringify(got[k]) !== JSON.stringify(v)) diffs.push(`${k}: attendu ${JSON.stringify(v)}, obtenu ${JSON.stringify(got[k])}`);
|
||||
}
|
||||
if (diffs.length) {
|
||||
|
||||
@@ -59,6 +59,9 @@ const VW_1210 = JSON.parse(readFileSync(new URL('./fixtures/vw-1210-1638.json',
|
||||
// Releve reel du 14/10 12:57:30 (entree de INPUT_PARSE) : JEEP branchee 12:55:22, 51 % par Uconnect,
|
||||
// 1,5 min de charge a 8 A puis interruption ; statut 3, energie de session affichee 0,0 kWh.
|
||||
const JEEP_1410 = JSON.parse(readFileSync(new URL('./fixtures/jeep-1410-1257.json', import.meta.url), 'utf8'));
|
||||
// Releve reel du 14/10 20:40:00 : boost EDF (force_grid_now) de la Volvo XC90 T8 invitee, consigne 28 A,
|
||||
// la voiture ne prend que 3,7 kW ; consigne reseau ecrite 7304 W, batterie maison +31,6 A en heures pleines.
|
||||
const VOLVO_1410 = JSON.parse(readFileSync(new URL('./fixtures/volvo-1410-2040.json', import.meta.url), 'utf8'));
|
||||
|
||||
export const scenarios = [
|
||||
|
||||
@@ -3632,4 +3635,20 @@ export const scenarios = [
|
||||
overrides: { ...JEEP_1410, vehicle_level_pct: '90.0', vehicle_level_valid: true, vehicle_capacity_kwh: '10.0', vehicle_delivered_since_level_kwh: 0.7 },
|
||||
expect: { state: 'day_vehicle_full_idle' },
|
||||
},
|
||||
{
|
||||
id: 'volvo-1410-boost-edf-ne-recharge-pas-la-batterie-en-hp',
|
||||
label: 'RELEVE 14/10 20:40 — boost EDF, voiture plafonnee a 3,7 kW sous 28 A : la consigne suit la voiture, pas la borne',
|
||||
time: '2026-10-14T20:40:00+02:00',
|
||||
overrides: { ...VOLVO_1410 },
|
||||
// Ancien code : 7304 W (la valeur reellement ecrite ce soir-la) ; maison ~840 + voiture 3726 + un pas.
|
||||
expect: { gridSetpointW: 4795, gridSetpointBelowW: 5500 },
|
||||
},
|
||||
{
|
||||
id: 'volvo-1410-temoin-voiture-qui-suit-la-consigne',
|
||||
label: 'temoin — meme releve, la voiture prend ses 28 A (6,4 kW) : plafond de borne, comme avant',
|
||||
time: '2026-10-14T20:40:00+02:00',
|
||||
overrides: { ...VOLVO_1410, evcs_ac_power_w: '6420.0' },
|
||||
// Identique a l'ancien code (6458 W).
|
||||
expect: { gridSetpointW: 6458 },
|
||||
},
|
||||
];
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user