From 3d2afbd248c8568858afe2bbc3d2a52d6be27b6c Mon Sep 17 00:00:00 2001 From: Mike Geppert Date: Tue, 5 Aug 2025 01:04:50 -0500 Subject: [PATCH] Fix NoRetain MQTT setting implementation to properly use config value --- TasmotaManager.py | 77 +++----------------------------------- network_configuration.json | 18 ++++++++- 2 files changed, 22 insertions(+), 73 deletions(-) diff --git a/TasmotaManager.py b/TasmotaManager.py index b01ece0..08ebd58 100644 --- a/TasmotaManager.py +++ b/TasmotaManager.py @@ -661,9 +661,12 @@ class TasmotaDiscovery: changes_needed.append(('MqttPassword', mqtt_fields['Password'])) self.logger.debug(f"{name}: MQTT Password will be updated") - # Check NoRetain setting - if mqtt_config.get('NoRetain', True): + # Check NoRetain setting - FIXED: Use the actual value from config with default of False + no_retain = mqtt_config.get('NoRetain', False) + if no_retain: changes_needed.append(('SetOption62', '1')) # 1 = No Retain + else: + changes_needed.append(('SetOption62', '0')) # 0 = Use Retain # Apply changes if needed for setting, value in changes_needed: @@ -750,76 +753,6 @@ class TasmotaDiscovery: except Exception as e: self.logger.error(f"Error saving device details: {e}") - def check_mqtt_settings(ip, name, mqtt_status): - """Check and update MQTT settings if they don't match config""" - # Get the base hostname (everything before the dash) - hostname_base = name.split('-')[0] if '-' in name else name - - mqtt_fields = { - "Host": mqtt_config.get('Host', ''), - "Port": mqtt_config.get('Port', 1883), - "User": mqtt_config.get('User', ''), - "Password": mqtt_config.get('Password', ''), - "Topic": hostname_base if mqtt_config.get('Topic') == '%hostname_base%' else mqtt_config.get('Topic', ''), - "FullTopic": mqtt_config.get('FullTopic', '%prefix%/%topic%/'), - } - - device_mqtt = mqtt_status.get('MqttHost', {}) - changes_needed = [] - force_password_update = False - - # Check each MQTT setting - if device_mqtt.get('Host') != mqtt_fields['Host']: - changes_needed.append(('MqttHost', mqtt_fields['Host'])) - self.logger.debug(f"{name}: MQTT Host mismatch - Device: {device_mqtt.get('Host')}, Config: {mqtt_fields['Host']}") - force_password_update = True - - if device_mqtt.get('Port') != mqtt_fields['Port']: - changes_needed.append(('MqttPort', mqtt_fields['Port'])) - self.logger.debug(f"{name}: MQTT Port mismatch - Device: {device_mqtt.get('Port')}, Config: {mqtt_fields['Port']}") - force_password_update = True - - if device_mqtt.get('User') != mqtt_fields['User']: - changes_needed.append(('MqttUser', mqtt_fields['User'])) - self.logger.debug(f"{name}: MQTT User mismatch - Device: {device_mqtt.get('User')}, Config: {mqtt_fields['User']}") - force_password_update = True - - if device_mqtt.get('Topic') != mqtt_fields['Topic']: - changes_needed.append(('Topic', mqtt_fields['Topic'])) - self.logger.debug(f"{name}: MQTT Topic mismatch - Device: {device_mqtt.get('Topic')}, Config: {mqtt_fields['Topic']}") - force_password_update = True - - if device_mqtt.get('FullTopic') != mqtt_fields['FullTopic']: - changes_needed.append(('FullTopic', mqtt_fields['FullTopic'])) - self.logger.debug(f"{name}: MQTT FullTopic mismatch - Device: {device_mqtt.get('FullTopic')}, Config: {mqtt_fields['FullTopic']}") - force_password_update = True - - # Add password update if any MQTT setting changed or user was updated - if force_password_update: - changes_needed.append(('MqttPassword', mqtt_fields['Password'])) - self.logger.debug(f"{name}: MQTT Password will be updated") - - # Check NoRetain setting - if mqtt_config.get('NoRetain', True): - changes_needed.append(('SetOption62', '1')) # 1 = No Retain - - # Apply changes if needed - for setting, value in changes_needed: - try: - url = f"http://{ip}/cm?cmnd={setting}%20{value}" - response = requests.get(url, timeout=5) - if response.status_code == 200: - if setting != 'MqttPassword': - self.logger.debug(f"{name}: Updated {setting} to {value}") - else: - self.logger.debug(f"{name}: Updated MQTT Password") - else: - self.logger.error(f"{name}: Failed to update {setting}") - except requests.exceptions.RequestException as e: - self.logger.error(f"{name}: Error updating {setting}: {str(e)}") - - return len(changes_needed) > 0 - def main(): parser = argparse.ArgumentParser(description='Tasmota Device Manager') parser.add_argument('--config', default='network_configuration.json', diff --git a/network_configuration.json b/network_configuration.json index 8632014..ae0da3a 100644 --- a/network_configuration.json +++ b/network_configuration.json @@ -27,6 +27,22 @@ "Password": "mgeppert", "Topic": "%hostname_base%", "FullTopic": "%prefix%/%topic%/", - "NoRetain": false + "NoRetain": false, + "console": { + "SwitchRetain": "Off", + "ButtonRetain": "On", + "ButtonRetain": "Off", + "PowerOnState": "3", + "PowerRetain": "On", + "SetOption1": "0", + "SetOption3": "1", + "SetOption13": "0", + "SetOption19": "0", + "SetOption32": "8", + "SetOption53": "1", + "SetOption73": "1", + "rule1": "on button1#state=10 do power0 toggle endon", + "rule1": "1" + } } } \ No newline at end of file