Le 07/09 a 14:28:18 la borne a declare le statut 3 apres 2 min 42 s de charge et 0,10 kWh livre. Le controleur l'a cru, a latche day_vehicle_full_idle, et la JEEP est restee immobile deux heures en plein soleil alors qu'elle pouvait charger : elle a repris a 16:30 et tenu. La premiere idee etait de distinguer une vraie fin de charge d'une interruption par la forme de la coupure. La mesure a la seconde l'a tuee : les deux courbes sont superposables (VW 06/09, vraie fin : 1534 -> 550 -> 82 -> 11 -> 0 W ; JEEP 07/09, faux positif : 1626 -> 741 -> 100 -> 13 -> 0 W). Aucun signal electrique instantane ne separe les deux cas. Seule la duree de session les distingue, et le systeme porte deja la grandeur qui dit ce qu'est une charge etablie : min_run_minutes, 29 min en production. Trois formes de "charged", une seule est refusee : energie de session nulle -> vehicule plein a l'arrivee, on latche (P10) energie > 0, session < min_run -> charge INTERROMPUE, on ne latche pas energie > 0, session >= min_run -> charge menee a terme, on latche Aucune constante nouvelle. Pas d'oscillateur : une session interrompue redemarre a energie nulle, donc un second "charged" immediat retombe dans le premier cas et latche. Confirmation independante le meme jour : Uconnect a envoye a 14:29 un courriel "RECHARGE ELECTRIQUE INTERROMPUE" invitant a controler la borne et le connecteur. Le vehicule qualifie donc l'evenement d'interruption. Le releve de la boite montre que c'est chronique depuis au moins decembre 2025 (12 interruptions et 6 echecs entre le 31/12 et le 08/03) : nos automates n'ont pas cree le defaut, ils en ont augmente le cout. Golden 80 -> 84, dont le releve reel et ses deux contrefactuels (duree et energie). Trois mutations tombent chacune sur un jeu different ; celle qui rend le cas "energie nulle" non credible fait echouer trois scenarios existants (P10, Fix D, Fix E). Corrige au passage le HANDOFF du 06/09 : last_session_energy ne decrit pas la derniere session terminee, il suit la session en cours (verifie dans InfluxDB). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
244 lines
16 KiB
Smarty
244 lines
16 KiB
Smarty
{{ {
|
|
"soc_percent": states("sensor.victron_battery_soc"),
|
|
"battery_current_a": states("sensor.victron_battery_current"),
|
|
|
|
"pv_power_w": states("sensor.victron_pv_power_system"),
|
|
"pv_power_10m_avg_w": states("sensor.victron_pv_power_10m_avg"),
|
|
"pv_trend_w": states("sensor.victron_pv_power_trend_w"),
|
|
|
|
"mppt_operation_modes": states.sensor
|
|
| selectattr('entity_id','search','mppt')
|
|
| selectattr('entity_id','search','operation_mode')
|
|
| map(attribute='state') | join(','),
|
|
|
|
"house_ac_power_w": states("sensor.victron_consumption_power_l1"),
|
|
"house_ac_power_prev_w": states("sensor.victron_consumption_power_l1"),
|
|
|
|
"grid_power_w": states("sensor.victron_grid_power_l1"),
|
|
"grid_state": states("switch.edf_general_ok_switch"),
|
|
"victron_acin1_available": states("sensor.victron_ac_in1_available"),
|
|
|
|
|
|
"acin1_last_changed_ts": as_timestamp(states.sensor.victron_ac_in1_available.last_changed, 0) if states.sensor.victron_ac_in1_available is not none else 0,
|
|
"grid_switch_last_changed_ts": as_timestamp(states.switch.edf_general_ok_switch.last_changed, 0) if states.switch.edf_general_ok_switch is not none else 0,
|
|
"grid_settle_seconds": states("input_number.evcs_grid_settle_seconds"),
|
|
"grid_setpoint_w": states("number.gx_device_ac_power_setpoint"),
|
|
"grid_setpoint_idle_w": states("input_number.evcs_grid_setpoint_idle_w"),
|
|
|
|
"today_remaining_kwh": states("sensor.energy_production_today_remaining"),
|
|
"tomorrow_kwh": states("sensor.energy_production_tomorrow"),
|
|
|
|
"evcs_device_connected": states("binary_sensor.victron_evcs_device_connected"),
|
|
"evcs_vehicle_connected": states("binary_sensor.victron_evcs_vehicle_connected"),
|
|
"evcs_status_raw": states("sensor.victron_evcs_status_raw"),
|
|
"evcs_mode_sensor": states("sensor.victron_evcs_mode"),
|
|
"evcs_mode_fallback": states("input_text.sensor_victron_evcs_mode"),
|
|
"evcs_set_current_a": states("sensor.victron_evcs_set_current"),
|
|
"evcs_command_current_a": states("number.victron_evcs_set_current_command"),
|
|
"evcs_current_a": states("sensor.victron_evcs_current"),
|
|
"evcs_ac_power_w": states("sensor.victron_evcs_ac_power"),
|
|
"evcs_charging_time": states("sensor.victron_evcs_charging_time"),
|
|
"evcs_session_energy_kwh": states("sensor.evcs_hq2239dnt7p_last_session_energy"),
|
|
"evcs_charging_switch": states("switch.victron_evcs_charging"),
|
|
"evcs_auto_start_switch": states("switch.victron_evcs_auto_start"),
|
|
|
|
"controller_enabled": states("input_boolean.victron_evcs_surplus_auto_enabled"),
|
|
"notifications_enabled": states("input_boolean.victron_evcs_surplus_notifications"),
|
|
"hard_stop_enabled": states("input_boolean.victron_evcs_hard_stop_enabled"),
|
|
"charge_permission_now": states("input_boolean.victron_evcs_charge_permission_now"),
|
|
"control_latch": states("input_boolean.victron_evcs_control_latch"),
|
|
"departure_priority_enabled": states("input_boolean.victron_evcs_departure_priority_enabled"),
|
|
"forecast_mode_enabled": states("input_boolean.victron_evcs_forecast_mode_enabled"),
|
|
|
|
"target_current_auto_a": states("input_number.victron_evcs_target_current_auto"),
|
|
"budget_remaining_kwh": states("input_number.victron_evcs_budget_remaining_kwh"),
|
|
"projected_end_soc_after_charge": states("input_number.victron_evcs_projected_end_soc_after_charge"),
|
|
|
|
"pv_start_min_w": states("input_number.victron_evcs_pv_start_min_w"),
|
|
"pv_hold_min_w": states("input_number.victron_evcs_pv_hold_min_w"),
|
|
"house_ac_headroom_w": states("input_number.victron_evcs_house_ac_headroom_w"),
|
|
"battery_discharge_soft_a": states("input_number.victron_evcs_battery_discharge_soft_a"),
|
|
"battery_discharge_hard_a": states("input_number.victron_evcs_battery_discharge_hard_a"),
|
|
"battery_reserve_up_a": states("input_number.victron_evcs_battery_reserve_up_a"),
|
|
"battery_neutral_band_a": states("input_number.victron_evcs_battery_neutral_band_a"),
|
|
"soc_start_min": states("input_number.victron_evcs_soc_start_min"),
|
|
"modules_en_service": states("input_number.evcs_balance_modules_en_service"),
|
|
"soc_stop_min": states("input_number.victron_evcs_soc_stop_min"),
|
|
"current_min_a": states("input_number.victron_evcs_current_min_a"),
|
|
"current_max_auto_a": states("input_number.victron_evcs_current_max_auto_a"),
|
|
"grid_current_max_a": states("input_number.evcs_plafond_courant_edf_on"),
|
|
"current_step_up_a": states("input_number.victron_evcs_current_step_up_a"),
|
|
"current_step_down_a": states("input_number.victron_evcs_current_step_down_a"),
|
|
"current_change_cooldown_seconds": states("input_number.victron_evcs_current_change_cooldown_seconds"),
|
|
"min_run_minutes": states("input_number.victron_evcs_min_run_minutes"),
|
|
"min_stop_minutes": states("input_number.victron_evcs_min_stop_minutes"),
|
|
|
|
"required_energy_kwh": states("input_number.victron_evcs_required_energy_kwh"),
|
|
"soc_comfort_target": states("input_number.victron_evcs_soc_comfort_target"),
|
|
"end_of_day_soc_guard": states("input_number.victron_evcs_end_of_day_soc_guard"),
|
|
|
|
"base_load_remaining_kwh": states("input_number.victron_base_load_remaining_kwh"),
|
|
"flexible_safety_margin_kwh": states("input_number.victron_flexible_safety_margin_kwh"),
|
|
"end_of_day_soc_target": states("input_number.victron_end_of_day_soc_target"),
|
|
"ac_loads_max_safe_w": states("input_number.victron_ac_loads_max_safe_w"),
|
|
|
|
"battery_full_soc": states("input_number.victron_evcs_battery_full_soc"),
|
|
"battery_full_forecast_min_kwh": states("input_number.victron_evcs_battery_full_forecast_min_kwh"),
|
|
"forecast_commit_soc_floor": states("input_number.victron_evcs_forecast_commit_soc_floor"),
|
|
"forecast_commit_min_kwh": states("input_number.victron_evcs_forecast_commit_min_kwh"),
|
|
|
|
"cloud_debt_kwh": states("input_number.victron_evcs_cloud_debt_kwh"),
|
|
"cloud_debt_max_kwh": states("input_number.victron_evcs_cloud_debt_max_kwh"),
|
|
"cloud_tolerance_minutes": states("input_number.victron_evcs_cloud_tolerance_minutes"),
|
|
"cloud_debt_started_at": states("input_datetime.victron_evcs_cloud_debt_started_at"),
|
|
"battery_soft_breach_at": states("input_text.victron_evcs_battery_soft_breach_at"),
|
|
"operating_mode_helper": states("input_text.victron_evcs_operating_mode"),
|
|
|
|
"departure_time": states("input_datetime.victron_evcs_departure_time"),
|
|
"departure_time_jeep": states("input_datetime.victron_evcs_departure_time_jeep"),
|
|
"evcs_vehicle": states("input_select.victron_evcs_vehicle"),
|
|
"allow_grid_departure_urgent": states("input_boolean.victron_evcs_allow_grid_departure_urgent"),
|
|
"last_start_at": states("input_datetime.victron_evcs_last_start_at"),
|
|
"last_stop_at": states("input_datetime.victron_evcs_last_stop_at"),
|
|
"last_current_change_at": states("input_datetime.victron_evcs_last_current_change_at"),
|
|
|
|
"day_start_time": states("input_datetime.victron_flexible_day_start_time"),
|
|
"day_stop_time": states("input_datetime.victron_flexible_day_stop_time"),
|
|
|
|
"vebus_overload": states("binary_sensor.victron_ve_bus_overload"),
|
|
"vebus_l1_overload": states("binary_sensor.victron_ve_bus_l1_overload"),
|
|
"vebus_low_battery": states("binary_sensor.victron_ve_bus_low_battery"),
|
|
"vebus_l1_low_battery": states("binary_sensor.victron_ve_bus_l1_low_battery"),
|
|
|
|
"vebus_ac_out_l1_power_w": states("sensor.victron_ve_bus_ac_out_l1_power"),
|
|
"vebus_ac_out_l1_current_a": states("sensor.victron_ve_bus_ac_out_l1_current"),
|
|
"vebus_ac_out_l1_voltage_v": states("sensor.victron_ve_bus_ac_out_l1_voltage"),
|
|
|
|
"vebus_dc_voltage_v": states("sensor.victron_ve_bus_dc_voltage"),
|
|
"vebus_dc_current_a": states("sensor.victron_ve_bus_dc_current"),
|
|
"vebus_dc_power_w": states("sensor.victron_ve_bus_dc_power_system"),
|
|
|
|
"vebus_state": states("sensor.victron_ve_bus_state"),
|
|
"vebus_main_state": states("sensor.victron_ve_bus_main_state"),
|
|
|
|
"last_signature": states("input_text.victron_evcs_control_last_signature"),
|
|
|
|
"hc_night_start_time": states("input_datetime.victron_evcs_hc_night_start"),
|
|
"hc_night_stop_time": states("input_datetime.victron_evcs_hc_night_stop"),
|
|
"morning_start_time": states("input_datetime.victron_evcs_morning_start"),
|
|
"morning_stop_time": states("input_datetime.victron_evcs_morning_stop"),
|
|
"hc_midday_start_time": states("input_datetime.victron_evcs_hc_midday_start"),
|
|
"hc_midday_stop_time": states("input_datetime.victron_evcs_hc_midday_stop"),
|
|
"evening_start_time": states("input_datetime.victron_evcs_evening_start"),
|
|
"evening_stop_time": states("input_datetime.victron_evcs_evening_stop"),
|
|
|
|
"allow_grid_hc_night": states("input_boolean.victron_evcs_allow_grid_hc_night"),
|
|
"night_takeover_prev": states("input_boolean.victron_evcs_night_grid_takeover_needed"),
|
|
"night_grid_session_committed_prev": states("input_boolean.victron_evcs_night_grid_session_committed"),
|
|
"prev_surplus_state": states("input_text.victron_evcs_surplus_state"),
|
|
"evcs_night_session_start_soc": states("input_text.victron_evcs_night_session_start_soc"),
|
|
"evcs_night_session_start_at": states("input_text.victron_evcs_night_session_start_at"),
|
|
"advisor_apply_night_target": states("input_boolean.evcs_advisor_apply_night_target"),
|
|
"advisor_night_target_soc": states("input_number.evcs_advisor_night_target_soc"),
|
|
"advisor_status": states("input_text.evcs_advisor_status"),
|
|
"advisor_last_run": states("input_text.evcs_advisor_last_run"),
|
|
|
|
"balance_required_soc": states("input_number.evcs_balance_required_soc"),
|
|
"balance_energy_to_cover_kwh": states("input_number.evcs_balance_energy_to_cover_kwh"),
|
|
"balance_status": states("input_text.evcs_balance_status"),
|
|
"balance_last_run": states("input_text.evcs_balance_last_run"),
|
|
"allow_grid_hc_midday": states("input_boolean.victron_evcs_allow_grid_hc_midday"),
|
|
"probe_enabled": states("input_boolean.victron_evcs_probe_enabled"),
|
|
|
|
"probe_minutes": states("input_number.victron_evcs_probe_minutes"),
|
|
"probe_retry_minutes": states("input_number.victron_evcs_probe_retry_minutes"),
|
|
"probe_current_a": states("input_number.victron_evcs_probe_current_a"),
|
|
|
|
"grid_battery_soft_a": states("input_number.victron_evcs_grid_battery_soft_a"),
|
|
"grid_battery_hard_a": states("input_number.victron_evcs_grid_battery_hard_a"),
|
|
|
|
"morning_probe_pv_avg_min_w": states("input_number.victron_evcs_morning_probe_pv_avg_min_w"),
|
|
"morning_probe_pv_trend_min_w": states("input_number.victron_evcs_morning_probe_pv_trend_min_w"),
|
|
"midday_probe_pv_avg_min_w": states("input_number.victron_evcs_midday_probe_pv_avg_min_w"),
|
|
"afternoon_probe_pv_avg_min_w": states("input_number.victron_evcs_afternoon_probe_pv_avg_min_w"),
|
|
"afternoon_probe_soc_min": states("input_number.victron_evcs_afternoon_probe_soc_min"),
|
|
"afternoon_battery_max_discharge_a": states("input_number.victron_evcs_afternoon_battery_max_discharge_a"),
|
|
"morning_soc_min": states("input_number.victron_evcs_morning_soc_min"),
|
|
"midday_soc_min": states("input_number.victron_evcs_midday_soc_min"),
|
|
"evening_soc_start_min": states("input_number.victron_evcs_evening_soc_start_min"),
|
|
"evening_soc_stop_min": states("input_number.victron_evcs_evening_soc_stop_min"),
|
|
|
|
"morning_battery_max_discharge_a": states("input_number.victron_evcs_morning_battery_max_discharge_a"),
|
|
"midday_battery_max_discharge_a": states("input_number.victron_evcs_midday_battery_max_discharge_a"),
|
|
"evening_battery_max_discharge_a": states("input_number.victron_evcs_evening_battery_max_discharge_a"),
|
|
|
|
"last_block_reason": states("input_text.victron_evcs_last_block_reason"),
|
|
"blocked_until": states("input_datetime.victron_evcs_blocked_until"),
|
|
"probe_started_at": states("input_datetime.victron_evcs_probe_started_at"),
|
|
|
|
"victron_evcs_strategy": states("input_select.victron_evcs_strategy"),
|
|
"evcs_priority_manual_override": states("input_boolean.victron_evcs_priority_manual_override"),
|
|
"evcs_priority_manual_mode": states("input_select.victron_evcs_priority_manual_mode"),
|
|
"evcs_priority_manual_reason": states("input_text.victron_evcs_priority_manual_reason"),
|
|
"evcs_priority_manual_until": states("input_datetime.victron_evcs_priority_manual_until"),
|
|
|
|
"house_spike_grace_minutes": states("input_number.victron_evcs_house_spike_grace_minutes"),
|
|
"solar_potential_grace_minutes": states("input_number.victron_evcs_solar_potential_grace_minutes"),
|
|
"step_up_cooldown_seconds": states("input_number.victron_evcs_step_up_cooldown_seconds"),
|
|
"step_down_cooldown_seconds": states("input_number.victron_evcs_step_down_cooldown_seconds"),
|
|
"force_mode_auto_revert_minutes": states("input_number.victron_evcs_force_mode_auto_revert_minutes"),
|
|
|
|
"overload_step_down_a": states("input_number.victron_evcs_overload_step_down_a"),
|
|
"overload_hold_seconds": states("input_number.victron_evcs_overload_hold_seconds"),
|
|
"overload_stop_after_seconds": states("input_number.victron_evcs_overload_stop_after_seconds"),
|
|
|
|
"batt_discharge_soft_gt90_a": states("input_number.victron_evcs_batt_discharge_soft_gt90_a"),
|
|
"batt_discharge_hard_gt90_a": states("input_number.victron_evcs_batt_discharge_hard_gt90_a"),
|
|
"batt_charge_reserve_gt90_a": states("input_number.victron_evcs_batt_charge_reserve_gt90_a"),
|
|
"batt_soft_tol_gt90_min": states("input_number.victron_evcs_batt_soft_tol_gt90_min"),
|
|
"batt_hard_tol_gt90_sec": states("input_number.victron_evcs_batt_hard_tol_gt90_sec"),
|
|
"batt_recovery_gt90_min": states("input_number.victron_evcs_batt_recovery_gt90_min"),
|
|
|
|
"batt_discharge_soft_80_90_a": states("input_number.victron_evcs_batt_discharge_soft_80_90_a"),
|
|
"batt_discharge_hard_80_90_a": states("input_number.victron_evcs_batt_discharge_hard_80_90_a"),
|
|
"batt_charge_reserve_80_90_a": states("input_number.victron_evcs_batt_charge_reserve_80_90_a"),
|
|
"batt_soft_tol_80_90_min": states("input_number.victron_evcs_batt_soft_tol_80_90_min"),
|
|
"batt_hard_tol_80_90_sec": states("input_number.victron_evcs_batt_hard_tol_80_90_sec"),
|
|
"batt_recovery_80_90_min": states("input_number.victron_evcs_batt_recovery_80_90_min"),
|
|
|
|
"batt_discharge_soft_60_80_a": states("input_number.victron_evcs_batt_discharge_soft_60_80_a"),
|
|
"batt_discharge_hard_60_80_a": states("input_number.victron_evcs_batt_discharge_hard_60_80_a"),
|
|
"batt_charge_reserve_60_80_a": states("input_number.victron_evcs_batt_charge_reserve_60_80_a"),
|
|
"batt_soft_tol_60_80_min": states("input_number.victron_evcs_batt_soft_tol_60_80_min"),
|
|
"batt_hard_tol_60_80_sec": states("input_number.victron_evcs_batt_hard_tol_60_80_sec"),
|
|
"batt_recovery_60_80_min": states("input_number.victron_evcs_batt_recovery_60_80_min"),
|
|
|
|
"batt_discharge_soft_40_60_a": states("input_number.victron_evcs_batt_discharge_soft_40_60_a"),
|
|
"batt_discharge_hard_40_60_a": states("input_number.victron_evcs_batt_discharge_hard_40_60_a"),
|
|
"batt_charge_reserve_40_60_a": states("input_number.victron_evcs_batt_charge_reserve_40_60_a"),
|
|
"batt_soft_tol_40_60_min": states("input_number.victron_evcs_batt_soft_tol_40_60_min"),
|
|
"batt_hard_tol_40_60_sec": states("input_number.victron_evcs_batt_hard_tol_40_60_sec"),
|
|
"batt_recovery_40_60_min": states("input_number.victron_evcs_batt_recovery_40_60_min"),
|
|
|
|
"batt_discharge_soft_25_40_a": states("input_number.victron_evcs_batt_discharge_soft_25_40_a"),
|
|
"batt_discharge_hard_25_40_a": states("input_number.victron_evcs_batt_discharge_hard_25_40_a"),
|
|
"batt_charge_reserve_25_40_a": states("input_number.victron_evcs_batt_charge_reserve_25_40_a"),
|
|
"batt_soft_tol_25_40_min": states("input_number.victron_evcs_batt_soft_tol_25_40_min"),
|
|
"batt_hard_tol_25_40_sec": states("input_number.victron_evcs_batt_hard_tol_25_40_sec"),
|
|
"batt_recovery_25_40_min": states("input_number.victron_evcs_batt_recovery_25_40_min"),
|
|
|
|
"batt_discharge_soft_lt25_a": states("input_number.victron_evcs_batt_discharge_soft_lt25_a"),
|
|
"batt_discharge_hard_lt25_a": states("input_number.victron_evcs_batt_discharge_hard_lt25_a"),
|
|
"batt_charge_reserve_lt25_a": states("input_number.victron_evcs_batt_charge_reserve_lt25_a"),
|
|
"batt_soft_tol_lt25_min": states("input_number.victron_evcs_batt_soft_tol_lt25_min"),
|
|
"batt_hard_tol_lt25_sec": states("input_number.victron_evcs_batt_hard_tol_lt25_sec"),
|
|
"batt_recovery_lt25_min": states("input_number.victron_evcs_batt_recovery_lt25_min"),
|
|
|
|
"evcs_delivery_ratio_ema": states("input_number.victron_evcs_delivery_ratio_ema"),
|
|
"evcs_delivery_noise_ema": states("input_number.victron_evcs_delivery_noise_ema"),
|
|
"evcs_no_demand_score_ema": states("input_number.victron_evcs_no_demand_score_ema"),
|
|
"evcs_no_demand_semantic_active": states("input_boolean.victron_evcs_no_demand_semantic_active"),
|
|
"evcs_no_demand_since_at": states("input_datetime.victron_evcs_no_demand_since_at"),
|
|
"evcs_no_demand_filter_eval_at": states("input_datetime.victron_evcs_no_demand_filter_eval_at")
|
|
} | tojson }}
|