diff --git a/app/src/gen3/infos_g3.py b/app/src/gen3/infos_g3.py index 2bcdfef..4fdfb29 100644 --- a/app/src/gen3/infos_g3.py +++ b/app/src/gen3/infos_g3.py @@ -87,7 +87,8 @@ class RegisterMap: class InfosG3(Infos): - def ha_confs(self, ha_prfx, node_id, snr, singleton: bool, sug_area='') \ + def ha_confs(self, ha_prfx: str, node_id: str, snr: str, + sug_area: str = '') \ -> Generator[tuple[dict, str], None, None]: '''Generator function yields a json register struct for home-assistant auto configuration and a unique entity string @@ -98,11 +99,8 @@ class InfosG3(Infos): entity strings sug_area:str ==> suggested area string from the config file''' # iterate over RegisterMap.map and get the register values - for key, reg in RegisterMap.map.items(): - if reg not in self.info_defs: - continue - row = self.info_defs[reg] - res = self.ha_conf(row, reg, ha_prfx, node_id, snr, singleton, sug_area) # noqa: E501 + for reg in RegisterMap.map.values(): + res = self.ha_conf(reg, ha_prfx, node_id, snr, False, sug_area) # noqa: E501 if res: yield res diff --git a/app/src/gen3/inverter_g3.py b/app/src/gen3/inverter_g3.py index b3e33d4..e9db0f4 100644 --- a/app/src/gen3/inverter_g3.py +++ b/app/src/gen3/inverter_g3.py @@ -110,7 +110,7 @@ class InverterG3(Inverter, ConnectionG3): '''register all our topics at home assistant''' for data_json, component, node_id, id in self.db.ha_confs( self.entity_prfx, self.node_id, self.unique_id, - False, self.sug_area): + self.sug_area): logger_mqtt.debug(f"MQTT Register: cmp:'{component}'" f" node_id:'{node_id}' {data_json}") await self.mqtt.publish(f"{self.discovery_prfx}{component}" diff --git a/app/src/gen3plus/infos_g3p.py b/app/src/gen3plus/infos_g3p.py index 483a414..c6b9a1a 100644 --- a/app/src/gen3plus/infos_g3p.py +++ b/app/src/gen3plus/infos_g3p.py @@ -16,7 +16,8 @@ class RegisterMap: class InfosG3P(Infos): - def ha_confs(self, ha_prfx, node_id, snr, singleton: bool, sug_area='') \ + def ha_confs(self, ha_prfx: str, node_id: str, snr: str, + sug_area: str = '') \ -> Generator[tuple[dict, str], None, None]: '''Generator function yields a json register struct for home-assistant auto configuration and a unique entity string @@ -27,11 +28,8 @@ class InfosG3P(Infos): entity strings sug_area:str ==> suggested area string from the config file''' # iterate over RegisterMap.map and get the register values - for key, reg in RegisterMap.map.items(): - if reg not in self.info_defs: - continue - row = self.info_defs[reg] - res = self.ha_conf(row, reg, ha_prfx, node_id, snr, singleton, sug_area) # noqa: E501 + for reg in RegisterMap.map.values(): + res = self.ha_conf(reg, ha_prfx, node_id, snr, False, sug_area) # noqa: E501 if res: yield res diff --git a/app/src/gen3plus/inverter_g3p.py b/app/src/gen3plus/inverter_g3p.py index e8f979a..70e8d5c 100644 --- a/app/src/gen3plus/inverter_g3p.py +++ b/app/src/gen3plus/inverter_g3p.py @@ -110,7 +110,7 @@ class InverterG3P(Inverter, ConnectionG3P): '''register all our topics at home assistant''' for data_json, component, node_id, id in self.db.ha_confs( self.entity_prfx, self.node_id, self.unique_id, - False, self.sug_area): + self.sug_area): logger_mqtt.debug(f"MQTT Register: cmp:'{component}'" f" node_id:'{node_id}' {data_json}") await self.mqtt.publish(f"{self.discovery_prfx}{component}" diff --git a/app/src/infos.py b/app/src/infos.py index 3fa3da4..965299c 100644 --- a/app/src/infos.py +++ b/app/src/infos.py @@ -267,32 +267,37 @@ class Infos: dict = self.stat['proxy'] dict[counter] -= 1 - def ha_proxy_confs(self, ha_prfx, node_id, snr, singleton: bool, - sug_area='') -> Generator[tuple[dict, str], None, None]: - '''Generator function yields a json register struct for home-assistant - auto configuration and a unique entity string + def ha_proxy_confs(self, ha_prfx: str, node_id: str, snr: str) \ + -> Generator[tuple[dict, str], None, None]: + '''Generator function yields json register struct for home-assistant + auto configuration and the unique entity string, for all proxy + registers arguments: - prfx:str ==> MQTT prefix for the home assistant 'stat_t string + ha_prfx:str ==> MQTT prefix for the home assistant 'stat_t string + node_id:str ==> node id of the inverter, used to build unique entity snr:str ==> serial number of the inverter, used to build unique entity strings - sug_area:str ==> suggested area string from the config file''' - # iterate over RegisterMap.map and get the register values - tab = self._info_defs - for reg in tab: - row = tab[reg] - - res = self.ha_conf(row, reg, ha_prfx, node_id, snr, singleton, sug_area) # noqa: E501 + ''' + # iterate over RegisterMap.map and get the register values for entries + # with Singleton=True, which means that this is a proxy register + for reg in self._info_defs.keys(): + res = self.ha_conf(reg, ha_prfx, node_id, snr, True) # noqa: E501 if res: yield res - def ha_conf(self, row, key, ha_prfx, node_id, snr, singleton: bool, sug_area: str) -> tuple[str, str, str, str]: # noqa: E501 + def ha_conf(self, key, ha_prfx, node_id, snr, singleton: bool, sug_area: str = '') -> tuple[str, str, str, str]: # noqa: E501 + if key not in self.info_defs: + return None + row = self.info_defs[key] + if 'singleton' in row: if singleton != row['singleton']: return None elif singleton: return None prfx = ha_prfx + node_id + # check if we have details for home assistant if 'ha' in row: ha = row['ha'] diff --git a/app/src/inverter.py b/app/src/inverter.py index a827ad8..41eb39c 100644 --- a/app/src/inverter.py +++ b/app/src/inverter.py @@ -41,8 +41,7 @@ class Inverter(): async def _register_proxy_stat_home_assistant(cls) -> None: '''register all our topics at home assistant''' for data_json, component, node_id, id in cls.db_stat.ha_proxy_confs( - cls.entity_prfx, cls.proxy_node_id, - cls.proxy_unique_id, True): + cls.entity_prfx, cls.proxy_node_id, cls.proxy_unique_id): logger_mqtt.debug(f"MQTT Register: cmp:'{component}' node_id:'{node_id}' {data_json}") # noqa: E501 await cls.mqtt.publish(f'{cls.discovery_prfx}{component}/{node_id}{id}/config', data_json) # noqa: E501 diff --git a/app/tests/test_infos.py b/app/tests/test_infos.py index 992a1d1..aedfa61 100644 --- a/app/tests/test_infos.py +++ b/app/tests/test_infos.py @@ -219,7 +219,7 @@ def test_build_ha_conf1(ContrDataSeq): i.static_init() # initialize counter tests = 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123', singleton=False): + for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123'): if id == 'out_power_123': assert comp == 'sensor' @@ -250,7 +250,7 @@ def test_build_ha_conf1(ContrDataSeq): assert tests==4 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456', singleton=True): + for d_json, comp, node_id, id in i.ha_proxy_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456'): if id == 'out_power_123': assert False @@ -280,7 +280,7 @@ def test_build_ha_conf2(ContrDataSeq, InvDataSeq, InvDataSeq2): pass tests = 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123', singleton=False, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123', sug_area = 'roof'): if id == 'out_power_123': assert comp == 'sensor' @@ -463,10 +463,10 @@ def test_table_definition(): val = i.dev_value(Register.INTERNAL_ERROR) # check internal error counter assert val == 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123', singleton=False, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id="garagendach/", snr='123', sug_area = 'roof'): pass - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456', singleton=True, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_proxy_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456'): pass val = i.dev_value(Register.INTERNAL_ERROR) # check internal error counter @@ -476,7 +476,7 @@ def test_table_definition(): i.info_defs[Register.TEST_REG1] = {'name':['proxy', 'Internal_Test1'], 'singleton': True, 'ha':{'dev':'proxy', 'dev_cla': None, 'stat_cla': None, 'id':'intern_test1_'}} tests = 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456', singleton=True, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_proxy_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456'): if id == 'intern_test1_456': tests +=1 @@ -488,7 +488,7 @@ def test_table_definition(): # test missing 'dev' value i.info_defs[Register.TEST_REG1] = {'name':['proxy', 'Internal_Test2'], 'singleton': True, 'ha':{'dev_cla': None, 'stat_cla': None, 'id':'intern_test2_', 'fmt':'| int'}} tests = 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456', singleton=True, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_proxy_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456'): if id == 'intern_test2_456': tests +=1 @@ -502,9 +502,9 @@ def test_table_definition(): # test invalid 'via' value i.info_devs['test_dev'] = {'via':'xyz', 'name':'Module PV1'} - i.info_defs[0xfffffffe] = {'name':['proxy', 'Internal_Test2'], 'singleton': True, 'ha':{'dev':'test_dev', 'dev_cla': None, 'stat_cla': None, 'id':'intern_test2_', 'fmt':'| int'}} + i.info_defs[Register.TEST_REG1] = {'name':['proxy', 'Internal_Test2'], 'singleton': True, 'ha':{'dev':'test_dev', 'dev_cla': None, 'stat_cla': None, 'id':'intern_test2_', 'fmt':'| int'}} tests = 0 - for d_json, comp, node_id, id in i.ha_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456', singleton=True, sug_area = 'roof'): + for d_json, comp, node_id, id in i.ha_proxy_confs(ha_prfx="tsun/", node_id = 'proxy/', snr = '456'): if id == 'intern_test2_456': tests +=1