diff --git a/README.md b/README.md index 05a19f589..926350c42 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md). [111] Emos TTX201 Temperature Sensor [112] Ambient Weather TX-8300 Temperature/Humidity Sensor [113] Ambient Weather WH31E Thermo-Hygrometer Sensor, EcoWitt WH40 rain gauge, WS68 weather station - [114] Maverick et73 + [114] Maverick ET73 [115] Honeywell ActivLink, Wireless Doorbell [116] Honeywell ActivLink, Wireless Doorbell (FSK) [117]* ESA1000 / ESA2000 Energy Monitor diff --git a/conf/rtl_433.example.conf b/conf/rtl_433.example.conf index a633159e6..4f134053d 100644 --- a/conf/rtl_433.example.conf +++ b/conf/rtl_433.example.conf @@ -340,7 +340,7 @@ convert si protocol 111 # Emos TTX201 Temperature Sensor protocol 112 # Ambient Weather TX-8300 Temperature/Humidity Sensor protocol 113 # Ambient Weather WH31E Thermo-Hygrometer Sensor, EcoWitt WH40 rain gauge, WS68 weather station - protocol 114 # Maverick et73 + protocol 114 # Maverick ET73 protocol 115 # Honeywell ActivLink, Wireless Doorbell protocol 116 # Honeywell ActivLink, Wireless Doorbell (FSK) # protocol 117 # ESA1000 / ESA2000 Energy Monitor diff --git a/src/devices/acurite.c b/src/devices/acurite.c index 67a9ff23d..eb72cf391 100644 --- a/src/devices/acurite.c +++ b/src/devices/acurite.c @@ -1671,28 +1671,26 @@ static int acurite_606_decode(r_device *decoder, bitbuffer_t *bitbuffer) } /** -Acurite 590TX temperature/humidity sensor +Acurite 590TX temperature/humidity sensor. + +The signal is OOK PPM with pulses of 500 us. +There is a sync pulse with a 3000 us gap, then 24 bits with 500 us / 1500 us gaps. +There is no packet gap -- the sync pulse will look like the 25th bit with 500 us gap. +A transmission contains 14 repeats. + +We'll read the packet after the sync and treat the next sync as a trailing 0 bit */ static int acurite_590tx_decode(r_device *decoder, bitbuffer_t *bitbuffer) { - uint8_t *b; - int row; - int sensor_id; // the sensor ID - basically a random number that gets reset whenever the battery is removed - int battery_ok; // the battery status: 1 is good, 0 is low - int channel; - int humidity; - int temp_raw; // temperature as read from the data packet - float temp_c; // temperature in C - - row = bitbuffer_find_repeated_row(bitbuffer, 3, 25); // expected are min 3 rows + int row = bitbuffer_find_repeated_row(bitbuffer, 3, 25); // expected are min 3 rows if (row < 0) return DECODE_ABORT_EARLY; if (bitbuffer->bits_per_row[row] > 25) return DECODE_ABORT_LENGTH; - b = bitbuffer->bb[row]; + uint8_t *b = bitbuffer->bb[row]; if (b[4] != 0) // last byte should be zero return DECODE_FAIL_SANITY; @@ -1714,23 +1712,21 @@ static int acurite_590tx_decode(r_device *decoder, bitbuffer_t *bitbuffer) return DECODE_FAIL_MIC; } - // Processing the temperature: - // Upper 4 bits are stored in nibble 1, lower 8 bits are stored in nibble 2 - // upper 4 bits of nibble 1 are reserved for other usages (e.g. battery status) - sensor_id = b[0] & 0xFE; //first 6 bits and it changes each time it resets or change the battery - battery_ok = (b[0] & 0x01); //1=ok, 0=low battery - //next 2 bits are checksum - //next two bits are identify ID (maybe channel ?) - channel = (b[1] >> 4) & 0x03; + // the sensor ID - basically a random number that gets reset whenever the battery is removed + int sensor_id = b[0] & 0xFE; // first 6 bits and it changes each time it resets or change the battery + int battery_ok = (b[0] & 0x01); // 1=ok, 0=low battery + // upper 4 bits of byte 1 are parity and channel + int channel = (b[1] >> 4) & 0x03; - temp_raw = (int16_t)(((b[1] & 0x0F) << 12) | (b[2] << 4)); - temp_raw = temp_raw >> 4; - temp_c = (temp_raw - 500) * 0.1f; // NOTE: there seems to be a 50 degree offset? + // Upper 4 temperature bits are stored in byte 1, lower 8 bits are stored in byte 2 + int temp_raw = (int16_t)(((b[1] & 0x0F) << 12) | (b[2] << 4)); + temp_raw = temp_raw >> 4; // sign-extend + float temp_c = (temp_raw - 500) * 0.1f; // a 50 degree offset - if (temp_raw >= 0 && temp_raw <= 100) // NOTE: no other way to differentiate humidity from temperature? + int humidity = -1; + if (temp_raw >= 0 && temp_raw <= 100) { // NOTE: no other way to differentiate humidity from temperature? humidity = temp_raw; - else - humidity = -1; + } /* clang-format off */ data_t *data = data_make( @@ -2028,12 +2024,11 @@ r_device const acurite_00275rm = { r_device const acurite_590tx = { .name = "Acurite 590TX Temperature with optional Humidity", - .modulation = OOK_PULSE_PPM, // OOK_PULSE_PWM, - .short_width = 500, // short pulse is 232 us - .long_width = 1500, // long pulse is 420 us - .gap_limit = 1484, // long gap is 384 us, sync gap is 592 us - .reset_limit = 3000, // no packet gap, sync gap is 592 us - .sync_width = 500, // sync pulse is 632 us + .modulation = OOK_PULSE_PPM, + .short_width = 500, // short gap is 500 us + .long_width = 1500, // long gap is 1500 us + .gap_limit = 2000, // (preceeding) sync gap is 3000 us + .reset_limit = 3500, // no packet gap, sync gap is 500 us .decode_fn = &acurite_590tx_decode, .fields = acurite_590_output_fields, }; diff --git a/src/devices/maverick_et73.c b/src/devices/maverick_et73.c index e861af12f..d2f935310 100644 --- a/src/devices/maverick_et73.c +++ b/src/devices/maverick_et73.c @@ -99,7 +99,7 @@ static char const *const output_fields[] = { }; r_device const maverick_et73 = { - .name = "Maverick et73", + .name = "Maverick ET73", .modulation = OOK_PULSE_PPM, .short_width = 1050, .long_width = 2050, diff --git a/src/devices/prologue.c b/src/devices/prologue.c index cc94fec49..30484bafc 100644 --- a/src/devices/prologue.c +++ b/src/devices/prologue.c @@ -4,7 +4,8 @@ /** @fn int prologue_callback(r_device *decoder, bitbuffer_t *bitbuffer) Prologue sensor protocol, also FreeTec NC-7104 sensor for FreeTec Weatherstation NC-7102, -and Pearl NC-7159-675. +also Pearl NC-7159-675, +also TFA pool thermometer 30.3240.10 #2651 The sensor can be bought at Clas Ohlson. Note: this is a false positive for AlectoV1.