Skip to content

Commit

Permalink
Change support of ThermoPro TX-2C sensor to enable reading humidity data
Browse files Browse the repository at this point in the history
  • Loading branch information
mwerlen committed May 28, 2023
1 parent ac36025 commit d24c2a7
Showing 1 changed file with 34 additions and 12 deletions.
46 changes: 34 additions & 12 deletions src/devices/thermopro_tx2c.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/** @file
ThermoPro TX-2C Outdoor Thermometer.
ThermoPro TX-2C Outdoor Thermometer and humidity sensor.
Copyright (C) 2023 [email protected].
Copyright (C) 2023 [email protected].
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand All @@ -28,13 +29,17 @@ Example data:
Data layout:
II ZZ TTT UU Z
[type] [id0] [id1] [flags] [temp0] [temp1] [temp2] [humi0] [humi1] [zero] [zero] [zero]
- I: 8 bit ID
- Z: 8 bit zeros
- T: 12 bit temperature, scale 10
- U: 8 bit unknown (constant)
- Z: 5 bit zeros
- type: 4 bit fixed 1001 (9) or 0110 (5)
- id: 8 bit a random id that is generated when the sensor starts, could include battery status
the same batteries often generate the same id
- flags(3): is 1 when the battery is low, otherwise 0 (ok)
- flags(2): is 1 when the sensor sends a reading when pressing the button on the sensor
- flags(1,0): the channel number that can be set by the sensor (1, 2, 3, X)
- temp: 12 bit signed scaled by 10
- humi: 8 bit always 00001010 (0x0A) if no humidity sensor is available
- zero : a trailing 12 bit fixed 000000000000
*/

Expand All @@ -56,16 +61,29 @@ static int thermopro_tx2c_decode(r_device *decoder, bitbuffer_t *bitbuffer)
return DECODE_FAIL_SANITY;
}

int device = (b[0]);
// check existing 12 bit 0 trailer
if ((b[4] & 0x0F) != 0x00 || b[5] != 0x00)
return DECODE_FAIL_SANITY;

int type = b[0] >> 4;
int id = (((b[0] & 0xF) << 4) | (b[1] >> 4));
int battery = (b[1] & 0x08) >> 3;
int button = (b[1] & 0x04) >> 2;
int channel = (b[1] & 0x03) + 1;
int temp_raw = (int16_t)((b[2] << 8) | b[3]); // uses sign-extend
float temp_c = (temp_raw >> 4) * 0.1f;
int humidity = (((b[3] & 0xF) << 4) | (b[4] >> 4));

/* clang-format off */
data_t *data = data_make(
"model", "", DATA_STRING, "Thermopro-TX2C",
"id", "Id", DATA_INT, device,
"subtype", "", DATA_INT, type,
"id", "Id", DATA_INT, id,
"channel", "Channel", DATA_INT, channel,
"battery_ok", "Battery", DATA_INT, !battery,
"temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, temp_c,
"mic", "Integrity", DATA_STRING, "CRC",
"humidity", "Humidity", DATA_COND, humidity != 0x0a, DATA_FORMAT, "%u %%", DATA_INT, humidity,
"button", "Button", DATA_INT, button,
NULL);
/* clang-format on */
decoder_output_data(decoder, data);
Expand All @@ -74,14 +92,18 @@ static int thermopro_tx2c_decode(r_device *decoder, bitbuffer_t *bitbuffer)

static char const *const output_fields[] = {
"model",
"subtype",
"id",
"channel",
"battery_ok",
"temperature_C",
"mic",
"humidity",
"button",
NULL,
};

r_device const thermopro_tx2c = {
.name = "ThermoPro TX-2C Thermometer",
.name = "ThermoPro TX-2C Thermometer and Humidity sensor",
.modulation = OOK_PULSE_PPM,
.short_width = 1958,
.long_width = 3825,
Expand Down

0 comments on commit d24c2a7

Please sign in to comment.