From a1bd4d639057638eb9c44ceaef74a2a9e15ebab2 Mon Sep 17 00:00:00 2001 From: priestlypython Date: Wed, 14 Jan 2026 11:49:21 -0800 Subject: [PATCH] feat: RTL_433 protocol database integration (Phase 1) Parse and import 286 device protocols from RTL_433: - Created RTL_433 C source parser (scripts/parse_rtl433_devices.py) - Extracted device names, modulation, timing parameters, categories - Generated structured JSON database (data/rtl_433_protocols.json) Protocol breakdown: - 116 weather stations/sensors (Acurite, Oregon, LaCrosse, Fine Offset) - 39 generic sensors (temperature, humidity, leak detectors) - 25 TPMS tire pressure sensors (BMW, Ford, Toyota, etc.) - 23 security devices (alarms, motion, smoke) - 18 home automation (remotes, doorbells, garage doors) - 52 other (energy meters, lighting, automotive) Modulation analysis: - 152 OOK (On-Off Keying) devices - 105 FSK (Frequency Shift Keying) devices - Timing parameters extracted (pulse widths, gaps, resets) Next steps: - Integrate RTL_433 DB into matching engine - Add timing analysis for RAW captures - Target: 75-80% accuracy (from current 60-70%) --- data/rtl_433_protocols.json | 4296 +++++++++++++++++++++++++++++++ scripts/parse_rtl433_devices.py | 257 ++ 2 files changed, 4553 insertions(+) create mode 100644 data/rtl_433_protocols.json create mode 100755 scripts/parse_rtl433_devices.py diff --git a/data/rtl_433_protocols.json b/data/rtl_433_protocols.json new file mode 100644 index 0000000..a547f45 --- /dev/null +++ b/data/rtl_433_protocols.json @@ -0,0 +1,4296 @@ +{ + "source": "RTL_433", + "total_devices": 286, + "devices": [ + { + "device_id": "abmt", + "name": "Amazon Basics Meat Thermometer", + "modulation": "OOK", + "short_width": 550, + "long_width": 550, + "gap_limit": 2000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Amazon", + "source_file": "abmt.c" + }, + { + "device_id": "acurite_rain_896", + "name": "Acurite 896 Rain Gauge", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3500, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_th", + "name": "Acurite 609TXC Temperature and Humidity Sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_txr", + "name": "Acurite 592TXR temp/humidity, 592TX temp, 5n1, 3n1, Atlas weather station, 515 fridge/freezer, 6045 lightning, 899 rain, 1190/1192 leak", + "modulation": "OOK", + "short_width": 220, + "long_width": 408, + "gap_limit": 500, + "reset_limit": 4000, + "sync_width": 620, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_986", + "name": "Acurite 986 Refrigerator / Freezer Thermometer", + "modulation": "OOK", + "short_width": 520, + "long_width": 880, + "gap_limit": 1280, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_606", + "name": "Acurite 606TX / Technoline TX960 Temperature Sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 7000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_00275rm", + "name": "Acurite 00275rm,00276rm Temp/Humidity with optional probe", + "modulation": "OOK", + "short_width": 232, + "long_width": 420, + "gap_limit": 520, + "reset_limit": 708, + "sync_width": 632, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_590tx", + "name": "Acurite 590TX Temperature with optional Humidity", + "modulation": "OOK", + "short_width": 500, + "long_width": 1500, + "gap_limit": 2000, + "reset_limit": 3500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite.c" + }, + { + "device_id": "acurite_01185m", + "name": "Acurite Grill/Meat Thermometer 01185M", + "modulation": "OOK", + "short_width": 840, + "long_width": 2070, + "gap_limit": 3000, + "reset_limit": 6000, + "sync_width": 6600, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Acurite", + "source_file": "acurite_01185m.c" + }, + { + "device_id": "akhan_100F14", + "name": "Akhan 100F14 remote keyless entry", + "modulation": "OOK", + "short_width": 316, + "long_width": 1020, + "gap_limit": null, + "reset_limit": 1800, + "sync_width": 0, + "tolerance": 80, + "frequency": null, + "category": "automotive", + "manufacturer": "Akhan", + "source_file": "akhan_100F14.c" + }, + { + "device_id": "alectov1", + "name": "AlectoV1 Weather Sensor (Alecto WS3500 WS4500 Ventus W155/W044 Oregon)", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 7000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "AlectoV1", + "source_file": "alecto.c" + }, + { + "device_id": "ambient_weather", + "name": "Ambient Weather F007TH, TFA 30.3208.02, SwitchDocLabs F016TH temperature sensor", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 500, + "long_width": 0, + "gap_limit": null, + "reset_limit": 2400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Ambient", + "source_file": "ambient_weather.c" + }, + { + "device_id": "ambientweather_tx8300", + "name": "Ambient Weather TX-8300 Temperature/Humidity Sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 6500, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Ambient", + "source_file": "ambientweather_tx8300.c" + }, + { + "device_id": "ambientweather_wh31e", + "name": "Ambient Weather WH31E Thermo-Hygrometer Sensor, EcoWitt WH40 rain gauge, WS68 weather station", + "modulation": "FSK", + "short_width": 56, + "long_width": 56, + "gap_limit": 1800, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Ambient", + "source_file": "ambientweather_wh31e.c" + }, + { + "device_id": "ant_antplus", + "name": "ANT and ANT+ devices", + "modulation": "FSK", + "short_width": 1, + "long_width": 1, + "gap_limit": 500, + "reset_limit": 500, + "sync_width": 8, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "ANT", + "source_file": "ant_antplus.c" + }, + { + "device_id": "apator_metra_erm30", + "name": "Apator Metra E-RM 30", + "modulation": "FSK", + "short_width": 25, + "long_width": 25, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Apator", + "source_file": "apator_metra_erm30.c" + }, + { + "device_id": "arad_ms_meter", + "name": "Arad/Master Meter Dialog3G water utility meter", + "modulation": "FSK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 8, + "long_width": 8, + "gap_limit": null, + "reset_limit": 30, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Arad/Master", + "source_file": "arad_ms_meter.c" + }, + { + "device_id": "archos_tbh", + "name": "TBH weather sensor", + "modulation": "FSK", + "short_width": 212, + "long_width": 212, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TBH", + "source_file": "archos_tbh.c" + }, + { + "device_id": "arexx_ml", + "name": "Arexx Multilogger IP-HA90, IP-TH78EXT, TSN-70E", + "modulation": "FSK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 208, + "long_width": 208, + "gap_limit": null, + "reset_limit": 450, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Arexx", + "source_file": "arexx_ml.c" + }, + { + "device_id": "atech_ws308", + "name": "Atech-WS308 temperature sensor", + "modulation": "OOK_PULSE_RZ", + "short_width": 1600, + "long_width": 1832, + "gap_limit": 2500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Atech-WS308", + "source_file": "atech_ws308.c" + }, + { + "device_id": "auriol_4ld5661", + "name": "Auriol 4-LD5661/4-LD5972/4-LD6313 temperature/rain sensors", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 2500, + "reset_limit": 4000, + "sync_width": 2500, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Auriol", + "source_file": "auriol_4ld5661.c" + }, + { + "device_id": "auriol_aft77b2", + "name": "Auriol AFT 77 B2 temperature sensor", + "modulation": "OOK", + "short_width": 500, + "long_width": 920, + "gap_limit": 1104, + "reset_limit": 2275, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Auriol", + "source_file": "auriol_aft77b2.c" + }, + { + "device_id": "auriol_afw2a1", + "name": "Auriol AFW2A1 temperature/humidity sensor", + "modulation": "OOK", + "short_width": 576, + "long_width": 1536, + "gap_limit": 2012, + "reset_limit": 3954, + "sync_width": 0, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Auriol", + "source_file": "auriol_afw2a1.c" + }, + { + "device_id": "auriol_ahfl", + "name": "Auriol AHFL temperature/humidity sensor", + "modulation": "OOK", + "short_width": 2100, + "long_width": 4150, + "gap_limit": 4248, + "reset_limit": 9150, + "sync_width": 0, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Auriol", + "source_file": "auriol_ahfl.c" + }, + { + "device_id": "auriol_hg02832", + "name": "Auriol HG02832, HG05124A-DCF, Rubicson 48957 temperature/humidity sensor", + "modulation": "OOK", + "short_width": 252, + "long_width": 612, + "gap_limit": 750, + "reset_limit": 62990, + "sync_width": 860, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Auriol", + "source_file": "auriol_hg02832.c" + }, + { + "device_id": "orion_endpoint", + "name": "Orion Endpoint from Badger Meter, GIF2014W-OSE, water meter, hopping from 904.4 Mhz to 924.6Mhz (-s 1600k)", + "modulation": "FSK", + "short_width": 10, + "long_width": 10, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Orion", + "source_file": "badger_orion_endpoint.c" + }, + { + "device_id": "orion_endpoint_2020", + "name": "Orion Endpoint from Badger Meter, GIF2020OCECNA, water meter, hopping from 904.4 Mhz to 924.6Mhz (-s 1600k)", + "modulation": "FSK", + "short_width": 5, + "long_width": 5, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Orion", + "source_file": "badger_orion_endpoint.c" + }, + { + "device_id": "badger_orion", + "name": "Badger ORION water meter, 100kbps (-f 916.45M -s 1200k)", + "modulation": "FSK", + "short_width": 10, + "long_width": 10, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Badger", + "source_file": "badger_water.c" + }, + { + "device_id": "baldr_rain", + "name": "Baldr / RainPoint rain gauge.", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Baldr", + "source_file": "baldr_rain.c" + }, + { + "device_id": "baldr_therm", + "name": "Baldr E0666TH Thermo-Hygrometer", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Baldr", + "source_file": "baldr_therm.c" + }, + { + "device_id": "blueline", + "name": "BlueLine Innovations Power Cost Monitor", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": 2000, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "BlueLine", + "source_file": "blueline.c" + }, + { + "device_id": "blyss", + "name": "Blyss DC5-UK-WH", + "modulation": "OOK", + "short_width": 500, + "long_width": 1500, + "gap_limit": 2500, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Blyss", + "source_file": "blyss.c" + }, + { + "device_id": "bm5", + "name": "bm5-v2 12V Battery Monitor", + "modulation": "OOK", + "short_width": 225, + "long_width": 675, + "gap_limit": null, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "bm5-v2", + "source_file": "bm5.c" + }, + { + "device_id": "brennenstuhl_rcs_2044", + "name": "Brennenstuhl RCS 2044", + "modulation": "OOK", + "short_width": 320, + "long_width": 968, + "gap_limit": 1500, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Brennenstuhl", + "source_file": "brennenstuhl_rcs_2044.c" + }, + { + "device_id": "bresser_3ch", + "name": "Bresser Thermo-/Hygro-Sensor 3CH", + "modulation": "OOK", + "short_width": 250, + "long_width": 500, + "gap_limit": 625, + "reset_limit": 1250, + "sync_width": 750, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Bresser", + "source_file": "bresser_3ch.c" + }, + { + "device_id": "bresser_5in1", + "name": "Bresser Weather Center 5-in-1", + "modulation": "FSK", + "short_width": 124, + "long_width": 124, + "gap_limit": null, + "reset_limit": 25000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Bresser", + "source_file": "bresser_5in1.c" + }, + { + "device_id": "bresser_6in1", + "name": "Bresser Weather Center 6-in-1, 7-in-1 indoor, soil, new 5-in-1, 3-in-1 wind gauge, Froggit WH6000, Ventus C8488A", + "modulation": "FSK", + "short_width": 124, + "long_width": 124, + "gap_limit": null, + "reset_limit": 25000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Bresser", + "source_file": "bresser_6in1.c" + }, + { + "device_id": "bresser_7in1", + "name": "Bresser Weather Center 7-in-1, Air Quality PM2.5/PM10 7009970, CO2 7009977, HCHO/VOC 7009978 sensors", + "modulation": "FSK", + "short_width": 124, + "long_width": 124, + "gap_limit": null, + "reset_limit": 25000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Bresser", + "source_file": "bresser_7in1.c" + }, + { + "device_id": "bresser_leakage", + "name": "Bresser water leakage", + "modulation": "FSK", + "short_width": 124, + "long_width": 124, + "gap_limit": null, + "reset_limit": 25000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "energy", + "manufacturer": "Bresser", + "source_file": "bresser_leakage.c" + }, + { + "device_id": "bresser_lightning", + "name": "Bresser lightning", + "modulation": "FSK", + "short_width": 124, + "long_width": 124, + "gap_limit": null, + "reset_limit": 25000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "lighting", + "manufacturer": "Bresser", + "source_file": "bresser_lightning.c" + }, + { + "device_id": "bresser_st1005h", + "name": "Bresser Thermo-/Hygro-Sensor Explore Scientific ST1005H", + "modulation": "OOK", + "short_width": 2500, + "long_width": 4500, + "gap_limit": 4500, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Bresser", + "source_file": "bresser_st1005h.c" + }, + { + "device_id": "bt_rain", + "name": "Biltema rain gauge", + "modulation": "OOK", + "short_width": 1940, + "long_width": 3900, + "gap_limit": 4100, + "reset_limit": 8800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Biltema", + "source_file": "bt_rain.c" + }, + { + "device_id": "burnhardbbq", + "name": "Burnhard BBQ thermometer", + "modulation": "OOK", + "short_width": 240, + "long_width": 484, + "gap_limit": null, + "reset_limit": 848, + "sync_width": 840, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Burnhard", + "source_file": "burnhardbbq.c" + }, + { + "device_id": "calibeur_RF104", + "name": "Calibeur RF-104 Sensor", + "modulation": "OOK", + "short_width": 760, + "long_width": 2240, + "gap_limit": null, + "reset_limit": 3200, + "sync_width": 1560, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Calibeur", + "source_file": "calibeur.c" + }, + { + "device_id": "cardin", + "name": "Cardin S466-TX2", + "modulation": "OOK", + "short_width": 730, + "long_width": 1400, + "gap_limit": 1600, + "reset_limit": 32000, + "sync_width": 6150, + "tolerance": null, + "frequency": null, + "category": "automotive", + "manufacturer": "Cardin", + "source_file": "cardin.c" + }, + { + "device_id": "cavius", + "name": "Cavius smoke, heat and water detector", + "modulation": "FSK", + "short_width": 206, + "long_width": 206, + "gap_limit": 1000, + "reset_limit": 1000, + "sync_width": 2700, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Cavius", + "source_file": "cavius.c" + }, + { + "device_id": "ced7000", + "name": "CED7000 Shot Timer", + "modulation": "FSK", + "short_width": 1300, + "long_width": 1300, + "gap_limit": 3500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "CED7000", + "source_file": "ced7000.c" + }, + { + "device_id": "celsia_czc1", + "name": "Celsia CZC1 Thermostat", + "modulation": "OOK", + "short_width": 1220, + "long_width": 1220, + "gap_limit": null, + "reset_limit": 4880, + "sync_width": null, + "tolerance": 20, + "frequency": null, + "category": "weather", + "manufacturer": "Celsia", + "source_file": "celsia_czc1.c" + }, + { + "device_id": "chamberlain_cwpirc", + "name": "Chamberlain CWPIRC PIR Sensor", + "modulation": "FSK", + "short_width": 25, + "long_width": 25, + "gap_limit": null, + "reset_limit": 500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Chamberlain", + "source_file": "chamberlain_cwpirc.c" + }, + { + "device_id": "chuango", + "name": "Chuango Security Technology", + "modulation": "OOK", + "short_width": 568, + "long_width": 1704, + "gap_limit": null, + "reset_limit": 1800, + "sync_width": 0, + "tolerance": 160, + "frequency": null, + "category": "security", + "manufacturer": "Chuango", + "source_file": "chuango.c" + }, + { + "device_id": "cmr113", + "name": "Clipsal CMR113 Cent-a-meter power meter", + "modulation": "OOK", + "short_width": 480, + "long_width": 976, + "gap_limit": null, + "reset_limit": 2069, + "sync_width": 2028, + "tolerance": 200, + "frequency": null, + "category": "sensors", + "manufacturer": "Clipsal", + "source_file": "cmr113.c" + }, + { + "device_id": "companion_wtr001", + "name": "Companion WTR001 Temperature Sensor", + "modulation": "OOK", + "short_width": 732, + "long_width": 2196, + "gap_limit": 4000, + "reset_limit": 8000, + "sync_width": 1464, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Companion", + "source_file": "companion_wtr001.c" + }, + { + "device_id": "cotech_36_7959", + "name": "Cotech 36-7959, SwitchDocLabs FT020T wireless weather station with USB", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 500, + "long_width": 0, + "gap_limit": 1200, + "reset_limit": 1200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Cotech", + "source_file": "cotech_36_7959.c" + }, + { + "device_id": "current_cost", + "name": "CurrentCost Current Sensor", + "modulation": "FSK", + "short_width": 250, + "long_width": 250, + "gap_limit": null, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "CurrentCost", + "source_file": "current_cost.c" + }, + { + "device_id": "danfoss_CFR", + "name": "Danfoss CFR Thermostat", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Danfoss", + "source_file": "danfoss.c" + }, + { + "device_id": "deltadore_x3d", + "name": "DeltaDore X3D devices", + "modulation": "FSK", + "short_width": 25, + "long_width": 25, + "gap_limit": null, + "reset_limit": 800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "DeltaDore", + "source_file": "deltadore_x3d.c" + }, + { + "device_id": "digitech_xc0324", + "name": "Digitech XC-0324 / AmbientWeather FT005TH temp/hum sensor", + "modulation": "OOK", + "short_width": 520, + "long_width": 1000, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Digitech", + "source_file": "digitech_xc0324.c" + }, + { + "device_id": "directv", + "name": "DirecTV RC66RX Remote Control", + "modulation": "FSK", + "short_width": 600, + "long_width": 600, + "gap_limit": 30000, + "reset_limit": 50000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "DirecTV", + "source_file": "directv.c" + }, + { + "device_id": "dish_remote_6_3", + "name": "Dish remote 6.3", + "modulation": "OOK", + "short_width": 1692, + "long_width": 2812, + "gap_limit": 4500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "Dish", + "source_file": "dish_remote_6_3.c" + }, + { + "device_id": "dsc_security", + "name": "DSC Security Contact", + "modulation": "OOK_PULSE_RZ", + "short_width": 250, + "long_width": 500, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "DSC", + "source_file": "dsc.c" + }, + { + "device_id": "dsc_security_ws4945", + "name": "DSC Security Contact (WS4945)", + "modulation": "OOK_PULSE_RZ", + "short_width": 536, + "long_width": 1072, + "gap_limit": null, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "DSC", + "source_file": "dsc.c" + }, + { + "device_id": "ec3k", + "name": "Voltcraft EnergyCount 3000 (ec3k)", + "modulation": "FSK", + "short_width": 50, + "long_width": 50, + "gap_limit": 3000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": 5, + "frequency": null, + "category": "energy", + "manufacturer": "Voltcraft", + "source_file": "ec3k.c" + }, + { + "device_id": "ecodhome", + "name": "EcoDHOME Smart Socket and MCEE Solar monitor", + "modulation": "FSK", + "short_width": 250, + "long_width": 250, + "gap_limit": null, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "EcoDHOME", + "source_file": "ecodhome.c" + }, + { + "device_id": "ecowitt", + "name": "Ecowitt Wireless Outdoor Thermometer WH53/WH0280/WH0281A", + "modulation": "OOK", + "short_width": 500, + "long_width": 1480, + "gap_limit": 1500, + "reset_limit": 2000, + "sync_width": 0, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Ecowitt", + "source_file": "ecowitt.c" + }, + { + "device_id": "efergy_e2_classic", + "name": "Efergy e2 classic", + "modulation": "FSK", + "short_width": 64, + "long_width": 136, + "gap_limit": 200, + "reset_limit": 400, + "sync_width": 500, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Efergy", + "source_file": "efergy_e2_classic.c" + }, + { + "device_id": "efergy_optical", + "name": "Efergy Optical", + "modulation": "FSK", + "short_width": 64, + "long_width": 136, + "gap_limit": null, + "reset_limit": 400, + "sync_width": 500, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Efergy", + "source_file": "efergy_optical.c" + }, + { + "device_id": "eurochron_efth800", + "name": "Eurochron EFTH-800 temperature and humidity sensor", + "modulation": "OOK", + "short_width": 250, + "long_width": 500, + "gap_limit": 900, + "reset_limit": 5500, + "sync_width": 750, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Eurochron", + "source_file": "efth800.c" + }, + { + "device_id": "elro_db286a", + "name": "Elro DB286A Doorbell", + "modulation": "OOK", + "short_width": 456, + "long_width": 1448, + "gap_limit": 2000, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Elro", + "source_file": "elro_db286a.c" + }, + { + "device_id": "elv_em1000", + "name": "ELV EM 1000", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": 7250, + "reset_limit": 30000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "ELV", + "source_file": "elv.c" + }, + { + "device_id": "elv_ws2000", + "name": "ELV WS 2000", + "modulation": "OOK", + "short_width": 366, + "long_width": 854, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "ELV", + "source_file": "elv.c" + }, + { + "device_id": "emax", + "name": "Emax W6, rebrand Altronics x7063/4, Optex 990040/50/51, Orium 13093/13123, Infactory FWS-1200, Newentor Q9, Otio 810025, Protmex PT3390A, Jula Marquant 014331/32, TechniSat IMETEO X6 76-4924-00, Weather Station or temperature/humidity sensor", + "modulation": "FSK", + "short_width": 90, + "long_width": 90, + "gap_limit": null, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Emax", + "source_file": "emax.c" + }, + { + "device_id": "emontx", + "name": "emonTx OpenEnergyMonitor", + "modulation": "FSK", + "short_width": 2000000, + "long_width": 2000000, + "gap_limit": null, + "reset_limit": 1200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "emonTx", + "source_file": "emontx.c" + }, + { + "device_id": "emos_e6016", + "name": "EMOS E6016 weatherstation with DCF77", + "modulation": "OOK", + "short_width": 280, + "long_width": 796, + "gap_limit": 3000, + "reset_limit": 850, + "sync_width": 1836, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "EMOS", + "source_file": "emos_e6016.c" + }, + { + "device_id": "emos_e6016_rain", + "name": "EMOS E6016 rain gauge", + "modulation": "OOK", + "short_width": 300, + "long_width": 800, + "gap_limit": 1000, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "EMOS", + "source_file": "emos_e6016_rain.c" + }, + { + "device_id": "enocean_erp1", + "name": "EnOcean ERP1", + "modulation": "OOK", + "short_width": 8, + "long_width": 8, + "gap_limit": null, + "reset_limit": 800, + "sync_width": 0, + "tolerance": 1, + "frequency": null, + "category": "other", + "manufacturer": "EnOcean", + "source_file": "enocean_erp1.c" + }, + { + "device_id": "ert_idm", + "name": "ERT Interval Data Message (IDM)", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 30, + "long_width": 0, + "gap_limit": 20000, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "ERT", + "source_file": "ert_idm.c" + }, + { + "device_id": "ert_netidm", + "name": "ERT Interval Data Message (IDM) for Net Meters", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 30, + "long_width": 0, + "gap_limit": 20000, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "ERT", + "source_file": "ert_idm.c" + }, + { + "device_id": "ert_scm", + "name": "ERT Standard Consumption Message (SCM)", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 30, + "long_width": 0, + "gap_limit": 0, + "reset_limit": 64, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "ERT", + "source_file": "ert_scm.c" + }, + { + "device_id": "esa_energy", + "name": "ESA1000 / ESA2000 Energy Monitor", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 260, + "long_width": 0, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "ESA1000", + "source_file": "esa.c" + }, + { + "device_id": "esic_emt7110", + "name": "ESIC EMT7110 power meter", + "modulation": "FSK", + "short_width": 104, + "long_width": 104, + "gap_limit": null, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "ESIC", + "source_file": "esic_emt7110.c" + }, + { + "device_id": "esperanza_ews", + "name": "Esperanza EWS", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 4400, + "reset_limit": 9400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Esperanza", + "source_file": "esperanza_ews.c" + }, + { + "device_id": "eurochron", + "name": "Eurochron temperature and humidity sensor", + "modulation": "OOK", + "short_width": 1016, + "long_width": 2024, + "gap_limit": 2100, + "reset_limit": 8200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Eurochron", + "source_file": "eurochron.c" + }, + { + "device_id": "fineoffset_WH2", + "name": "Fine Offset Electronics, WH2, WH5, Telldus Temperature/Humidity/Rain Sensor", + "modulation": "OOK", + "short_width": 500, + "long_width": 1500, + "gap_limit": null, + "reset_limit": 1200, + "sync_width": null, + "tolerance": 160, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset.c" + }, + { + "device_id": "fineoffset_WH25", + "name": "Fine Offset Electronics, WH25, WH32, WH32B, WN32B, WH24, WH65B, HP1000, Misol WS2320 Temperature/Humidity/Pressure Sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset.c" + }, + { + "device_id": "fineoffset_WH51", + "name": "Fine Offset Electronics/ECOWITT WH51, SwitchDoc Labs SM23 Soil Moisture Sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "Fine", + "source_file": "fineoffset.c" + }, + { + "device_id": "fineoffset_WH0530", + "name": "Fine Offset Electronics, WH0530 Temperature/Rain Sensor", + "modulation": "OOK", + "short_width": 504, + "long_width": 1480, + "gap_limit": null, + "reset_limit": 1200, + "sync_width": 0, + "tolerance": 160, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset.c" + }, + { + "device_id": "fineoffset_wh1050", + "name": "Fine Offset WH1050 Weather Station", + "modulation": "OOK", + "short_width": 544, + "long_width": 1524, + "gap_limit": null, + "reset_limit": 10520, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_wh1050.c" + }, + { + "device_id": "tfa_303151", + "name": "TFA 30.3151 Weather Station", + "modulation": "FSK", + "short_width": 60, + "long_width": 60, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TFA", + "source_file": "fineoffset_wh1050.c" + }, + { + "device_id": "fineoffset_wh1080", + "name": "Fine Offset Electronics WH1080/WH3080 Weather Station", + "modulation": "OOK", + "short_width": 544, + "long_width": 1524, + "gap_limit": null, + "reset_limit": 2800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_wh1080.c" + }, + { + "device_id": "fineoffset_wh1080_fsk", + "name": "Fine Offset Electronics WH1080/WH3080 Weather Station (FSK)", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 5800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_wh1080.c" + }, + { + "device_id": "fineoffset_wh31l", + "name": "Ambient Weather WH31L (FineOffset WH57) Lightning-Strike sensor", + "modulation": "FSK", + "short_width": 56, + "long_width": 56, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Ambient", + "source_file": "fineoffset_wh31l.c" + }, + { + "device_id": "fineoffset_wh43", + "name": "Fine Offset Electronics WH43 air quality sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Fine", + "source_file": "fineoffset_wh43.c" + }, + { + "device_id": "fineoffset_wh45", + "name": "Fine Offset Electronics WH45 air quality sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Fine", + "source_file": "fineoffset_wh45.c" + }, + { + "device_id": "fineoffset_wh46", + "name": "Fine Offset Electronics WH46 air quality sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Fine", + "source_file": "fineoffset_wh46.c" + }, + { + "device_id": "fineoffset_wh55", + "name": "Fine Offset / Ecowitt WH55 water leak sensor", + "modulation": "FSK", + "short_width": 60, + "long_width": 60, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Fine", + "source_file": "fineoffset_wh55.c" + }, + { + "device_id": "fineoffset_wn34", + "name": "Fine Offset Electronics WN34S/L/D and Froggit DP150/D35 temperature sensor", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_wn34.c" + }, + { + "device_id": "fineoffset_ws80", + "name": "Fine Offset Electronics WS80 weather station", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_ws80.c" + }, + { + "device_id": "fineoffset_ws85", + "name": "Fine Offset Electronics WS85 weather station", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_ws85.c" + }, + { + "device_id": "fineoffset_ws90", + "name": "Fine Offset Electronics WS90 weather station", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Fine", + "source_file": "fineoffset_ws90.c" + }, + { + "device_id": "flowis", + "name": "Flowis flow meters", + "modulation": "FSK", + "short_width": 10, + "long_width": 10, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Flowis", + "source_file": "flowis.c" + }, + { + "device_id": "fordremote", + "name": "Ford Car Key", + "modulation": "OOK", + "short_width": 250, + "long_width": 500, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": 50, + "frequency": null, + "category": "automotive", + "manufacturer": "Ford", + "source_file": "fordremote.c" + }, + { + "device_id": "fs20", + "name": "FS20 / FHT", + "modulation": "OOK", + "short_width": 400, + "long_width": 600, + "gap_limit": null, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "FS20", + "source_file": "fs20.c" + }, + { + "device_id": "ft004b", + "name": "FT-004-B Temperature Sensor", + "modulation": "OOK", + "short_width": 1956, + "long_width": 3900, + "gap_limit": 4000, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "FT-004-B", + "source_file": "ft004b.c" + }, + { + "device_id": "funkbus_remote", + "name": "Funkbus / Instafunk (Berker, Gira, Jung)", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": 1500, + "reset_limit": 2000, + "sync_width": 4000, + "tolerance": 300, + "frequency": null, + "category": "other", + "manufacturer": "Funkbus", + "source_file": "funkbus.c" + }, + { + "device_id": "gasmate_ba1008", + "name": "Gasmate BA1008 meat thermometer", + "modulation": "OOK", + "short_width": 536, + "long_width": 1668, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Gasmate", + "source_file": "gasmate_ba1008.c" + }, + { + "device_id": "ge_coloreffects", + "name": "GE Color Effects", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 450, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "GE", + "source_file": "ge_coloreffects.c" + }, + { + "device_id": "geevon_tx16", + "name": "Geevon TX16-3 outdoor sensor", + "modulation": "OOK", + "short_width": 250, + "long_width": 500, + "gap_limit": 625, + "reset_limit": 1700, + "sync_width": 750, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Geevon", + "source_file": "geevon.c" + }, + { + "device_id": "geevon_tx19", + "name": "Geevon TX19-1 outdoor sensor", + "modulation": "OOK", + "short_width": 250, + "long_width": 500, + "gap_limit": 625, + "reset_limit": 1700, + "sync_width": 750, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Geevon", + "source_file": "geevon_tx19.c" + }, + { + "device_id": "generic_motion", + "name": "Generic wireless motion sensor", + "modulation": "OOK", + "short_width": 888, + "long_width": null, + "gap_limit": 1200, + "reset_limit": 2724, + "sync_width": 1784, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": null, + "source_file": "generic_motion.c" + }, + { + "device_id": "generic_remote", + "name": "Generic Remote SC226x EV1527", + "modulation": "OOK", + "short_width": 464, + "long_width": 1404, + "gap_limit": null, + "reset_limit": 1800, + "sync_width": 0, + "tolerance": 200, + "frequency": null, + "category": "home_automation", + "manufacturer": null, + "source_file": "generic_remote.c" + }, + { + "device_id": "generic_temperature_sensor", + "name": "Generic temperature sensor 1", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 4800, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": null, + "source_file": "generic_temperature_sensor.c" + }, + { + "device_id": "geo_minim", + "name": "GEO minim+ energy monitor", + "modulation": "FSK", + "short_width": 24, + "long_width": 24, + "gap_limit": null, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "GEO", + "source_file": "geo_minim.c" + }, + { + "device_id": "govee", + "name": "Govee Water Leak Detector H5054, Door Contact Sensor B5023", + "modulation": "OOK", + "short_width": 440, + "long_width": 940, + "gap_limit": 900, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Govee", + "source_file": "govee.c" + }, + { + "device_id": "govee_h5054", + "name": "Govee Water Leak Detector H5054", + "modulation": "OOK", + "short_width": 440, + "long_width": 940, + "gap_limit": 900, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Govee", + "source_file": "govee.c" + }, + { + "device_id": "gridstream96", + "name": "Landis & Gyr Gridstream Power Meters 9.6k", + "modulation": "FSK", + "short_width": 104, + "long_width": 104, + "gap_limit": null, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Landis", + "source_file": "gridstream.c" + }, + { + "device_id": "gridstream192", + "name": "Landis & Gyr Gridstream Power Meters 19.2k", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Landis", + "source_file": "gridstream.c" + }, + { + "device_id": "gridstream384", + "name": "Landis & Gyr Gridstream Power Meters 38.4k", + "modulation": "FSK", + "short_width": 22, + "long_width": 22, + "gap_limit": null, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Landis", + "source_file": "gridstream.c" + }, + { + "device_id": "gt_tmbbq05", + "name": "Globaltronics QUIGG GT-TMBBQ-05", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 4200, + "reset_limit": 9100, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Globaltronics", + "source_file": "gt_tmbbq05.c" + }, + { + "device_id": "gt_wt_02", + "name": "Globaltronics GT-WT-02 Sensor", + "modulation": "OOK", + "short_width": 2500, + "long_width": 5000, + "gap_limit": 8000, + "reset_limit": 12000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Globaltronics", + "source_file": "gt_wt_02.c" + }, + { + "device_id": "gt_wt_03", + "name": "Globaltronics GT-WT-03 Sensor", + "modulation": "OOK", + "short_width": 256, + "long_width": 625, + "gap_limit": 1000, + "reset_limit": 61000, + "sync_width": 855, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Globaltronics", + "source_file": "gt_wt_03.c" + }, + { + "device_id": "hcs200", + "name": "Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes", + "modulation": "OOK", + "short_width": 370, + "long_width": 772, + "gap_limit": 1500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": 152, + "frequency": null, + "category": "home_automation", + "manufacturer": "Microchip", + "source_file": "hcs200.c" + }, + { + "device_id": "hcs200_fsk", + "name": "Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)", + "modulation": "FSK", + "short_width": 370, + "long_width": 772, + "gap_limit": 1500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": 152, + "frequency": null, + "category": "home_automation", + "manufacturer": "Microchip", + "source_file": "hcs200.c" + }, + { + "device_id": "hideki_ts04", + "name": "HIDEKI TS04 Temperature, Humidity, Wind and Rain Sensor", + "modulation": "OOK", + "short_width": 520, + "long_width": 1040, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": 240, + "frequency": null, + "category": "weather", + "manufacturer": "HIDEKI", + "source_file": "hideki.c" + }, + { + "device_id": "holman_ws5029pcm", + "name": "AOK Weather Station rebrand Holman Industries iWeather WS5029, Conrad AOK-5056, Optex 990018", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 19200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "AOK", + "source_file": "holman_ws5029.c" + }, + { + "device_id": "holman_ws5029pwm", + "name": "Holman Industries iWeather WS5029 weather station (older PWM)", + "modulation": "FSK", + "short_width": 488, + "long_width": 976, + "gap_limit": 2000, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Holman", + "source_file": "holman_ws5029.c" + }, + { + "device_id": "homelead_hg9901", + "name": "Homelead HG9901 (Geevon, Dr.Meter, Royal Gardineer) soil moisture/temp/light level sensor", + "modulation": "OOK", + "short_width": 432, + "long_width": 1228, + "gap_limit": 2000, + "reset_limit": 4500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Homelead", + "source_file": "homelead_hg9901.c" + }, + { + "device_id": "hondaremote", + "name": "Honda Car Key", + "modulation": "FSK", + "short_width": 250, + "long_width": 500, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "automotive", + "manufacturer": "Honda", + "source_file": "hondaremote.c" + }, + { + "device_id": "honeywell", + "name": "Honeywell Door/Window Sensor, 2Gig DW10/DW11, RE208 repeater", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 156, + "long_width": 0, + "gap_limit": null, + "reset_limit": 292, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Honeywell", + "source_file": "honeywell.c" + }, + { + "device_id": "honeywell_cm921", + "name": "Honeywell CM921 Wireless Programmable Room Thermostat", + "modulation": "FSK", + "short_width": 26, + "long_width": 26, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": 0, + "tolerance": 5, + "frequency": null, + "category": "weather", + "manufacturer": "Honeywell", + "source_file": "honeywell_cm921.c" + }, + { + "device_id": "honeywell_wdb", + "name": "Honeywell ActivLink, Wireless Doorbell", + "modulation": "OOK", + "short_width": 175, + "long_width": 340, + "gap_limit": 0, + "reset_limit": 5000, + "sync_width": 500, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Honeywell", + "source_file": "honeywell_wdb.c" + }, + { + "device_id": "honeywell_wdb_fsk", + "name": "Honeywell ActivLink, Wireless Doorbell (FSK)", + "modulation": "FSK", + "short_width": 160, + "long_width": 320, + "gap_limit": 0, + "reset_limit": 560, + "sync_width": 500, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Honeywell", + "source_file": "honeywell_wdb.c" + }, + { + "device_id": "ht680", + "name": "HT680 Remote control", + "modulation": "OOK", + "short_width": 200, + "long_width": 600, + "gap_limit": 1200, + "reset_limit": 14000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "HT680", + "source_file": "ht680.c" + }, + { + "device_id": "ibis_beacon", + "name": "IBIS beacon", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 30, + "long_width": 0, + "gap_limit": null, + "reset_limit": 100, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "IBIS", + "source_file": "ibis_beacon.c" + }, + { + "device_id": "ikea_sparsnas", + "name": "IKEA Sparsnas Energy Meter Monitor", + "modulation": "FSK", + "short_width": 27, + "long_width": 27, + "gap_limit": 1000, + "reset_limit": 3000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "IKEA", + "source_file": "ikea_sparsnas.c" + }, + { + "device_id": "infactory", + "name": "inFactory, nor-tec, FreeTec NC-3982-913 temperature humidity sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": 500, + "tolerance": 750, + "frequency": null, + "category": "weather", + "manufacturer": "inFactory,", + "source_file": "infactory.c" + }, + { + "device_id": "inkbird_ith20r", + "name": "Inkbird ITH-20R temperature humidity sensor", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Inkbird", + "source_file": "inkbird_ith20r.c" + }, + { + "device_id": "kw9015b", + "name": "Inovalley kw9015b, TFA Dostmann 30.3161 (Rain and temperature sensor)", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 4800, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Inovalley", + "source_file": "inovalley-kw9015b.c" + }, + { + "device_id": "insteon", + "name": "Insteon", + "modulation": "FSK", + "short_width": 110, + "long_width": 110, + "gap_limit": 500, + "reset_limit": 1000, + "sync_width": null, + "tolerance": 15, + "frequency": null, + "category": "other", + "manufacturer": "Insteon", + "source_file": "insteon.c" + }, + { + "device_id": "interlogix", + "name": "Interlogix GE UTC Security Devices", + "modulation": "OOK", + "short_width": 122, + "long_width": 244, + "gap_limit": null, + "reset_limit": 500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Interlogix", + "source_file": "interlogix.c" + }, + { + "device_id": "intertechno", + "name": "Intertechno 433", + "modulation": "OOK", + "short_width": 330, + "long_width": 1400, + "gap_limit": 1700, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Intertechno", + "source_file": "intertechno.c" + }, + { + "device_id": "jasco", + "name": "Jasco/GE Choice Alert Security Devices", + "modulation": "OOK", + "short_width": 250, + "long_width": 250, + "gap_limit": null, + "reset_limit": 1800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Jasco/GE", + "source_file": "jasco.c" + }, + { + "device_id": "kedsum", + "name": "Kedsum Temperature & Humidity Sensor, Pearl NC-7415", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 4400, + "reset_limit": 9400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Kedsum", + "source_file": "kedsum.c" + }, + { + "device_id": "kerui", + "name": "Kerui PIR / Contact Sensor", + "modulation": "OOK", + "short_width": 420, + "long_width": 960, + "gap_limit": 1100, + "reset_limit": 9900, + "sync_width": null, + "tolerance": 160, + "frequency": null, + "category": "security", + "manufacturer": "Kerui", + "source_file": "kerui.c" + }, + { + "device_id": "klimalogg", + "name": "Klimalogg", + "modulation": "OOK_PULSE_NRZS", + "short_width": 26, + "long_width": 0, + "gap_limit": 0, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Klimalogg", + "source_file": "klimalogg.c" + }, + { + "device_id": "lacrossetx", + "name": "LaCrosse TX Temperature / Humidity Sensor", + "modulation": "OOK", + "short_width": 550, + "long_width": 1400, + "gap_limit": 3000, + "reset_limit": 8000, + "sync_width": 0, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse.c" + }, + { + "device_id": "lacrosse_breezepro", + "name": "LaCrosse Technology View LTV-WSDTH01 Breeze Pro Wind Sensor", + "modulation": "FSK", + "short_width": 107, + "long_width": 107, + "gap_limit": null, + "reset_limit": 5900, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_breezepro.c" + }, + { + "device_id": "lacrosse_r1", + "name": "LaCrosse Technology View LTV-R1, LTV-R3 Rainfall Gauge, LTV-W1/W2 Wind Sensor", + "modulation": "FSK", + "short_width": 104, + "long_width": 104, + "gap_limit": null, + "reset_limit": 9600, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_r1.c" + }, + { + "device_id": "lacrosse_th3", + "name": "LaCrosse Technology View LTV-TH Thermo/Hygro Sensor", + "modulation": "FSK", + "short_width": 104, + "long_width": 104, + "gap_limit": null, + "reset_limit": 9600, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_th3.c" + }, + { + "device_id": "lacrosse_tx141x", + "name": "LaCrosse TX141-Bv2, TX141TH-Bv2, TX141-Bv3, TX141W, TX145wsdth, (TFA, ORIA) sensor", + "modulation": "OOK", + "short_width": 208, + "long_width": 417, + "gap_limit": 625, + "reset_limit": 1700, + "sync_width": 833, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_tx141x.c" + }, + { + "device_id": "lacrosse_tx31u", + "name": "LaCrosse TX31U-IT, The Weather Channel WS-1910TWC-IT", + "modulation": "FSK", + "short_width": 116, + "long_width": 116, + "gap_limit": null, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_tx31u.c" + }, + { + "device_id": "lacrosse_tx34", + "name": "LaCrosse TX34-IT rain gauge", + "modulation": "FSK", + "short_width": 58, + "long_width": 58, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_tx34.c" + }, + { + "device_id": "lacrosse_tx29", + "name": "LaCrosse TX29IT, TFA Dostmann 30.3159.IT Temperature sensor", + "modulation": "FSK", + "short_width": 55, + "long_width": 55, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_tx35.c" + }, + { + "device_id": "lacrosse_tx35", + "name": "LaCrosse TX35DTH-IT, TFA Dostmann 30.3155 Temperature/Humidity sensor", + "modulation": "FSK", + "short_width": 105, + "long_width": 105, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_tx35.c" + }, + { + "device_id": "lacrosse_wr1", + "name": "LaCrosse Technology View LTV-WR1 Multi Sensor", + "modulation": "FSK", + "short_width": 104, + "long_width": 104, + "gap_limit": null, + "reset_limit": 9600, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "LaCrosse", + "source_file": "lacrosse_wr1.c" + }, + { + "device_id": "lacrosse_ws7000", + "name": "LaCrosse/ELV/Conrad WS7000/WS2500 weather sensors", + "modulation": "OOK", + "short_width": 400, + "long_width": 800, + "gap_limit": null, + "reset_limit": 1100, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse/ELV/Conrad", + "source_file": "lacrosse_ws7000.c" + }, + { + "device_id": "lacrossews", + "name": "LaCrosse WS-2310 / WS-3600 Weather Station", + "modulation": "OOK", + "short_width": 368, + "long_width": 1464, + "gap_limit": null, + "reset_limit": 8000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "LaCrosse", + "source_file": "lacrossews.c" + }, + { + "device_id": "lightwave_rf", + "name": "LightwaveRF", + "modulation": "OOK", + "short_width": 250, + "long_width": 1250, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "lighting", + "manufacturer": "LightwaveRF", + "source_file": "lightwave_rf.c" + }, + { + "device_id": "m_bus_mode_c_t", + "name": "Wireless M-Bus, Mode C&T, 100kbps (-f 868.95M -s 1200k)", + "modulation": "FSK", + "short_width": 10, + "long_width": 10, + "gap_limit": null, + "reset_limit": 500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": null, + "source_file": "m_bus.c" + }, + { + "device_id": "m_bus_mode_c_t_downlink", + "name": "Wireless M-Bus, Mode T, 32.768kbps (-f 868.3M -s 1000k)", + "modulation": "FSK", + "short_width": null, + "long_width": null, + "gap_limit": null, + "reset_limit": null, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": null, + "source_file": "m_bus.c" + }, + { + "device_id": "m_bus_mode_s", + "name": "Wireless M-Bus, Mode S, 32.768kbps (-f 868.3M -s 1000k)", + "modulation": "FSK", + "short_width": null, + "long_width": null, + "gap_limit": null, + "reset_limit": null, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": null, + "source_file": "m_bus.c" + }, + { + "device_id": "m_bus_mode_r", + "name": "Wireless M-Bus, Mode R, 4.8kbps (-f 868.33M)", + "modulation": "FSK_PULSE_MANCHESTER_ZEROBIT", + "short_width": null, + "long_width": 0, + "gap_limit": null, + "reset_limit": null, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": null, + "source_file": "m_bus.c" + }, + { + "device_id": "m_bus_mode_f", + "name": "Wireless M-Bus, Mode F, 2.4kbps", + "modulation": "FSK", + "short_width": 1000, + "long_width": 1000, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": null, + "source_file": "m_bus.c" + }, + { + "device_id": "markisol", + "name": "Markisol, E-Motion, BOFU, Rollerhouse, BF-30x, BF-415 curtain remote", + "modulation": "OOK", + "short_width": 368, + "long_width": 704, + "gap_limit": 2000, + "reset_limit": 2000, + "sync_width": 5628, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Markisol,", + "source_file": "markisol.c" + }, + { + "device_id": "marlec_solar", + "name": "Marlec Solar iBoost+ sensors", + "modulation": "FSK", + "short_width": 20, + "long_width": 20, + "gap_limit": null, + "reset_limit": 300, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Marlec", + "source_file": "marlec_solar.c" + }, + { + "device_id": "maverick_et73", + "name": "Maverick ET73", + "modulation": "OOK", + "short_width": 1050, + "long_width": 2050, + "gap_limit": 2200, + "reset_limit": 4400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Maverick", + "source_file": "maverick_et73.c" + }, + { + "device_id": "maverick_et73x", + "name": "Maverick ET-732/733 BBQ Sensor", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 230, + "long_width": 0, + "gap_limit": 1000, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Maverick", + "source_file": "maverick_et73x.c" + }, + { + "device_id": "maverick_xr30", + "name": "Maverick XR-30 BBQ Sensor", + "modulation": "FSK", + "short_width": 360, + "long_width": 360, + "gap_limit": null, + "reset_limit": 4096, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Maverick", + "source_file": "maverick_xr30.c" + }, + { + "device_id": "maverick_xr50", + "name": "Maverick XR-50 BBQ Sensor", + "modulation": "FSK", + "short_width": 107, + "long_width": 107, + "gap_limit": null, + "reset_limit": 2200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Maverick", + "source_file": "maverick_xr50.c" + }, + { + "device_id": "mebus433", + "name": "Mebus 433", + "modulation": "OOK", + "short_width": 800, + "long_width": 1600, + "gap_limit": 2400, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Mebus", + "source_file": "mebus.c" + }, + { + "device_id": "megacode", + "name": "Linear Megacode Garage/Gate Remotes", + "modulation": "OOK", + "short_width": 1000, + "long_width": 1000, + "gap_limit": 9000, + "reset_limit": 20000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "Linear", + "source_file": "megacode.c" + }, + { + "device_id": "missil_ml0757", + "name": "Missil ML0757 weather station", + "modulation": "OOK", + "short_width": 975, + "long_width": 1950, + "gap_limit": 2500, + "reset_limit": 4500, + "sync_width": null, + "tolerance": 100, + "frequency": null, + "category": "weather", + "manufacturer": "Missil", + "source_file": "missil_ml0757.c" + }, + { + "device_id": "mueller_hotrod", + "name": "Mueller Hot Rod water meter", + "modulation": "FSK", + "short_width": 26, + "long_width": 26, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Mueller", + "source_file": "mueller_hotrod.c" + }, + { + "device_id": "neptune_r900", + "name": "Neptune R900 flow meters", + "modulation": "OOK", + "short_width": 30, + "long_width": 30, + "gap_limit": null, + "reset_limit": 320, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Neptune", + "source_file": "neptune_r900.c" + }, + { + "device_id": "new_template", + "name": "Template decoder", + "modulation": "OOK", + "short_width": 132, + "long_width": 224, + "gap_limit": 300, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Template", + "source_file": "new_template.c" + }, + { + "device_id": "newkaku", + "name": "KlikAanKlikUit Wireless Switch", + "modulation": "OOK", + "short_width": 300, + "long_width": 1400, + "gap_limit": null, + "reset_limit": 3200, + "sync_width": 2650, + "tolerance": 200, + "frequency": null, + "category": "home_automation", + "manufacturer": "KlikAanKlikUit", + "source_file": "newkaku.c" + }, + { + "device_id": "nexa", + "name": "Nexa", + "modulation": "OOK", + "short_width": 270, + "long_width": 1300, + "gap_limit": 1500, + "reset_limit": 2800, + "sync_width": 2650, + "tolerance": 200, + "frequency": null, + "category": "other", + "manufacturer": "Nexa", + "source_file": "nexa.c" + }, + { + "device_id": "nexus", + "name": "Nexus, FreeTec NC-7345, NX-3980, Solight TE82S, TFA 30.3209 temperature/humidity sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Nexus,", + "source_file": "nexus.c" + }, + { + "device_id": "nexus_sauna", + "name": "Nexus, CRX, Prego sauna temperature sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Nexus,", + "source_file": "nexus.c" + }, + { + "device_id": "nice_flor_s", + "name": "Nice Flor-s remote control for gates", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": 2000, + "reset_limit": 5000, + "sync_width": 1500, + "tolerance": 100, + "frequency": null, + "category": "home_automation", + "manufacturer": "Nice", + "source_file": "nice_flor_s.c" + }, + { + "device_id": "norgo", + "name": "Norgo NGE101", + "modulation": "OOK", + "short_width": 486, + "long_width": 972, + "gap_limit": null, + "reset_limit": 2100, + "sync_width": 0, + "tolerance": 120, + "frequency": null, + "category": "other", + "manufacturer": "Norgo", + "source_file": "norgo.c" + }, + { + "device_id": "oil_smart", + "name": "Oil Ultrasonic SMART FSK", + "modulation": "FSK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Oil", + "source_file": "oil_smart.c" + }, + { + "device_id": "oil_standard", + "name": "Oil Ultrasonic STANDARD FSK", + "modulation": "FSK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Oil", + "source_file": "oil_standard.c" + }, + { + "device_id": "oil_standard_ask", + "name": "Oil Ultrasonic STANDARD ASK", + "modulation": "OOK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Oil", + "source_file": "oil_standard.c" + }, + { + "device_id": "oil_watchman", + "name": "Watchman Sonic / Apollo Ultrasonic / Beckett Rocket oil tank monitor", + "modulation": "FSK", + "short_width": 1000, + "long_width": 1000, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Watchman", + "source_file": "oil_watchman.c" + }, + { + "device_id": "oil_watchman_advanced", + "name": "Watchman Sonic Advanced / Plus, Tekelek", + "modulation": "FSK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 12500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Watchman", + "source_file": "oil_watchman_advanced.c" + }, + { + "device_id": "opus_xt300", + "name": "Opus/Imagintronix XT300 Soil Moisture", + "modulation": "OOK", + "short_width": 544, + "long_width": 932, + "gap_limit": 10000, + "reset_limit": 31000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Opus/Imagintronix", + "source_file": "opus_xt300.c" + }, + { + "device_id": "oregon_scientific", + "name": "Oregon Scientific Weather Sensor", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 440, + "long_width": 0, + "gap_limit": null, + "reset_limit": 2400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Oregon", + "source_file": "oregon_scientific.c" + }, + { + "device_id": "oregon_scientific_sl109h", + "name": "Oregon Scientific SL109H Remote Thermal Hygro Sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 5000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Oregon", + "source_file": "oregon_scientific_sl109h.c" + }, + { + "device_id": "oregon_scientific_v1", + "name": "OSv1 Temperature Sensor", + "modulation": "OOK_PULSE_PWM_OSV1", + "short_width": 1465, + "long_width": null, + "gap_limit": 3500, + "reset_limit": 14000, + "sync_width": 5780, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "OSv1", + "source_file": "oregon_scientific_v1.c" + }, + { + "device_id": "oria_wa150km", + "name": "Oria WA150KM freezer and fridge thermometer", + "modulation": "OOK", + "short_width": 490, + "long_width": 490, + "gap_limit": 1500, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Oria", + "source_file": "oria_wa150km.c" + }, + { + "device_id": "philips_aj3650", + "name": "Philips outdoor temperature sensor (type AJ3650)", + "modulation": "OOK", + "short_width": 2000, + "long_width": 6000, + "gap_limit": 8000, + "reset_limit": 30000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Philips", + "source_file": "philips_aj3650.c" + }, + { + "device_id": "philips_aj7010", + "name": "Philips outdoor temperature sensor (type AJ7010)", + "modulation": "OOK", + "short_width": 2000, + "long_width": 6000, + "gap_limit": null, + "reset_limit": 30000, + "sync_width": 1000, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Philips", + "source_file": "philips_aj7010.c" + }, + { + "device_id": "proflame2", + "name": "SmartFire Proflame 2 remote control", + "modulation": "OOK", + "short_width": 417, + "long_width": 417, + "gap_limit": 1000, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "SmartFire", + "source_file": "proflame2.c" + }, + { + "device_id": "prologue", + "name": "Prologue, FreeTec NC-7104, NC-7159-675 temperature sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 7000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Prologue,", + "source_file": "prologue.c" + }, + { + "device_id": "proove", + "name": "Proove / Nexa / KlikAanKlikUit Wireless Switch", + "modulation": "OOK", + "short_width": 270, + "long_width": 1300, + "gap_limit": 1500, + "reset_limit": 2800, + "sync_width": 2650, + "tolerance": 200, + "frequency": null, + "category": "home_automation", + "manufacturer": "Proove", + "source_file": "proove.c" + }, + { + "device_id": "quhwa", + "name": "Quhwa", + "modulation": "OOK", + "short_width": 360, + "long_width": 1070, + "gap_limit": 1200, + "reset_limit": 6600, + "sync_width": 0, + "tolerance": 80, + "frequency": null, + "category": "other", + "manufacturer": "Quhwa", + "source_file": "quhwa.c" + }, + { + "device_id": "quinetic", + "name": "Quinetic", + "modulation": "FSK", + "short_width": 10, + "long_width": 10, + "gap_limit": null, + "reset_limit": 120, + "sync_width": null, + "tolerance": 1, + "frequency": null, + "category": "other", + "manufacturer": "Quinetic", + "source_file": "quinetic.c" + }, + { + "device_id": "radiohead_ask", + "name": "Radiohead ASK", + "modulation": "OOK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 5, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Radiohead", + "source_file": "radiohead_ask.c" + }, + { + "device_id": "sensible_living", + "name": "Sensible Living Mini-Plant Moisture Sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 1000, + "gap_limit": null, + "reset_limit": 5, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Sensible", + "source_file": "radiohead_ask.c" + }, + { + "device_id": "rainpoint", + "name": "RainPoint soil temperature and moisture sensor", + "modulation": "OOK", + "short_width": 500, + "long_width": 500, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "RainPoint", + "source_file": "rainpoint.c" + }, + { + "device_id": "rainpoint_hcs012arf", + "name": "RainPoint HCS012ARF Rain Gauge sensor", + "modulation": "OOK", + "short_width": 320, + "long_width": 320, + "gap_limit": 700, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "RainPoint", + "source_file": "rainpoint_hcs012arf.c" + }, + { + "device_id": "regency_fan", + "name": "Regency Ceiling Fan Remote (-f 303.75M to 303.96M)", + "modulation": "OOK", + "short_width": 580, + "long_width": 976, + "gap_limit": 8000, + "reset_limit": 14000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "Regency", + "source_file": "regency_fan.c" + }, + { + "device_id": "revolt_nc5462", + "name": "Revolt NC-5642 Energy Meter", + "modulation": "OOK", + "short_width": 200, + "long_width": 320, + "gap_limit": null, + "reset_limit": 272, + "sync_width": 10024, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Revolt", + "source_file": "revolt_nc5462.c" + }, + { + "device_id": "revolt_zx7717", + "name": "Revolt ZX-7717 power meter", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 310, + "long_width": 310, + "gap_limit": null, + "reset_limit": 900, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "sensors", + "manufacturer": "Revolt", + "source_file": "revolt_zx7717.c" + }, + { + "device_id": "rftech", + "name": "RF-tech", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 5000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "RF-tech", + "source_file": "rftech.c" + }, + { + "device_id": "risco_agility", + "name": "Risco 2 Way Agility protocol, Risco PIR/PET Sensor RWX95P", + "modulation": "OOK", + "short_width": 175, + "long_width": 175, + "gap_limit": null, + "reset_limit": 1000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Risco", + "source_file": "risco_agility.c" + }, + { + "device_id": "rojaflex", + "name": "RojaFlex shutter and remote devices", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 102400, + "sync_width": 0, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "RojaFlex", + "source_file": "rojaflex.c" + }, + { + "device_id": "rosstech_dcu706", + "name": "Rosstech Digital Control Unit DCU-706/Sundance/Jacuzzi", + "modulation": "OOK", + "short_width": 200, + "long_width": 200, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Rosstech", + "source_file": "rosstech_dcu706.c" + }, + { + "device_id": "rubicson", + "name": "Rubicson, TFA 30.3197 or InFactory PT-310 Temperature Sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 3000, + "reset_limit": 4800, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Rubicson,", + "source_file": "rubicson.c" + }, + { + "device_id": "rubicson_48659", + "name": "Rubicson 48659 Thermometer", + "modulation": "OOK", + "short_width": 940, + "long_width": 1900, + "gap_limit": 2000, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Rubicson", + "source_file": "rubicson_48659.c" + }, + { + "device_id": "rubicson_pool_48942", + "name": "Rubicson Pool Thermometer 48942", + "modulation": "OOK", + "short_width": 280, + "long_width": 480, + "gap_limit": 5000, + "reset_limit": 6000, + "sync_width": 730, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Rubicson", + "source_file": "rubicson_pool_48942.c" + }, + { + "device_id": "s3318p", + "name": "Conrad S3318P, FreeTec NC-5849-913 temperature humidity sensor, ORIA WA50 ST389 temperature sensor", + "modulation": "OOK", + "short_width": 1900, + "long_width": 3800, + "gap_limit": 4400, + "reset_limit": 9400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Conrad", + "source_file": "s3318p.c" + }, + { + "device_id": "schou_72543_rain", + "name": "Schou 72543 Day Rain Gauge, Motonet MTX Rain, MarQuant Rain Gauge, TFA Dostmann 30.3252.01/47.3006.01 Rain Gauge and Thermometer, ADE WS1907", + "modulation": "OOK", + "short_width": 972, + "long_width": 2680, + "gap_limit": null, + "reset_limit": 2712, + "sync_width": 7328, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Schou", + "source_file": "schou_72543_rain.c" + }, + { + "device_id": "schraeder", + "name": "Schrader TPMS", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 120, + "long_width": 0, + "gap_limit": null, + "reset_limit": 480, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Schrader", + "source_file": "schraeder.c" + }, + { + "device_id": "schrader_EG53MA4", + "name": "Schrader TPMS EG53MA4, Saab, Opel, Vauxhall, Chevrolet", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 123, + "long_width": 0, + "gap_limit": null, + "reset_limit": 300, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Schrader", + "source_file": "schraeder.c" + }, + { + "device_id": "schrader_SMD3MA4", + "name": "Schrader TPMS SMD3MA4 (Subaru) 3039 (Infiniti, Nissan, Renault)", + "modulation": "OOK", + "short_width": 120, + "long_width": 120, + "gap_limit": null, + "reset_limit": 480, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Schrader", + "source_file": "schraeder.c" + }, + { + "device_id": "scmplus", + "name": "Standard Consumption Message Plus (SCMplus)", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 30, + "long_width": 0, + "gap_limit": 0, + "reset_limit": 64, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Standard", + "source_file": "scmplus.c" + }, + { + "device_id": "secplus_v1", + "name": "Security+ (Keyfob)", + "modulation": "OOK", + "short_width": 500, + "long_width": 500, + "gap_limit": 15000, + "reset_limit": 80000, + "sync_width": null, + "tolerance": 20, + "frequency": null, + "category": "automotive", + "manufacturer": "Security+", + "source_file": "secplus_v1.c" + }, + { + "device_id": "secplus_v2", + "name": "Security+ 2.0 (Keyfob)", + "modulation": "OOK", + "short_width": 250, + "long_width": 250, + "gap_limit": 1500, + "reset_limit": 9000, + "sync_width": null, + "tolerance": 50, + "frequency": null, + "category": "automotive", + "manufacturer": "Security+", + "source_file": "secplus_v2.c" + }, + { + "device_id": "sharp_spc775", + "name": "Sharp SPC775 weather station", + "modulation": "FSK", + "short_width": 225, + "long_width": 425, + "gap_limit": 2900, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Sharp", + "source_file": "sharp_spc775.c" + }, + { + "device_id": "silvercrest", + "name": "Silvercrest Remote Control", + "modulation": "OOK", + "short_width": 264, + "long_width": 744, + "gap_limit": 5000, + "reset_limit": 12000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "Silvercrest", + "source_file": "silvercrest.c" + }, + { + "device_id": "ss_sensor", + "name": "SimpliSafe Home Security System (May require disabling automatic gain for KeyPad decodes)", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": null, + "reset_limit": 2200, + "sync_width": null, + "tolerance": 100, + "frequency": null, + "category": "automotive", + "manufacturer": "SimpliSafe", + "source_file": "simplisafe.c" + }, + { + "device_id": "simplisafe_gen3", + "name": "SimpliSafe Gen 3 Home Security System", + "modulation": "FSK", + "short_width": 208, + "long_width": 208, + "gap_limit": null, + "reset_limit": 7000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "SimpliSafe", + "source_file": "simplisafe_gen3.c" + }, + { + "device_id": "smoke_gs558", + "name": "Wireless Smoke and Heat Detector GS 558", + "modulation": "OOK", + "short_width": 436, + "long_width": 1202, + "gap_limit": 1299, + "reset_limit": 11764, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": null, + "source_file": "smoke_gs558.c" + }, + { + "device_id": "solight_te44", + "name": "Solight TE44/TE66, EMOS E0107T, NX-6876-917", + "modulation": "OOK", + "short_width": 972, + "long_width": 1932, + "gap_limit": 3000, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "lighting", + "manufacturer": "Solight", + "source_file": "solight_te44.c" + }, + { + "device_id": "somfy_iohc", + "name": "Somfy io-homecontrol", + "modulation": "FSK", + "short_width": 26, + "long_width": 26, + "gap_limit": null, + "reset_limit": 300, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Somfy", + "source_file": "somfy_iohc.c" + }, + { + "device_id": "somfy_rts", + "name": "Somfy RTS", + "modulation": "OOK", + "short_width": 604, + "long_width": 604, + "gap_limit": 3000, + "reset_limit": 10000, + "sync_width": 2416, + "tolerance": 20, + "frequency": null, + "category": "other", + "manufacturer": "Somfy", + "source_file": "somfy_rts.c" + }, + { + "device_id": "springfield", + "name": "Springfield Temperature and Soil Moisture", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 5000, + "reset_limit": 9200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Springfield", + "source_file": "springfield.c" + }, + { + "device_id": "srsmith_pool_srs_2c_tx", + "name": "SRSmith Pool Light Remote Control SRS-2C-TX (-f 915M)", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 4096, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "home_automation", + "manufacturer": "SRSmith", + "source_file": "srsmith_pool_srs_2c_tx.c" + }, + { + "device_id": "steelmate", + "name": "Steelmate TPMS", + "modulation": "FSK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 50, + "long_width": 50, + "gap_limit": null, + "reset_limit": 120, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Steelmate", + "source_file": "steelmate.c" + }, + { + "device_id": "telldus_ft0385r", + "name": "Telldus weather station FT0385R sensors", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 500, + "long_width": 0, + "gap_limit": 1200, + "reset_limit": 2400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Telldus", + "source_file": "telldus_ft0385r.c" + }, + { + "device_id": "tfa_14_1504_v2", + "name": "TFA Dostmann 14.1504.V2 Radio-controlled grill and meat thermometer", + "modulation": "FSK", + "short_width": 360, + "long_width": 360, + "gap_limit": null, + "reset_limit": 4096, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TFA", + "source_file": "tfa_14_1504_v2.c" + }, + { + "device_id": "tfa_303196", + "name": "TFA Dostmann 30.3196 T/H outdoor sensor", + "modulation": "FSK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 245, + "long_width": 0, + "gap_limit": null, + "reset_limit": 22000, + "sync_width": null, + "tolerance": 60, + "frequency": null, + "category": "security", + "manufacturer": "TFA", + "source_file": "tfa_30_3196.c" + }, + { + "device_id": "tfa_30_3221", + "name": "TFA Dostmann 30.3221.02 T/H Outdoor Sensor (also 30.3249.02)", + "modulation": "OOK", + "short_width": 235, + "long_width": 480, + "gap_limit": null, + "reset_limit": 850, + "sync_width": 836, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "TFA", + "source_file": "tfa_30_3221.c" + }, + { + "device_id": "tfa_drop_303233", + "name": "TFA Drop Rain Gauge 30.3233.01", + "modulation": "OOK", + "short_width": 255, + "long_width": 510, + "gap_limit": 1300, + "reset_limit": 2500, + "sync_width": 750, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TFA", + "source_file": "tfa_drop_30.3233.c" + }, + { + "device_id": "tfa_marbella", + "name": "TFA Marbella Pool Thermometer", + "modulation": "FSK", + "short_width": 105, + "long_width": 105, + "gap_limit": null, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TFA", + "source_file": "tfa_marbella.c" + }, + { + "device_id": "tfa_pool_thermometer", + "name": "TFA pool temperature sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4600, + "gap_limit": 7800, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TFA", + "source_file": "tfa_pool_thermometer.c" + }, + { + "device_id": "tfa_twin_plus_303049", + "name": "TFA-Twin-Plus-30.3049, Conrad KW9010, Ea2 BL999", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 6000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "TFA-Twin-Plus-30.3049,", + "source_file": "tfa_twin_plus_30.3049.c" + }, + { + "device_id": "thermopro_tp11", + "name": "Thermopro TP11 Thermometer", + "modulation": "OOK", + "short_width": 500, + "long_width": 1500, + "gap_limit": 2000, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Thermopro", + "source_file": "thermopro_tp11.c" + }, + { + "device_id": "thermopro_tp12", + "name": "ThermoPro TP08/TP12/TP20 thermometer", + "modulation": "OOK", + "short_width": 500, + "long_width": 1500, + "gap_limit": 2000, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tp12.c" + }, + { + "device_id": "thermopro_tp28b", + "name": "ThermoPro TP28b Super Long Range Wireless Meat Thermometer for Smoker BBQ Grill", + "modulation": "FSK", + "short_width": 105, + "long_width": 105, + "gap_limit": null, + "reset_limit": 5500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tp28b.c" + }, + { + "device_id": "thermopro_tp828b", + "name": "ThermoPro Meat Thermometers, TP828B 2 probes with Temp, BBQ Target LO and HI", + "modulation": "FSK", + "short_width": 102, + "long_width": 102, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tp82xb.c" + }, + { + "device_id": "thermopro_tp829b", + "name": "ThermoPro Meat Thermometers, TP829B 4 probes with temp only", + "modulation": "FSK", + "short_width": 102, + "long_width": 102, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tp82xb.c" + }, + { + "device_id": "thermopro_tx2", + "name": "ThermoPro-TX2 temperature sensor", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 7000, + "reset_limit": 10000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro-TX2", + "source_file": "thermopro_tx2.c" + }, + { + "device_id": "thermopro_tx2c", + "name": "ThermoPro TX-2C Thermometer and Humidity sensor", + "modulation": "OOK", + "short_width": 1958, + "long_width": 3825, + "gap_limit": 3829, + "reset_limit": 8643, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tx2c.c" + }, + { + "device_id": "thermopro_tx7b", + "name": "ThermoPro TX-7B Outdoor Thermometer Hygrometer", + "modulation": "FSK", + "short_width": 108, + "long_width": 108, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "ThermoPro", + "source_file": "thermopro_tx7b.c" + }, + { + "device_id": "thermor", + "name": "Thermor DG950 weather station", + "modulation": "OOK", + "short_width": 680, + "long_width": 2100, + "gap_limit": 3000, + "reset_limit": 8000, + "sync_width": 1438, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Thermor", + "source_file": "thermor.c" + }, + { + "device_id": "tpms_abarth124", + "name": "Abarth 124 Spider TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Abarth", + "source_file": "tpms_abarth124.c" + }, + { + "device_id": "tpms_ave", + "name": "AVE TPMS", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 400, + "sync_width": null, + "tolerance": 15, + "frequency": null, + "category": "tpms", + "manufacturer": "AVE", + "source_file": "tpms_ave.c" + }, + { + "device_id": "tpms_bmw", + "name": "BMW Gen4-Gen5 TPMS and Audi TPMS Pressure Alert, multi-brand HUF/Beru, Continental, Schrader/Sensata, Audi", + "modulation": "FSK", + "short_width": 25, + "long_width": 25, + "gap_limit": null, + "reset_limit": 100, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "BMW", + "source_file": "tpms_bmw.c" + }, + { + "device_id": "tpms_bmwg3", + "name": "BMW Gen2 and Gen3 TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 160, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "BMW", + "source_file": "tpms_bmw_g3.c" + }, + { + "device_id": "tpms_citroen", + "name": "Citroen TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Citroen", + "source_file": "tpms_citroen.c" + }, + { + "device_id": "tpms_eezrv", + "name": "EezTire E618, Carchet TPMS, TST-507 TPMS", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 50, + "long_width": 50, + "gap_limit": null, + "reset_limit": 120, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "EezTire", + "source_file": "tpms_eezrv.c" + }, + { + "device_id": "tpms_elantra2012", + "name": "Elantra2012 TPMS", + "modulation": "FSK", + "short_width": 49, + "long_width": 49, + "gap_limit": null, + "reset_limit": 200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Elantra2012", + "source_file": "tpms_elantra2012.c" + }, + { + "device_id": "tpms_ford", + "name": "Ford TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Ford", + "source_file": "tpms_ford.c" + }, + { + "device_id": "tpms_gm", + "name": "GM-Aftermarket TPMS", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 120, + "long_width": 0, + "gap_limit": null, + "reset_limit": 15600, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "GM-Aftermarket", + "source_file": "tpms_gm.c" + }, + { + "device_id": "tpms_hyundai_vdo", + "name": "Hyundai TPMS (VDO)", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Hyundai", + "source_file": "tpms_hyundai_vdo.c" + }, + { + "device_id": "tpms_jansite", + "name": "Jansite TPMS Model TY02S", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Jansite", + "source_file": "tpms_jansite.c" + }, + { + "device_id": "tpms_jansite_solar", + "name": "Jansite TPMS Model Solar", + "modulation": "FSK", + "short_width": 51, + "long_width": 51, + "gap_limit": null, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Jansite", + "source_file": "tpms_jansite_solar.c" + }, + { + "device_id": "tpms_kia", + "name": "Kia TPMS (-s 1000k)", + "modulation": "FSK", + "short_width": 50, + "long_width": 50, + "gap_limit": null, + "reset_limit": 200, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Kia", + "source_file": "tpms_kia.c" + }, + { + "device_id": "tpms_nissan", + "name": "Nissan TPMS", + "modulation": "FSK", + "short_width": 120, + "long_width": 120, + "gap_limit": null, + "reset_limit": 250, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Nissan", + "source_file": "tpms_nissan.c" + }, + { + "device_id": "tpms_pmv107j", + "name": "PMV-107J (Toyota) TPMS", + "modulation": "FSK", + "short_width": 100, + "long_width": 100, + "gap_limit": null, + "reset_limit": 250, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "PMV-107J", + "source_file": "tpms_pmv107j.c" + }, + { + "device_id": "tpms_porsche", + "name": "Porsche Boxster/Cayman TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Porsche", + "source_file": "tpms_porsche.c" + }, + { + "device_id": "tpms_renault", + "name": "Renault TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Renault", + "source_file": "tpms_renault.c" + }, + { + "device_id": "tpms_renault_0435r", + "name": "Renault 0435R TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Renault", + "source_file": "tpms_renault_0435r.c" + }, + { + "device_id": "tpms_toyota", + "name": "Toyota TPMS", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Toyota", + "source_file": "tpms_toyota.c" + }, + { + "device_id": "tpms_truck", + "name": "Unbranded SolarTPMS for trucks", + "modulation": "FSK", + "short_width": 52, + "long_width": 52, + "gap_limit": null, + "reset_limit": 150, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "Unbranded", + "source_file": "tpms_truck.c" + }, + { + "device_id": "tpms_tyreguard400", + "name": "TyreGuard 400 TPMS", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 100, + "long_width": 100, + "gap_limit": 0, + "reset_limit": 500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "tpms", + "manufacturer": "TyreGuard", + "source_file": "tpms_tyreguard400.c" + }, + { + "device_id": "ts_ft002", + "name": "TS-FT002 Wireless Ultrasonic Tank Liquid Level Meter With Temperature Sensor", + "modulation": "OOK", + "short_width": 464, + "long_width": 948, + "gap_limit": 1200, + "reset_limit": 2000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "TS-FT002", + "source_file": "ts_ft002.c" + }, + { + "device_id": "ttx201", + "name": "Emos TTX201 Temperature Sensor", + "modulation": "OOK_PULSE_MANCHESTER_ZEROBIT", + "short_width": 510, + "long_width": 0, + "gap_limit": null, + "reset_limit": 1700, + "sync_width": null, + "tolerance": 250, + "frequency": null, + "category": "weather", + "manufacturer": "Emos", + "source_file": "ttx201.c" + }, + { + "device_id": "universalfanctrl", + "name": "Universal (Reverseable) 24V Fan Controller", + "modulation": "OOK", + "short_width": 256, + "long_width": 756, + "gap_limit": 8000, + "reset_limit": 8800, + "sync_width": 3616, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "Universal", + "source_file": "universalfanctrl.c" + }, + { + "device_id": "vaillant_vrt340f", + "name": "Vaillant calorMatic VRT340f Central Heating Control", + "modulation": "OOK", + "short_width": 836, + "long_width": 1648, + "gap_limit": null, + "reset_limit": 4000, + "sync_width": null, + "tolerance": 120, + "frequency": null, + "category": "other", + "manufacturer": "Vaillant", + "source_file": "vaillant_vrt340f.c" + }, + { + "device_id": "vauno_en8822c", + "name": "Vauno EN8822C", + "modulation": "OOK", + "short_width": 2000, + "long_width": 4000, + "gap_limit": 5000, + "reset_limit": 9500, + "sync_width": null, + "tolerance": 500, + "frequency": null, + "category": "other", + "manufacturer": "Vauno", + "source_file": "vauno_en8822c.c" + }, + { + "device_id": "vevor_7in1", + "name": "Vevor Wireless Weather Station 7-in-1", + "modulation": "FSK", + "short_width": 87, + "long_width": 87, + "gap_limit": null, + "reset_limit": 9000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Vevor", + "source_file": "vevor_7in1.c" + }, + { + "device_id": "visonic_powercode", + "name": "Visonic powercode", + "modulation": "OOK", + "short_width": 400, + "long_width": 800, + "gap_limit": 900, + "reset_limit": 5000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "energy", + "manufacturer": "Visonic", + "source_file": "visonic_powercode.c" + }, + { + "device_id": "watts_thermostat", + "name": "Watts WFHT-RF Thermostat", + "modulation": "OOK", + "short_width": 260, + "long_width": 600, + "gap_limit": null, + "reset_limit": 900, + "sync_width": 6000, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Watts", + "source_file": "watts_thermostat.c" + }, + { + "device_id": "waveman", + "name": "Waveman Switch Transmitter", + "modulation": "OOK", + "short_width": 357, + "long_width": 1064, + "gap_limit": 1400, + "reset_limit": 12000, + "sync_width": 0, + "tolerance": 200, + "frequency": null, + "category": "home_automation", + "manufacturer": "Waveman", + "source_file": "waveman.c" + }, + { + "device_id": "wec2103", + "name": "WEC-2103 temperature/humidity sensor", + "modulation": "OOK", + "short_width": 1900, + "long_width": 3800, + "gap_limit": 4400, + "reset_limit": 9400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "WEC-2103", + "source_file": "wec2103.c" + }, + { + "device_id": "wg_pb12v1", + "name": "WG-PB12V1 Temperature Sensor", + "modulation": "OOK", + "short_width": 564, + "long_width": 1476, + "gap_limit": null, + "reset_limit": 2500, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "WG-PB12V1", + "source_file": "wg_pb12v1.c" + }, + { + "device_id": "ws2032", + "name": "WS2032 weather station", + "modulation": "OOK", + "short_width": 500, + "long_width": 1000, + "gap_limit": 750, + "reset_limit": 4000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "WS2032", + "source_file": "ws2032.c" + }, + { + "device_id": "wssensor", + "name": "Hyundai WS SENZOR Remote Temperature Sensor", + "modulation": "OOK", + "short_width": 1000, + "long_width": 2000, + "gap_limit": 2400, + "reset_limit": 4400, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "Hyundai", + "source_file": "wssensor.c" + }, + { + "device_id": "wt1024", + "name": "WT0124 Pool Thermometer", + "modulation": "OOK", + "short_width": 680, + "long_width": 1850, + "gap_limit": 4000, + "reset_limit": 30000, + "sync_width": 10000, + "tolerance": null, + "frequency": null, + "category": "weather", + "manufacturer": "WT0124", + "source_file": "wt0124.c" + }, + { + "device_id": "wt450", + "name": "WT450, WT260H, WT405H", + "modulation": "OOK", + "short_width": 976, + "long_width": 1952, + "gap_limit": null, + "reset_limit": 18000, + "sync_width": null, + "tolerance": 100, + "frequency": null, + "category": "other", + "manufacturer": "WT450,", + "source_file": "wt450.c" + }, + { + "device_id": "X10_RF", + "name": "X10 RF", + "modulation": "OOK", + "short_width": 562, + "long_width": 1687, + "gap_limit": 2200, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "other", + "manufacturer": "X10", + "source_file": "x10_rf.c" + }, + { + "device_id": "x10_sec", + "name": "X10 Security", + "modulation": "OOK", + "short_width": 562, + "long_width": 1687, + "gap_limit": 2200, + "reset_limit": 6000, + "sync_width": null, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "X10", + "source_file": "x10_sec.c" + }, + { + "device_id": "yale_hsa", + "name": "Yale HSA (Home Security Alarm), YES-Alarmkit", + "modulation": "OOK", + "short_width": 850, + "long_width": 1460, + "gap_limit": null, + "reset_limit": 1500, + "sync_width": 5380, + "tolerance": null, + "frequency": null, + "category": "security", + "manufacturer": "Yale", + "source_file": "yale_hsa.c" + } + ] +} \ No newline at end of file diff --git a/scripts/parse_rtl433_devices.py b/scripts/parse_rtl433_devices.py new file mode 100755 index 0000000..05d8f70 --- /dev/null +++ b/scripts/parse_rtl433_devices.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +""" +RTL_433 Device Protocol Parser + +Parses RTL_433 C source code to extract device protocol definitions +and convert them to a structured JSON format for GigLez matching engine. + +Usage: + python3 scripts/parse_rtl433_devices.py /path/to/rtl_433/ + +Output: + data/rtl_433_protocols.json +""" + +import re +import json +import os +import sys +from pathlib import Path +from typing import Dict, List, Optional +from dataclasses import dataclass, asdict + +@dataclass +class RTL433Device: + """Represents an RTL_433 device protocol definition""" + device_id: str # e.g., "acurite_rain_896" + name: str # Human-readable name + modulation: Optional[str] = None # OOK_PULSE_PPM, FSK_PULSE_PWM, etc. + short_width: Optional[int] = None # Microseconds + long_width: Optional[int] = None + gap_limit: Optional[int] = None + reset_limit: Optional[int] = None + sync_width: Optional[int] = None + tolerance: Optional[int] = None + frequency: Optional[int] = None # Hz + category: Optional[str] = None # Inferred from device type + manufacturer: Optional[str] = None # Extracted from name + source_file: Optional[str] = None + +class RTL433Parser: + """Parses RTL_433 device definitions from C source""" + + # Modulation types mapping + MODULATION_TYPES = { + 'OOK_PULSE_PPM': 'OOK', + 'OOK_PULSE_PWM': 'OOK', + 'OOK_PULSE_Manchester_Zerobit': 'OOK', + 'OOK_PULSE_PCM': 'OOK', + 'OOK_PULSE_DMC': 'OOK', + 'OOK_PULSE_PIWM_RAW': 'OOK', + 'OOK_PULSE_PIWM_DC': 'OOK', + 'FSK_PULSE_PCM': 'FSK', + 'FSK_PULSE_PWM': 'FSK', + 'FSK_PULSE_Manchester_Zerobit': 'FSK', + } + + # Device category patterns (from device name) + CATEGORY_PATTERNS = { + 'weather': ['weather', 'rain', 'wind', 'humidity', 'temperature', 'barometer', 'therm'], + 'tpms': ['tpms', 'tire', 'pressure'], + 'automotive': ['car', 'vehicle', 'key', 'fob', 'honda', 'toyota', 'ford', 'bmw', 'audi'], + 'security': ['alarm', 'security', 'motion', 'door', 'window', 'smoke', 'pir'], + 'home_automation': ['remote', 'switch', 'socket', 'plug', 'doorbell', 'garage', 'gate'], + 'sensors': ['sensor', 'detector', 'meter', 'monitor'], + 'energy': ['power', 'energy', 'electric', 'gas', 'water', 'current', 'voltage'], + 'lighting': ['light', 'lamp', 'dimmer', 'bulb'], + } + + def __init__(self, rtl433_path: str): + self.rtl433_path = Path(rtl433_path) + self.devices_dir = self.rtl433_path / 'src' / 'devices' + self.devices: List[RTL433Device] = [] + + def parse_all(self) -> List[RTL433Device]: + """Parse all device definitions from RTL_433""" + print(f"Parsing RTL_433 devices from: {self.devices_dir}") + + if not self.devices_dir.exists(): + raise FileNotFoundError(f"Devices directory not found: {self.devices_dir}") + + # Get list of device files + device_files = sorted(self.devices_dir.glob('*.c')) + print(f"Found {len(device_files)} device files") + + for device_file in device_files: + devices_in_file = self.parse_file(device_file) + self.devices.extend(devices_in_file) + if devices_in_file: + print(f" {device_file.name}: {len(devices_in_file)} devices") + + print(f"\nTotal devices parsed: {len(self.devices)}") + return self.devices + + def parse_file(self, file_path: Path) -> List[RTL433Device]: + """Parse device definitions from a single C file""" + devices = [] + + try: + with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: + content = f.read() + + # Find all r_device struct definitions + # Pattern: r_device const device_name = { ... }; + device_pattern = r'r_device\s+const\s+(\w+)\s*=\s*\{([^}]+)\}' + + matches = re.finditer(device_pattern, content, re.MULTILINE | re.DOTALL) + + for match in matches: + device_id = match.group(1) + struct_body = match.group(2) + + device = self.parse_device_struct(device_id, struct_body, file_path.name) + if device: + devices.append(device) + + except Exception as e: + print(f" Error parsing {file_path.name}: {e}") + + return devices + + def parse_device_struct(self, device_id: str, struct_body: str, source_file: str) -> Optional[RTL433Device]: + """Parse individual r_device struct""" + + # Extract .name field + name_match = re.search(r'\.name\s*=\s*"([^"]+)"', struct_body) + if not name_match: + return None + + name = name_match.group(1) + + # Extract other fields + device = RTL433Device( + device_id=device_id, + name=name, + source_file=source_file + ) + + # Modulation + mod_match = re.search(r'\.modulation\s*=\s*(\w+)', struct_body) + if mod_match: + modulation_raw = mod_match.group(1) + device.modulation = self.MODULATION_TYPES.get(modulation_raw, modulation_raw) + + # Timing parameters + for field_name in ['short_width', 'long_width', 'gap_limit', 'reset_limit', 'sync_width', 'tolerance']: + field_match = re.search(rf'\.{field_name}\s*=\s*(\d+)', struct_body) + if field_match: + setattr(device, field_name, int(field_match.group(1))) + + # Infer category from device name + device.category = self.infer_category(name.lower()) + + # Extract manufacturer from name (first word usually) + device.manufacturer = self.extract_manufacturer(name) + + return device + + def infer_category(self, name_lower: str) -> str: + """Infer device category from name""" + for category, keywords in self.CATEGORY_PATTERNS.items(): + for keyword in keywords: + if keyword in name_lower: + return category + return 'other' + + def extract_manufacturer(self, name: str) -> Optional[str]: + """Extract manufacturer from device name""" + # First word is usually manufacturer + words = name.split() + if words: + manufacturer = words[0] + # Filter out generic words + generic = ['wireless', 'generic', 'remote', 'sensor', 'temperature', 'humidity'] + if manufacturer.lower() not in generic: + return manufacturer + return None + + def to_json(self, output_path: str): + """Export devices to JSON""" + devices_dict = [asdict(d) for d in self.devices] + + with open(output_path, 'w') as f: + json.dump({ + 'source': 'RTL_433', + 'total_devices': len(self.devices), + 'devices': devices_dict + }, f, indent=2) + + print(f"\nExported to: {output_path}") + + def print_summary(self): + """Print summary statistics""" + print("\n" + "="*60) + print("RTL_433 DEVICE SUMMARY") + print("="*60) + + # By category + categories = {} + for device in self.devices: + cat = device.category or 'unknown' + categories[cat] = categories.get(cat, 0) + 1 + + print("\nDevices by Category:") + for cat, count in sorted(categories.items(), key=lambda x: x[1], reverse=True): + print(f" {cat:20s}: {count:3d}") + + # By modulation + modulations = {} + for device in self.devices: + mod = device.modulation or 'unknown' + modulations[mod] = modulations.get(mod, 0) + 1 + + print("\nDevices by Modulation:") + for mod, count in sorted(modulations.items(), key=lambda x: x[1], reverse=True): + print(f" {mod:20s}: {count:3d}") + + # Top manufacturers + manufacturers = {} + for device in self.devices: + mfg = device.manufacturer or 'unknown' + manufacturers[mfg] = manufacturers.get(mfg, 0) + 1 + + print("\nTop 10 Manufacturers:") + for mfg, count in sorted(manufacturers.items(), key=lambda x: x[1], reverse=True)[:10]: + print(f" {mfg:20s}: {count:3d}") + + +def main(): + if len(sys.argv) < 2: + print("Usage: python3 parse_rtl433_devices.py /path/to/rtl_433/") + print("\nExample:") + print(" python3 scripts/parse_rtl433_devices.py /tmp/rtl_433/") + sys.exit(1) + + rtl433_path = sys.argv[1] + + parser = RTL433Parser(rtl433_path) + devices = parser.parse_all() + + # Create data directory if needed + data_dir = Path('data') + data_dir.mkdir(exist_ok=True) + + # Export to JSON + output_file = data_dir / 'rtl_433_protocols.json' + parser.to_json(str(output_file)) + + # Print summary + parser.print_summary() + + print("\n" + "="*60) + print(f"SUCCESS: Parsed {len(devices)} RTL_433 device protocols") + print("="*60) + + +if __name__ == '__main__': + main()