feat: Phase 2 & 3 - RTL_433 integration + RAW timing analysis
Phase 2: RTL_433 Protocol Matcher (286 devices) ================================================ Created src/matcher/rtl433_matcher.py - RTL433Matcher class with JSON database loader - Built search indexes: device_id, name, category, modulation - Fuzzy matching with difflib.SequenceMatcher (>0.6 similarity) - Timing signature matching (±15% tolerance) - Confidence scoring: * Exact ID match: 0.95 * Exact name match: 0.90 * Fuzzy match: 0.70-0.85 * Timing match: 0.70-0.95 - Singleton pattern for performance Phase 3: RAW Signal Timing Analysis ==================================== Created src/parser/raw_parser.py - RAWParser class for Flipper Zero RAW_Data format - TimingSignature dataclass with pulse analysis - Extracts short_pulse, long_pulse, gap, pulse_ratio - Percentile-based clustering (25th/75th) - Encoding detection (PWM, PPM, Manchester, OOK) - Statistical analysis (mean, std, total duration) Integration & Enhancements =========================== Enhanced src/matcher/simple_matcher.py - Added raw_data parameter to match() method - RTL_433 protocol matching (Phase 2) with logging - Timing analysis for RAW captures (Phase 3) - Graceful degradation with try/except - RTL433_AVAILABLE flag for feature detection - Maintains backward compatibility Updated src/api/main_simple.py - Extract raw_data from parsed metadata - Convert List[int] to space-separated string - Pass raw_data to enhanced matcher Validation Results ================== Test script: test_enhanced_matcher.py - 20 existing captures re-matched - 4 captures improved (20%) - 0 captures worse (0%) - Average improvement: +0.16 confidence - Best improvement: +0.35 (MegaCode → Linear Megacode) - RTL_433 exact match: MegaCode → 0.95 confidence - RTL_433 fuzzy match: Princeton → Insteon 0.79 Expected Accuracy ================= - Phase 2 alone: 75-80% (+15%) - Phase 2 + 3: 80-85% (+20-25%) - Current validation: Phase 2 confirmed working - Phase 3: Requires new uploads with raw_data Deployment Ready ================ - Backward compatible (optional raw_data) - No breaking changes to API - Graceful import fallback - Ready for server deployment
This commit is contained in:
@@ -324,9 +324,15 @@ async def upload_captures(
|
||||
protocol = metadata.protocol if hasattr(metadata, 'protocol') else "RAW"
|
||||
preset = metadata.preset if hasattr(metadata, 'preset') else "Unknown"
|
||||
|
||||
# Perform device matching
|
||||
# Extract RAW_Data (convert list to string format for timing analysis)
|
||||
raw_data = None
|
||||
if hasattr(metadata, 'raw_data') and metadata.raw_data:
|
||||
# Convert list of ints to space-separated string
|
||||
raw_data = ' '.join(map(str, metadata.raw_data))
|
||||
|
||||
# Perform device matching (now with RAW data for timing analysis)
|
||||
matcher = get_matcher()
|
||||
matches = matcher.match(frequency, protocol, preset)
|
||||
matches = matcher.match(frequency, protocol, preset, raw_data=raw_data)
|
||||
|
||||
# Get best match
|
||||
best_match = matches[0] if matches else None
|
||||
|
||||
Reference in New Issue
Block a user