@@ -417,41 +417,44 @@ def _calc_remaining_time(self,
417417 charging_type : str ,
418418 control_parameter_phases : int ,
419419 soc_request_interval_offset : int ,
420- bidi_state : BidiState ) -> SelectedPlan :
420+ bidi_state : BidiState ) -> Tuple [ float , float , int , float ] :
421421 bidi = bidi_state == BidiState .BIDI_CAPABLE and plan .bidi_charging_enabled
422+ battery_capacity = ev_template .data .battery_capacity
423+ efficiency = ev_template .data .efficiency
424+
425+ def calc_for_phases (phases_to_use : int ) -> Tuple [float , float ]:
426+ return self ._calculate_duration (
427+ plan ,
428+ soc ,
429+ battery_capacity ,
430+ efficiency ,
431+ used_amount ,
432+ phases_to_use ,
433+ charging_type ,
434+ ev_template ,
435+ bidi )
436+
422437 if bidi :
423- duration , missing_amount = self ._calculate_duration (
424- plan , soc , ev_template .data .battery_capacity ,
425- used_amount , control_parameter_phases , charging_type , ev_template , bidi )
438+ duration , missing_amount = calc_for_phases (control_parameter_phases )
426439 remaining_time = plan_end_time - duration
427440 phases = control_parameter_phases
428441 elif plan .phases_to_use == 0 :
429442 if max_hw_phases == 1 :
430- duration , missing_amount = self ._calculate_duration (
431- plan , soc , ev_template .data .battery_capacity ,
432- used_amount , 1 , charging_type , ev_template , bidi )
443+ duration , missing_amount = calc_for_phases (1 )
433444 remaining_time = plan_end_time - duration
434445 phases = 1
435446 elif phase_switch_supported is False :
436- duration , missing_amount = self ._calculate_duration (
437- plan , soc , ev_template .data .battery_capacity , used_amount , control_parameter_phases ,
438- charging_type , ev_template , bidi )
447+ duration , missing_amount = calc_for_phases (control_parameter_phases )
439448 phases = control_parameter_phases
440449 remaining_time = plan_end_time - duration
441450 elif plan .et_active :
442- duration , missing_amount = self ._calculate_duration (
443- plan , soc , ev_template .data .battery_capacity , used_amount , max_hw_phases ,
444- charging_type , ev_template , bidi )
451+ duration , missing_amount = calc_for_phases (max_hw_phases )
445452 phases = max_hw_phases
446453 remaining_time = plan_end_time - duration
447454 else :
448- duration_3p , missing_amount = self ._calculate_duration (
449- plan , soc , ev_template .data .battery_capacity , used_amount , max_hw_phases ,
450- charging_type , ev_template , bidi )
455+ duration_3p , missing_amount = calc_for_phases (max_hw_phases )
451456 remaining_time_3p = plan_end_time - duration_3p
452- duration_1p , missing_amount = self ._calculate_duration (
453- plan , soc , ev_template .data .battery_capacity , used_amount , 1 ,
454- charging_type , ev_template , bidi )
457+ duration_1p , missing_amount = calc_for_phases (1 )
455458 remaining_time_1p = plan_end_time - duration_1p
456459 # Kurz vor dem nächsten Abfragen des SoC, wenn noch der alte SoC da ist, kann es sein, dass die Zeit
457460 # für 1p nicht mehr reicht, weil die Regelung den neuen SoC noch nicht kennt.
@@ -466,11 +469,9 @@ def _calc_remaining_time(self,
466469 phases = 1
467470 log .debug (f"Dauer 1p: { duration_1p } , Dauer 3p: { duration_3p } " )
468471 elif plan .phases_to_use == 3 or plan .phases_to_use == 1 :
469- duration , missing_amount = self ._calculate_duration (
470- plan , soc , ev_template .data .battery_capacity ,
471- used_amount , min (plan .phases_to_use , max_hw_phases ), charging_type , ev_template , bidi )
472+ phases = min (plan .phases_to_use , max_hw_phases )
473+ duration , missing_amount = calc_for_phases (phases )
472474 remaining_time = plan_end_time - duration
473- phases = plan .phases_to_use
474475
475476 log .debug (f"Verbleibende Zeit bis zum Ladestart [s]:{ remaining_time } , Dauer [h]: { duration / 3600 } " )
476477 return remaining_time , missing_amount , phases , duration
@@ -479,6 +480,7 @@ def _calculate_duration(self,
479480 plan : ScheduledChargingPlan ,
480481 soc : Optional [float ],
481482 battery_capacity : float ,
483+ efficiency : float ,
482484 used_amount : float ,
483485 phases : int ,
484486 charging_type : str ,
@@ -487,7 +489,7 @@ def _calculate_duration(self,
487489
488490 if plan .limit .selected == "soc" :
489491 if soc is not None :
490- missing_amount = ((plan .limit .soc_scheduled - soc ) / 100 ) * battery_capacity
492+ missing_amount = ((plan .limit .soc_scheduled - soc ) / 100 ) * battery_capacity / ( efficiency / 100 )
491493 else :
492494 raise ValueError ("Um Zielladen mit SoC-Ziel nutzen zu können, bitte ein SoC-Modul konfigurieren." )
493495 else :
0 commit comments