From f4f6cf792ba8eee39fce6d1c50e35dd1faf2b52e Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:29:14 +0200 Subject: [PATCH 1/6] add display name for Home Assistant --- classes/protocol_settings.py | 10 ++++++---- classes/transports/mqtt.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/classes/protocol_settings.py b/classes/protocol_settings.py index fb2cb35..1b6a87c 100644 --- a/classes/protocol_settings.py +++ b/classes/protocol_settings.py @@ -189,6 +189,7 @@ class registry_map_entry: register_byte : int ''' byte offset for canbus ect... ''' variable_name : str + display_name : str documented_name : str unit : str unit_mod : float @@ -500,14 +501,14 @@ def process_row(row): #endregion unit - variable_name = row["variable name"] if row["variable name"] else row["documented name"] - variable_name = variable_name.strip().lower().replace(" ", "_").replace("__", "_") #clean name + display_name = row["variable name"] if row["variable name"] else row["documented name"] + variable_name = display_name.strip().lower().replace(" ", "_").replace("__", "_") #clean name if re.search(r"[^a-zA-Z0-9\_]", variable_name) : self._log.warning("Invalid Name : " + str(variable_name) + " reg: " + str(row["register"]) + " doc name: " + str(row["documented name"]) + " path: " + str(path)) - - if not variable_name and not row["documented name"]: #skip empty entry / no name. todo add more invalidator checks. + if not variable_name: #skip empty entry / no name. todo add more invalidator checks. + self._log.warning(f"Skipping empty name for register: {row['register']}") return #region data type @@ -653,6 +654,7 @@ def process_row(row): register_bit=register_bit, register_byte= register_byte, variable_name= variable_name, + display_name = display_name, documented_name = row["documented name"], unit= str(unit_symbol), unit_mod= unit_multiplier, diff --git a/classes/transports/mqtt.py b/classes/transports/mqtt.py index d1469e4..51f1b1b 100644 --- a/classes/transports/mqtt.py +++ b/classes/transports/mqtt.py @@ -247,7 +247,7 @@ def mqtt_discovery(self, from_transport : transport_base): disc_payload = {} disc_payload["availability_topic"] = self.base_topic + "/" + from_transport.device_identifier + "/availability" disc_payload["device"] = device - disc_payload["name"] = clean_name + disc_payload["name"] = item.display_name disc_payload["unique_id"] = "hotnoob_" + from_transport.device_serial_number + "_"+clean_name writePrefix = "" From 88fe48efd6e86a7c89e164cfd285d0b7afc5606c Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:30:28 +0200 Subject: [PATCH 2/6] parse device model from config --- classes/transports/transport_base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/transports/transport_base.py b/classes/transports/transport_base.py index a0c33b8..0ef4cdd 100644 --- a/classes/transports/transport_base.py +++ b/classes/transports/transport_base.py @@ -94,6 +94,7 @@ def __init__(self, settings : "SectionProxy") -> None: if settings: self.device_serial_number = settings.get(["device_serial_number", "serial_number"], self.device_serial_number) + self.device_model = settings.get(["device_model", "model"], self.device_model) self.device_manufacturer = settings.get(["device_manufacturer", "manufacturer"], self.device_manufacturer) self.device_name = settings.get(["device_name", "name"], fallback=self.device_manufacturer+"_"+self.device_serial_number) self.bridge = settings.get("bridge", self.bridge) From e8000c090fd92e0e6539fc65d5fe895cd9b4b1e2 Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:32:22 +0200 Subject: [PATCH 3/6] update serial number once available --- classes/transports/transport_base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/classes/transports/transport_base.py b/classes/transports/transport_base.py index 0ef4cdd..598b82f 100644 --- a/classes/transports/transport_base.py +++ b/classes/transports/transport_base.py @@ -125,6 +125,8 @@ def __init__(self, settings : "SectionProxy") -> None: def update_identifier(self): self.device_identifier = self.device_serial_number.strip().lower() + if self.device_name[-1] == "_": # Device name is missing serial number + self.device_name = self.device_name + self.device_serial_number def init_bridge(self, from_transport : "transport_base"): pass From 1683c96f28e920f0220650043b8caa361b40e0ff Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:33:37 +0200 Subject: [PATCH 4/6] add availability_topic attribute --- classes/transports/mqtt.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/classes/transports/mqtt.py b/classes/transports/mqtt.py index 51f1b1b..bf7097c 100644 --- a/classes/transports/mqtt.py +++ b/classes/transports/mqtt.py @@ -24,6 +24,7 @@ class mqtt(transport_base): base_topic : str = "home/device" error_topic : str = "/error" discovery_topic : str = "homeassistant" + availability_topic : str discovery_enabled : bool = False json : bool = False reconnect_delay : int = 7 @@ -108,7 +109,7 @@ def connect(self): def exit_handler(self): '''on exit handler''' self._log.warning("MQTT Exiting...") - self.client.publish( self.base_topic + "/" + self.device_identifier + "/availability","offline") + self.client.publish(self.availability_topic,"offline",retain=True) return def mqtt_reconnect(self): @@ -161,7 +162,7 @@ def write_data(self, data : dict[str, str], from_transport : transport_base): self._log.info(f"write data from [{from_transport.transport_name}] to mqtt transport") self._log.info(data) #have to send this every loop, because mqtt doesnt disconnect when HA restarts. HA bug. - info = self.client.publish(self.base_topic + "/" + from_transport.device_identifier + "/availability","online", qos=0,retain=True) + info = self.client.publish(self.availability_topic,"online", qos=0,retain=True) if info.rc == MQTT_ERR_NO_CONN: self.connected = False @@ -204,8 +205,10 @@ def init_bridge(self, from_transport : transport_base): def mqtt_discovery(self, from_transport : transport_base): self._log.info("Publishing HA Discovery Topics...") + self.availability_topic = self.base_topic + "/" + from_transport.device_identifier + "/availability" + disc_payload = {} - disc_payload["availability_topic"] = self.base_topic + "/" + from_transport.device_identifier + "/availability" + disc_payload["availability_topic"] = self.availability_topic device = {} device["manufacturer"] = from_transport.device_manufacturer From 7ce4c43c6205484d6779a37f09c2a8441cc06de6 Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:34:19 +0200 Subject: [PATCH 5/6] remove redundant name cleaning --- classes/transports/mqtt.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/transports/mqtt.py b/classes/transports/mqtt.py index bf7097c..cc34198 100644 --- a/classes/transports/mqtt.py +++ b/classes/transports/mqtt.py @@ -232,8 +232,9 @@ def mqtt_discovery(self, from_transport : transport_base): continue - clean_name = item.variable_name.lower().replace(" ", "_").strip() - if not clean_name: #if name is empty, skip + clean_name = item.variable_name + if not clean_name: #if name is empty, skip^ + self._log.warning(f"Skipping empty name for item: {item.register}") continue if False: @@ -262,8 +263,7 @@ def mqtt_discovery(self, from_transport : transport_base): if item.unit: disc_payload["unit_of_measurement"] = item.unit - - discovery_topic = self.discovery_topic+"/sensor/HN-" + from_transport.device_serial_number + writePrefix + "/" + disc_payload["name"].replace(" ", "_") + "/config" + discovery_topic = self.discovery_topic+"/sensor/HN-" + from_transport.device_serial_number + writePrefix + "/" + clean_name + "/config" self.client.publish(discovery_topic, json.dumps(disc_payload),qos=1, retain=True) From 64bb8978c857f34d4801214463db9a5dce0d1159 Mon Sep 17 00:00:00 2001 From: Julian Eder Date: Sun, 25 May 2025 13:34:58 +0200 Subject: [PATCH 6/6] replace _ by space in HA displayed device name --- classes/transports/mqtt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/transports/mqtt.py b/classes/transports/mqtt.py index cc34198..fbf0783 100644 --- a/classes/transports/mqtt.py +++ b/classes/transports/mqtt.py @@ -214,7 +214,7 @@ def mqtt_discovery(self, from_transport : transport_base): device["manufacturer"] = from_transport.device_manufacturer device["model"] = from_transport.device_model device["identifiers"] = "hotnoob_" + from_transport.device_model + "_" + from_transport.device_serial_number - device["name"] = from_transport.device_name + device["name"] = from_transport.device_name.replace("_", " ").strip() registry_map : list[registry_map_entry] = [] for entries in from_transport.protocolSettings.registry_map.values():