#!/usr/bin/env python3 """ Test Enhanced Matcher - Phase 2 & 3 Validation Re-match existing captures with new RTL_433 and timing analysis. Compare old vs. new identifications and confidence scores. """ import json import sys from pathlib import Path # Add project root to path sys.path.insert(0, str(Path(__file__).parent)) from src.matcher.simple_matcher import get_matcher def load_existing_captures(): """Load captures from JSON file""" captures_file = Path("data/captures_simple.json") if not captures_file.exists(): print(f"āŒ No captures file found at {captures_file}") return [] with open(captures_file, 'r') as f: data = json.load(f) return data.get('captures', []) def test_matcher(): """Test enhanced matcher with existing captures""" print("=" * 80) print("PHASE 2 & 3 MATCHER VALIDATION") print("=" * 80) print() # Load matcher matcher = get_matcher() print("āœ… Matcher loaded successfully") print() # Load captures captures = load_existing_captures() print(f"šŸ“Š Loaded {len(captures)} existing captures") print() # Statistics improvements = [] no_change = 0 worse = 0 new_matches = 0 print("=" * 80) print("RE-MATCHING CAPTURES WITH ENHANCED MATCHER") print("=" * 80) print() for i, capture in enumerate(captures, 1): protocol = capture.get('protocol') or 'RAW' frequency = capture.get('frequency', 0) preset = capture.get('preset', 'Unknown') old_device = capture.get('device_name', 'Unknown') old_confidence = capture.get('match_confidence', 0.0) # Re-match with enhanced matcher # Note: We don't have raw_data stored, so timing analysis won't apply matches = matcher.match(frequency, protocol, preset) if matches: new_device = matches[0].device_name new_confidence = matches[0].confidence new_method = matches[0].match_method # Compare results confidence_change = new_confidence - old_confidence print(f"{i}. {protocol} @ {frequency/1e6:.2f} MHz") print(f" OLD: {old_device} ({old_confidence:.2f})") print(f" NEW: {new_device} ({new_confidence:.2f}) - {new_method}") if confidence_change > 0.05: print(f" āœ… IMPROVED: +{confidence_change:.2f}") improvements.append(confidence_change) elif confidence_change < -0.05: print(f" āš ļø WORSE: {confidence_change:.2f}") worse += 1 else: print(f" āž”ļø NO CHANGE") no_change += 1 if old_device == 'Unknown' and new_device != 'Unknown': print(f" šŸ†• NEW IDENTIFICATION!") new_matches += 1 # Show top 3 matches if len(matches) > 1: print(f" Top matches:") for match in matches[:3]: print(f" - {match.device_name} ({match.confidence:.2f})") else: print(f"{i}. {protocol} @ {frequency/1e6:.2f} MHz") print(f" OLD: {old_device} ({old_confidence:.2f})") print(f" NEW: No matches") print(f" āš ļø WORSE: No identification") worse += 1 print() # Summary statistics print("=" * 80) print("SUMMARY STATISTICS") print("=" * 80) print() print(f"Total captures tested: {len(captures)}") print(f"Improved matches: {len(improvements)} ({len(improvements)/len(captures)*100:.1f}%)") print(f"No change: {no_change} ({no_change/len(captures)*100:.1f}%)") print(f"Worse: {worse} ({worse/len(captures)*100:.1f}%)") print(f"New identifications: {new_matches}") print() if improvements: avg_improvement = sum(improvements) / len(improvements) max_improvement = max(improvements) print(f"Average confidence improvement: +{avg_improvement:.2f}") print(f"Maximum confidence improvement: +{max_improvement:.2f}") print() # Overall assessment success_rate = (len(improvements) + no_change) / len(captures) * 100 print(f"Overall success rate: {success_rate:.1f}%") print() # Expected vs. actual print("=" * 80) print("PHASE 2 & 3 VALIDATION") print("=" * 80) print() print("Expected: 75-85% accuracy (+15-20% from baseline)") print(f"Actual: {len(improvements)} captures improved") print() if len(improvements) > len(captures) * 0.3: print("āœ… Phase 2 & 3 integration SUCCESSFUL!") print(" RTL_433 database and timing analysis are working as expected.") else: print("āš ļø Phase 2 & 3 validation PARTIAL") print(" Some captures improved, but not as many as expected.") print(" This is expected since we don't have raw_data for timing analysis.") print() print("=" * 80) print("NOTES") print("=" * 80) print() print("1. These captures were processed with the OLD matcher") print("2. raw_data is not stored, so Phase 3 timing analysis cannot be tested") print("3. To fully validate Phase 3, upload new .sub files with RAW protocol") print("4. RTL_433 protocol matching (Phase 2) is validated by this test") print() if __name__ == '__main__': try: test_matcher() except Exception as e: print(f"\nāŒ Test failed: {e}") import traceback traceback.print_exc() sys.exit(1)