Add support for the Bresser Professional Rain Gauge ()

* Add support for the Bresser Professional Rain Gauge

Co-authored-by: Benjamin Larsson <benjamin.larsson@iopsys.eu>
This commit is contained in:
Benjamin Larsson 2021-03-14 15:08:56 +01:00 committed by GitHub
parent 6b9da1064c
commit be15f27e95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -30,6 +30,8 @@ Packet payload without preamble (203 bits):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
-----------------------------------------------------------------------------
ed ee 46 ff ff ff ef 9f ff 8b 7d eb ff 12 11 b9 00 00 00 10 60 00 74 82 14 00 00 00 (Rain Gauge)
e9 ee 46 ff ff ff ef 99 ff 8b 8b eb ff 16 11 b9 00 00 00 10 66 00 74 74 14 00 00 00 (Rain Gauge)
ee 93 7f f7 bf fb ef 9e fe ae bf ff ff 11 6c 80 08 40 04 10 61 01 51 40 00 00
ed 93 7f ff 0f ff ef b8 fe 7d bf ff ff 12 6c 80 00 f0 00 10 47 01 82 40 00 00
eb 93 7f eb 9f ee ef fc fc d6 bf ff ff 14 6c 80 14 60 11 10 03 03 29 40 00 00
@ -40,7 +42,7 @@ Packet payload without preamble (203 bits):
ef a1 ff ff 1f ff ef dc ff de df ff 7f 10 5e 00 00 e0 00 10 23 00 21 20 00 80 00 00 (low batt +ve temp)
ed a1 ff ff 1f ff ef 8f ff d6 df ff 77 12 5e 00 00 e0 00 10 70 00 29 20 00 88 00 00 (low batt -ve temp -7.0C)
ec 91 ff ff 1f fb ef e7 fe ad ed ff f7 13 6e 00 00 e0 04 10 18 01 52 12 00 08 00 00 (good batt -ve temp)
CC CC CC CC CC CC CC CC CC CC CC CC CC uu II GG DG WW W TT T HH RR R Bt
CC CC CC CC CC CC CC CC CC CC CC CC CC uu II SS GG DG WW W TT T HH RR R Bt
G-MSB ^ ^ W-MSB (strange but consistent order)
- C = Check, inverted data of 13 byte further
@ -54,6 +56,7 @@ Packet payload without preamble (203 bits):
- H = humidity in percent, BCD coded, HH = 23 => 23 %
- R = rain in mm, BCD coded, RRxR = 1203 => 31.2 mm
- B = Battery. 0=Ok, 8=Low.
- S = sensor type, only low nibble used, 0x9 for Bresser Professional Rain Gauge
*/
static int bresser_5in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)
@ -128,21 +131,37 @@ static int bresser_5in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)
int battery_ok = ((msg[25] & 0x80) == 0);
/* clang-format off */
data = data_make(
"model", "", DATA_STRING, "Bresser-5in1",
"id", "", DATA_INT, sensor_id,
"battery", "Battery", DATA_STRING, battery_ok ? "OK": "LOW",
"temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, temperature,
"humidity", "Humidity", DATA_INT, humidity,
_X("wind_max_m_s","wind_gust"), "Wind Gust", DATA_FORMAT, "%.1f m/s",DATA_DOUBLE, wind_gust,
_X("wind_avg_m_s","wind_speed"), "Wind Speed", DATA_FORMAT, "%.1f m/s",DATA_DOUBLE, wind_avg,
"wind_dir_deg", "Direction", DATA_FORMAT, "%.1f",DATA_DOUBLE, wind_direction_deg,
"rain_mm", "Rain", DATA_FORMAT, "%.1f mm",DATA_DOUBLE, rain,
"mic", "Integrity", DATA_STRING, "CHECKSUM",
NULL);
/* clang-format on */
/* check if the message is from a Bresser Professional Rain Gauge */
if ((msg[15] & 0xF) == 0x9) {
// rescale the rain sensor readings
rain = rain * 2.5;
/* clang-format off */
data = data_make(
"model", "", DATA_STRING, "Bresser-ProRainGauge",
"id", "", DATA_INT, sensor_id,
"battery", "Battery", DATA_STRING, battery_ok ? "OK": "LOW",
"temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, temperature,
"rain_mm", "Rain", DATA_FORMAT, "%.1f mm",DATA_DOUBLE, rain,
"mic", "Integrity", DATA_STRING, "CHECKSUM",
NULL);
/* clang-format on */
} else {
/* clang-format off */
data = data_make(
"model", "", DATA_STRING, "Bresser-5in1",
"id", "", DATA_INT, sensor_id,
"battery", "Battery", DATA_STRING, battery_ok ? "OK": "LOW",
"temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, temperature,
"humidity", "Humidity", DATA_INT, humidity,
_X("wind_max_m_s","wind_gust"), "Wind Gust", DATA_FORMAT, "%.1f m/s",DATA_DOUBLE, wind_gust,
_X("wind_avg_m_s","wind_speed"), "Wind Speed", DATA_FORMAT, "%.1f m/s",DATA_DOUBLE, wind_avg,
"wind_dir_deg", "Direction", DATA_FORMAT, "%.1f",DATA_DOUBLE, wind_direction_deg,
"rain_mm", "Rain", DATA_FORMAT, "%.1f mm",DATA_DOUBLE, rain,
"mic", "Integrity", DATA_STRING, "CHECKSUM",
NULL);
/* clang-format on */
}
decoder_output_data(decoder, data);
return 1;
}