Files
giglez/scripts/create_test_dataset_with_known_devices.py
Trilltechnician 8092d59b8d test: Complete RTL_433 validation with real weather sensor data
Downloaded and tested 13,716 .sub files from FlipperZero-Subghz-DB

Test Results:
- Round 1 (Flipper unit tests): 0% (0/5 files)
- Round 2 (Real weather sensors): 0% (0/8 files)

Root Cause Analysis:
- Infrastructure: 100% functional 
- Converter: Working correctly 
- Decoder: Working correctly 
- Issue: Flipper captures are too short (100-300 pulses)
- RTL_433 requires: Multiple repetitions (1000+ pulses)

Files Added:
- scripts/test_real_weather_sensors.py
- docs/RTL433_TEST_RESULTS.md (comprehensive findings)
- data/test_rtl433_real/ (8 weather sensor test files)
- data/test_db/ (13,716 .sub files from FlipperZero-Subghz-DB)

Key Finding:
Flipper Zero methodology (single transmissions) fundamentally incompatible
with RTL_433 decoder requirements (multiple repetitions for statistical analysis)

Next Steps:
1. Test with longer captures (5-10 second recordings)
2. Implement .cu8 → .sub converter for RTL_433 test files
3. Document capture guidelines for users
2026-01-14 18:55:43 -08:00

154 lines
5.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Create Test Dataset with Known Devices
Uses Flipper Zero unit test files (known good captures with protocol names)
and adds GPS coordinates for testing RTL_433 integration.
"""
import os
import shutil
from pathlib import Path
import sys
# Add project to path
sys.path.insert(0, str(Path(__file__).parent.parent))
from src.parser.sub_parser import parse_sub_file
# Test dataset configuration
TEST_DATASET = [
{
"source": "signatures/flipperzero-firmware/applications/debug/unit_tests/resources/unit_tests/subghz/gate_tx.sub",
"name": "GateTX_Gate_Opener",
"gps": {"lat": 37.7749, "lon": -122.4194}, # San Francisco
"description": "GateTX garage door opener (433.92 MHz)"
},
{
"source": "signatures/flipperzero-firmware/applications/debug/unit_tests/resources/unit_tests/subghz/honeywell_wdb_raw.sub",
"name": "Honeywell_Doorbell",
"gps": {"lat": 40.7128, "lon": -74.0060}, # New York
"description": "Honeywell wireless doorbell RAW capture (433.92 MHz)"
},
{
"source": "signatures/flipperzero-firmware/applications/debug/unit_tests/resources/unit_tests/subghz/magellan.sub",
"name": "Magellan_Sensor",
"gps": {"lat": 34.0522, "lon": -118.2437}, # Los Angeles
"description": "Magellan security sensor"
},
{
"source": "signatures/flipperzero-firmware/applications/debug/unit_tests/resources/unit_tests/subghz/megacode.sub",
"name": "Linear_MegaCode",
"gps": {"lat": 41.8781, "lon": -87.6298}, # Chicago
"description": "Linear MegaCode garage door"
},
{
"source": "signatures/flipperzero-firmware/applications/debug/unit_tests/resources/unit_tests/subghz/holtek_ht12x_raw.sub",
"name": "Holtek_Remote",
"gps": {"lat": 29.7604, "lon": -95.3698}, # Houston
"description": "Holtek HT12X remote control RAW"
}
]
def create_test_dataset(output_dir="data/test_known_devices"):
"""Create test dataset with known devices and GPS coordinates"""
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
print("="*70)
print("Creating Test Dataset with Known Devices")
print("="*70)
print()
successful = []
failed = []
for item in TEST_DATASET:
source = Path(item["source"])
if not source.exists():
print(f"✗ {item['name']}: Source file not found")
failed.append(item)
continue
try:
# Parse to verify it's valid
metadata = parse_sub_file(str(source))
# Create filename with GPS
lat = item["gps"]["lat"]
lon = item["gps"]["lon"]
lat_str = f"{abs(lat):.4f}{'N' if lat >= 0 else 'S'}"
lon_str = f"{abs(lon):.4f}{'W' if lon < 0 else 'E'}"
dest_filename = f"{lat_str}_{lon_str}_{item['name']}.sub"
dest_path = output_path / dest_filename
# Copy file
shutil.copy2(source, dest_path)
# Print info
print(f"✓ {item['name']}")
print(f" Source: {source.name}")
print(f" Protocol: {metadata.protocol}")
print(f" Frequency: {metadata.frequency / 1_000_000:.3f} MHz")
print(f" Format: {metadata.file_format}")
if metadata.has_raw_data:
print(f" RAW Data: {metadata.pulse_count} pulses")
print(f" GPS: {lat}, {lon}")
print(f" Saved: {dest_filename}")
print(f" Description: {item['description']}")
print()
successful.append({
**item,
"filename": dest_filename,
"metadata": metadata
})
except Exception as e:
print(f"✗ {item['name']}: Error - {e}")
failed.append(item)
# Create manifest
manifest_path = output_path / "MANIFEST.md"
with open(manifest_path, 'w') as f:
f.write("# Test Dataset - Known Devices with GPS\n\n")
f.write("This dataset contains validated RF captures from Flipper Zero unit tests\n")
f.write("with added GPS coordinates for testing RTL_433 integration.\n\n")
f.write("## Files\n\n")
for item in successful:
f.write(f"### {item['filename']}\n\n")
f.write(f"- **Device:** {item['name']}\n")
f.write(f"- **Protocol:** {item['metadata'].protocol}\n")
f.write(f"- **Frequency:** {item['metadata'].frequency / 1_000_000:.3f} MHz\n")
f.write(f"- **Format:** {item['metadata'].file_format}\n")
if item['metadata'].has_raw_data:
f.write(f"- **Pulses:** {item['metadata'].pulse_count}\n")
f.write(f"- **GPS:** {item['gps']['lat']}, {item['gps']['lon']}\n")
f.write(f"- **Description:** {item['description']}\n")
f.write(f"- **Source:** {item['source']}\n\n")
# Summary
print("="*70)
print("SUMMARY")
print("="*70)
print(f"Successfully created: {len(successful)} files")
print(f"Failed: {len(failed)} files")
print(f"Output directory: {output_path}")
print(f"Manifest: {manifest_path}")
print()
if successful:
print("Test these files with:")
print(f" PYTHONPATH=. python3 scripts/test_rtl433_with_known_devices.py")
return successful, failed
if __name__ == '__main__':
create_test_dataset()