@@ -318,15 +318,26 @@ async def _fetch_load_data(self):
318318 load_power_data , load_minutes_age = self .base .minute_data_load (self .now_utc , "load_power" , days_to_fetch , required_unit = "W" , load_scaling = 1.0 , interpolate = True , pad = False )
319319 load_minutes = self .base .fill_load_from_power (load_minutes , load_power_data )
320320
321+ # Re-read car charging settings dynamically so switch changes are picked up without a restart.
322+ # Note: car_charging_from_battery does not affect EV subtraction from load history; it only controls
323+ # whether the battery is allowed to discharge for car charging in the prediction model.
324+ car_charging_hold = self .get_arg ("car_charging_hold" , True )
325+ car_energy_reported_load = self .get_arg ("car_energy_reported_load" , True )
326+ if not car_energy_reported_load :
327+ # Car energy is not part of the house load (outside CT clamp), so don't subtract it
328+ car_charging_hold = False
329+ car_charging_energy_scale = self .get_arg ("car_charging_energy_scale" , 1.0 )
330+ self .log ("ML Component: Car charging hold {}, car energy reported load {}" .format (car_charging_hold , car_energy_reported_load ))
331+
321332 car_charging_energy = {}
322333 if self .get_arg ("car_charging_energy" , default = None , indirect = False ):
323- car_charging_energy = self .base .minute_data_import_export (days_to_fetch , self .now_utc , "car_charging_energy" , scale = self . car_charging_energy_scale , required_unit = "kWh" , pad = False )
334+ car_charging_energy = self .base .minute_data_import_export (days_to_fetch , self .now_utc , "car_charging_energy" , scale = car_charging_energy_scale , required_unit = "kWh" , pad = False )
324335
325336 max_minute = max (load_minutes .keys ()) if load_minutes else 0
326337 max_minute = (max_minute // 5 ) * 5 # Align to 5-minute intervals
327338 load_minutes_new = {}
328339
329- if self . car_charging_hold and car_charging_energy :
340+ if car_charging_hold and car_charging_energy :
330341 # Use improved car subtraction method that handles timing misalignment and gaps
331342 self .log ("ML Component: Applying improved car charging subtraction with hold and interpolation" )
332343 load_minutes_new = self .car_subtraction (load_minutes , car_charging_energy , step = PREDICT_STEP , interpolate_gaps = True , max_gap_minutes = 60 , smoothing_window = 3 )
@@ -336,7 +347,7 @@ async def _fetch_load_data(self):
336347 total_load_energy = 0
337348 for minute in range (max_minute , - PREDICT_STEP , - PREDICT_STEP ):
338349 car_delta = 0.0
339- if self . car_charging_hold :
350+ if car_charging_hold :
340351 load_now = self .get_from_incrementing (load_minutes , minute , PREDICT_STEP , backwards = True )
341352 if load_now >= self .car_charging_threshold * PREDICT_STEP :
342353 car_delta = self .car_charging_rate * PREDICT_STEP
0 commit comments