@@ -331,82 +331,40 @@ def calculate_plant_consumed_power(
331331
332332 total_ac_charger_power = 0.0
333333 ac_chargers : dict [str , Any ] = coordinator_data .get ("ac_chargers" , {})
334- # _LOGGER.debug("AC Chargers data: %s", ac_chargers)
335334 for _ , ac_charger_data in ac_chargers .items ():
336335 ac_power = safe_float (ac_charger_data .get ("ac_charger_charging_power" ))
337336 if ac_power is not None :
338337 total_ac_charger_power += ac_power
339338
340- total_dc_charger_power = 0.0
341- dc_chargers : dict [str , Any ] = coordinator_data .get ("dc_chargers" , {})
342- # _LOGGER.debug("DC Chargers data: %s", dc_chargers)
343- for _ , dc_charger_data in dc_chargers .items ():
344- dc_power = safe_float (dc_charger_data .get ("dc_charger_output_power" ))
345- if dc_power is not None :
346- total_dc_charger_power += dc_power
347-
348- # Use the correct calculation for total PV power
349- pv_power = SigenergyCalculations .calculate_total_pv_power (
350- None , coordinator_data = coordinator_data
351- )
352-
339+ plant_power = plant_data .get ("plant_active_power" )
353340 grid_power = plant_data .get ("plant_grid_sensor_active_power" )
354-
355- # Get battery power
356- battery_power = plant_data .get ("plant_ess_power" )
341+ third_party_pv_power = plant_data .get ("plant_third_party_photovoltaic_power" )
357342
358343 # Validate inputs
359- if pv_power is None or grid_power is None or battery_power is None :
344+ if plant_power is None or grid_power is None or third_party_pv_power is None :
360345 return None
361346
362347 # Validate input types
363- if not isinstance (pv_power , (int , float )):
364- _LOGGER .warning (
365- "[CS][Plant Consumed] PV power is not a number: %s (type: %s)" ,
366- pv_power ,
367- type (pv_power ).__name__ ,
368- )
369- return None
370- if not isinstance (grid_power , (int , float )):
371- _LOGGER .warning (
372- "[CS][Plant Consumed] Grid power is not a number: %s (type: %s)" ,
373- grid_power ,
374- type (grid_power ).__name__ ,
375- )
376- return None
377- if not isinstance (battery_power , (int , float )):
378- _LOGGER .warning (
379- "[CS][Plant Consumed] Battery power is not a number: %s (type: %s)" ,
380- battery_power ,
381- type (battery_power ).__name__ ,
382- )
383- return None
348+ def are_numbers (* values ):
349+ for x in values :
350+ if not isinstance (x , (int , float )):
351+ try :
352+ float (x )
353+ except (ValueError , TypeError ):
354+ _LOGGER .warning (
355+ "[CS][Plant Consumed] Value is not a number: %s (type: %s)" ,
356+ x ,
357+ type (x ).__name__ ,
358+ )
359+ return False
360+ return True
384361
385- # Calculate grid import and export power
386- # Grid power is positive when importing, negative when exporting
387- grid_import = max (0 , grid_power )
388- grid_export = max (0 , - grid_power )
362+ if not are_numbers (grid_power , plant_power , third_party_pv_power ):
363+ return None
389364
390365 # Calculate plant consumed power
391- # Note: battery_power is positive when charging, negative when discharging
392366 try :
393- # The household consumption should include the power used by the EV chargers.
394- # The chargers are loads within the household.
395- consumed_power = pv_power + grid_import - grid_export - battery_power
396-
397- # Sanity check
398- if consumed_power < 0 :
399- _LOGGER .debug (
400- "[CS][Plant Consumed] Calculated power is negative.\n " \
401- "consumed_power = pv_power + grid_import - grid_export - battery_power:\n " \
402- "%s kW = %s + %s - %s - %s" ,
403- consumed_power ,
404- pv_power ,
405- grid_import ,
406- grid_export ,
407- battery_power
408- )
409- # Keep the negative value as it might be valid in some scenarios
367+ consumed_power = max (0 , float (plant_power ) + float (grid_power ) + float (third_party_pv_power ) - total_ac_charger_power )
410368
411369 except Exception as ex : # pylint: disable=broad-exception-caught
412370 _LOGGER .error (
0 commit comments