1. Restructured configuration: Moved config_other and console to top level 2. Added common _match_pattern function for regex pattern matching 3. Implemented Unifi Hostname bug fix in is_hostname_unknown 4. Created common get_device_hostname function to eliminate code duplication 5. Added comprehensive test scripts for all new functionality 6. Added detailed documentation for all changes
4.6 KiB
is_hostname_unknown Function Implementation Summary
Overview
A new utility function is_hostname_unknown has been added to the TasmotaManager.py script to provide a centralized way to check if a hostname matches any pattern in the unknown_device_patterns list. This function standardizes the pattern matching logic that was previously duplicated in multiple places throughout the codebase.
Implementation Details
The function has been implemented as a method of the TasmotaDiscovery class:
def is_hostname_unknown(self, hostname: str, patterns: list = None) -> bool:
"""Check if a hostname matches any pattern in unknown_device_patterns.
This function provides a centralized way to check if a hostname matches any of the
unknown_device_patterns defined in the configuration. It uses case-insensitive
matching and supports glob patterns (with *) in the patterns list.
Args:
hostname: The hostname to check against unknown_device_patterns
patterns: Optional list of patterns to check against. If not provided,
patterns will be loaded from the configuration.
Returns:
bool: True if the hostname matches any pattern, False otherwise
Examples:
# Check if a hostname matches any unknown_device_patterns in the config
if manager.is_hostname_unknown("tasmota_device123"):
print("This is an unknown device")
# Check against a specific list of patterns
custom_patterns = ["esp-*", "tasmota_*"]
if manager.is_hostname_unknown("esp-abcd", custom_patterns):
print("This matches a custom pattern")
"""
# If no patterns provided, get them from the configuration
if patterns is None:
patterns = []
network_filters = self.config['unifi'].get('network_filter', {})
for network in network_filters.values():
patterns.extend(network.get('unknown_device_patterns', []))
# Convert hostname to lowercase for case-insensitive matching
hostname_lower = hostname.lower()
# Check if hostname matches any pattern
for pattern in patterns:
pattern_lower = pattern.lower()
# Convert glob pattern to regex pattern
pattern_regex = pattern_lower.replace('.', r'\.').replace('*', '.*')
if re.match(f"^{pattern_regex}", hostname_lower):
self.logger.debug(f"Hostname '{hostname}' matches unknown device pattern: {pattern}")
return True
return False
Features
The function includes the following features:
- Centralized Logic: Provides a single place for hostname pattern matching logic
- Case Insensitivity: Performs case-insensitive matching
- Glob Pattern Support: Supports glob patterns (with *) in the patterns list
- Flexible Pattern Source: Can use patterns from the configuration or a custom list
- Detailed Logging: Logs when a hostname matches a pattern
- Comprehensive Documentation: Includes detailed docstring with examples
Testing
A comprehensive test script (test_is_hostname_unknown.py) has been created to verify the function's behavior. The tests include:
- Testing with patterns from the configuration
- Testing with custom patterns
- Testing case insensitivity
All tests have passed, confirming that the function works correctly in all scenarios.
Usage Examples
Basic Usage
# Check if a hostname matches any unknown_device_patterns in the config
if manager.is_hostname_unknown("tasmota_device123"):
print("This is an unknown device")
With Custom Patterns
# Check against a specific list of patterns
custom_patterns = ["esp-*", "tasmota_*"]
if manager.is_hostname_unknown("esp-abcd", custom_patterns):
print("This matches a custom pattern")
Potential Refactoring Opportunities
The following places in the code could potentially be refactored to use the new function:
- In
get_tasmota_devices(lines 235-244) - In
get_unknown_devices(lines 500-506) - In
process_single_device(lines 1526-1533) - In
process_devices(lines 1760-1766)
Refactoring these sections would improve code maintainability and ensure consistent behavior across all parts of the application.
Conclusion
The is_hostname_unknown function provides a centralized, well-documented, and thoroughly tested way to check if a hostname matches any pattern in the unknown_device_patterns list. This implementation satisfies the requirements specified in the issue description and improves the overall code quality of the TasmotaManager.py script.