192192OPTIONS_TIME_FULL = [((BASE_TIME + timedelta (seconds = minute * 60 )).strftime ("%H:%M" ) + ":00" ) for minute in range (0 , 24 * 60 , 1 )]
193193
194194
195+ def regname_to_ha (name ):
196+ """
197+ Convert register name to HA style
198+ """
199+ name = name .lower ().replace (" " , "_" ).replace ("%" , "percent" ).replace ("-" , "_" )
200+ return name
201+
202+
195203class GECloudDirect :
196204 def __init__ (self , api_key , automatic , base ):
197205 """
@@ -527,9 +535,10 @@ async def publish_meter(self, device, meter):
527535
528536 async def enable_real_time_control (self , device , registers ):
529537 for key in registers :
530- reg_name = registers [key ].get ("name" , None )
538+ reg_name = registers [key ].get ("name" , "" )
531539 value = registers [key ].get ("value" , None )
532- if "real-time control" in reg_name .lower ():
540+ ha_name = regname_to_ha (reg_name )
541+ if "real_time_control" in ha_name :
533542 if value :
534543 self .log ("GECloud: Real-time control already enabled for {}" .format (device ))
535544 return True
@@ -556,7 +565,7 @@ async def publish_registers(self, device, registers, select_key=None):
556565 validation_rules = registers [key ].get ("validation_rules" , None )
557566 validation = registers [key ].get ("validation" , None )
558567 value = registers [key ].get ("value" , None )
559- ha_name = reg_name . lower (). replace ( " " , "_" ). replace ( "%" , "percent" ). replace ( "-" , "_" )
568+ ha_name = regname_to_ha ( reg_name )
560569 attributes = {}
561570 attributes ["friendly_name" ] = reg_name
562571
@@ -653,6 +662,28 @@ async def async_automatic_config(self, devices):
653662 num_inverters = 1
654663 batteries = [devices ["gateway" ]]
655664
665+ # Do we have a charge power percentage setting?
666+ has_charge_power_percent = False
667+ has_pause_start_time = False
668+ has_discharge_target_soc = False
669+ has_pause_battery = False
670+ for device in batteries :
671+ registers = self .settings .get (device , {})
672+ for key in registers :
673+ reg_name = registers [key ].get ("name" , "" )
674+ ha_name = regname_to_ha (reg_name )
675+ if "inverter_charge_power_percentage" in ha_name :
676+ has_charge_power_percent = True
677+ if "pause_battery_start_time" in ha_name :
678+ has_pause_start_time = True
679+ if "dc_discharge_1_lower_soc_percent_limit" in ha_name :
680+ has_discharge_target_soc = True
681+ if "pause_battery" in ha_name :
682+ has_pause_battery = True
683+
684+ self .log ("GECloud: Auto-config detected features - charge power percent: {}, pause battery: {}, pause start time: {}, discharge target soc: {}" .format (has_charge_power_percent , has_pause_battery , has_pause_start_time , has_discharge_target_soc ))
685+ print ("GECloud: Auto-config detected features - charge power percent: {}, pause battery: {}, pause start time: {}, discharge target soc: {}" .format (has_charge_power_percent , has_pause_battery , has_pause_start_time , has_discharge_target_soc ))
686+
656687 self .base .args ["inverter_type" ] = ["GEC" for _ in range (num_inverters )]
657688 self .base .args ["num_inverters" ] = num_inverters
658689 self .base .args ["load_today" ] = ["sensor.predbat_gecloud_" + device + "_consumption_today" for device in batteries ]
@@ -675,24 +706,36 @@ async def async_automatic_config(self, devices):
675706 self .base .args ["charge_limit" ] = ["number.predbat_gecloud_" + device + "_ac_charge_upper_percent_limit" for device in batteries ]
676707 self .base .args ["discharge_start_time" ] = ["select.predbat_gecloud_" + device + "_dc_discharge_1_start_time" for device in batteries ]
677708 self .base .args ["discharge_end_time" ] = ["select.predbat_gecloud_" + device + "_dc_discharge_1_end_time" for device in batteries ]
678- self .base .args ["discharge_target_soc" ] = ["number.predbat_gecloud_" + device + "_dc_discharge_1_lower_soc_percent_limit" for device in batteries ]
679709 self .base .args ["scheduled_charge_enable" ] = ["switch.predbat_gecloud_" + device + "_ac_charge_enable" for device in batteries ]
680710 self .base .args ["scheduled_discharge_enable" ] = ["switch.predbat_gecloud_" + device + "_enable_dc_discharge" for device in batteries ]
681- self .base .args ["pause_mode" ] = ["select.predbat_gecloud_" + device + "_pause_battery" for device in batteries ]
682- self .base .args ["pause_start_time" ] = ["select.predbat_gecloud_" + device + "_pause_battery_start_time" for device in batteries ]
683- self .base .args ["pause_end_time" ] = ["select.predbat_gecloud_" + device + "_pause_battery_end_time" for device in batteries ]
684711
685- # Do we have a charge power percentage setting?
686- for device in batteries :
687- registers = self .settings .get (device , {})
688- for key in registers :
689- reg_name = registers [key ].get ("name" , None )
690- value = registers [key ].get ("value" , None )
691- if "inverter_charge_power_percentage" in reg_name .lower ():
692- self .log ("GECloud: Found charge power percentage setting for {}, using this" .format (device ))
693- self .base .args ["charge_rate_percent" ] = ["number.predbat_gecloud_" + device + "_inverter_charge_power_percentage" for device in batteries ]
694- self .base .args ["discharge_rate_percent" ] = ["number.predbat_gecloud_" + device + "_inverter_discharge_power_percentage" for device in batteries ]
695- break
712+ if has_pause_battery :
713+ self .base .args ["pause_mode" ] = ["select.predbat_gecloud_" + device + "_pause_battery" for device in batteries ]
714+ if has_pause_start_time :
715+ self .base .args ["pause_start_time" ] = ["select.predbat_gecloud_" + device + "_pause_battery_start_time" for device in batteries ]
716+ self .base .args ["pause_end_time" ] = ["select.predbat_gecloud_" + device + "_pause_battery_end_time" for device in batteries ]
717+ else :
718+ if "pause_mode" in self .base .args :
719+ del self .base .args ["pause_mode" ]
720+ if "pause_start_time" in self .base .args :
721+ del self .base .args ["pause_start_time" ]
722+ if "pause_end_time" in self .base .args :
723+ del self .base .args ["pause_end_time" ]
724+
725+ if has_discharge_target_soc :
726+ self .base .args ["discharge_target_soc" ] = ["number.predbat_gecloud_" + device + "_dc_discharge_1_lower_soc_percent_limit" for device in batteries ]
727+ else :
728+ if "discharge_target_soc" in self .base .args :
729+ del self .base .args ["discharge_target_soc" ]
730+
731+ if has_charge_power_percent :
732+ self .base .args ["charge_rate_percent" ] = ["number.predbat_gecloud_" + device + "_inverter_charge_power_percentage" for device in batteries ]
733+ self .base .args ["discharge_rate_percent" ] = ["number.predbat_gecloud_" + device + "_inverter_discharge_power_percentage" for device in batteries ]
734+ else :
735+ if "charge_rate_percent" in self .base .args :
736+ del self .base .args ["charge_rate_percent" ]
737+ if "discharge_rate_percent" in self .base .args :
738+ del self .base .args ["discharge_rate_percent" ]
696739
697740 if "givtcp_rest" in self .base .args :
698741 del self .base .args ["givtcp_rest" ]
0 commit comments