From 3e6001568f1cd47914af1e161ca1bb94aafa3336 Mon Sep 17 00:00:00 2001 From: Mike Geppert Date: Wed, 6 Aug 2025 20:52:15 -0500 Subject: [PATCH] Add detailed reporting when no template match is found --- TasmotaManager.py | 9 +++- template_no_match_summary.md | 63 ++++++++++++++++++++++++++ test_template_no_match.py | 88 ++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 template_no_match_summary.md create mode 100755 test_template_no_match.py diff --git a/TasmotaManager.py b/TasmotaManager.py index 8d7fe6a..dab1ef3 100644 --- a/TasmotaManager.py +++ b/TasmotaManager.py @@ -678,7 +678,14 @@ class TasmotaDiscovery: else: self.logger.error(f"{name}: Failed to update device name") else: - self.logger.debug(f"{name}: No matches found in config_other for device name or template") + # No matches found, print detailed information about what's on the device + self.logger.info(f"{name}: No matches found in config_other for either Device Name or Template") + self.logger.info(f"{name}: Current Device Name on device: '{device_name}'") + self.logger.info(f"{name}: Current Template on device: '{current_template}'") + print(f"\nNo template match found for device {name} at {ip}") + print(f" Device Name on device: '{device_name}'") + print(f" Template on device: '{current_template}'") + print("Please add an appropriate entry to mqtt.config_other in your configuration file.") return template_updated diff --git a/template_no_match_summary.md b/template_no_match_summary.md new file mode 100644 index 0000000..6fc34b8 --- /dev/null +++ b/template_no_match_summary.md @@ -0,0 +1,63 @@ +# Template No Match Tracking and Reporting + +## Issue Description + +When the `check_and_update_template` method couldn't find a match for either the Device Name or Template in the `mqtt.config_other` configuration, it would silently continue without providing any information about what was set on the device. This made it difficult for users to understand why a template wasn't applied and what the current device configuration was. + +## Changes Made + +The `check_and_update_template` method has been enhanced to track and report detailed information when no match is found. Specifically: + +1. Changed the log level from DEBUG to INFO for better visibility in logs +2. Added more detailed log messages that include: + - A clear message that no matches were found + - The current Device Name on the device + - The current Template on the device +3. Added user-friendly console output using `print()` statements that: + - Clearly indicates no template match was found + - Shows the device name and IP address + - Displays the current Device Name on the device + - Displays the current Template on the device + - Provides a suggestion to add an appropriate entry to the configuration file + +## Code Changes + +The following changes were made to the `check_and_update_template` method: + +```python +# Before +else: + self.logger.debug(f"{name}: No matches found in config_other for device name or template") + +# After +else: + # No matches found, print detailed information about what's on the device + self.logger.info(f"{name}: No matches found in config_other for either Device Name or Template") + self.logger.info(f"{name}: Current Device Name on device: '{device_name}'") + self.logger.info(f"{name}: Current Template on device: '{current_template}'") + print(f"\nNo template match found for device {name} at {ip}") + print(f" Device Name on device: '{device_name}'") + print(f" Template on device: '{current_template}'") + print("Please add an appropriate entry to mqtt.config_other in your configuration file.") +``` + +## Testing + +A test script `test_template_no_match.py` was created to verify the changes. The script: + +1. Gets a test device from current.json +2. Temporarily modifies the mqtt.config_other section to ensure no match will be found +3. Calls the check_and_update_template method +4. Verifies that appropriate messages are printed + +The test confirmed that the method now correctly tracks and reports detailed information when no match is found. + +## Benefits + +These changes provide several benefits: + +1. **Better Visibility**: Users can now see when a template match is not found, rather than the process silently continuing. +2. **Detailed Information**: The current Device Name and Template on the device are clearly displayed, making it easier to understand the current configuration. +3. **Actionable Guidance**: The message suggests adding an appropriate entry to the configuration file, guiding users on how to resolve the issue. + +This enhancement improves the user experience by providing clear, actionable information when a template match is not found, helping users understand and resolve configuration issues more easily. \ No newline at end of file diff --git a/test_template_no_match.py b/test_template_no_match.py new file mode 100755 index 0000000..d19a581 --- /dev/null +++ b/test_template_no_match.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +""" +Test script to verify that appropriate messages are printed when no template match is found. + +This script: +1. Gets a test device from current.json +2. Temporarily modifies the mqtt.config_other section to ensure no match will be found +3. Calls the check_and_update_template method +4. Verifies that appropriate messages are printed +""" + +import json +import logging +import sys +import os + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) +logger = logging.getLogger(__name__) + +# Import TasmotaManager class +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +from TasmotaManager import TasmotaDiscovery + +def get_test_device(): + """Get a test device from current.json""" + try: + with open('current.json', 'r') as f: + data = json.load(f) + devices = data.get('tasmota', {}).get('devices', []) + if devices: + return devices[0] # Use the first device + else: + logger.error("No devices found in current.json") + return None + except Exception as e: + logger.error(f"Error reading current.json: {e}") + return None + +def main(): + """Main test function""" + # Get a test device + device = get_test_device() + if not device: + logger.error("No test device available. Run discovery first.") + return 1 + + device_name = device.get('name') + device_ip = device.get('ip') + + logger.info(f"Testing with device: {device_name} (IP: {device_ip})") + + # Create a TasmotaDiscovery instance + discovery = TasmotaDiscovery(debug=True) + + # Load the configuration + discovery.load_config('network_configuration.json') + + # Temporarily modify the mqtt.config_other section to ensure no match will be found + # Save the original config_other + original_config_other = discovery.config.get('mqtt', {}).get('config_other', {}) + + # Set an empty config_other to ensure no match + discovery.config['mqtt']['config_other'] = { + "NonExistentDevice": '{"NAME":"Test Device","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}' + } + + logger.info("Modified mqtt.config_other to ensure no match will be found") + + # Call the check_and_update_template method + logger.info("Calling check_and_update_template method") + result = discovery.check_and_update_template(device_ip, device_name) + + # Verify the result + logger.info(f"Result of check_and_update_template: {result}") + + # Restore the original config_other + discovery.config['mqtt']['config_other'] = original_config_other + + logger.info("Test completed. Check the output above to verify that appropriate messages were printed.") + return 0 + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file