Skip to content

Commit

Permalink
Add support for TechniSat IMETEO X6 and improve Holman-AOK (#2759)
Browse files Browse the repository at this point in the history
  • Loading branch information
ProfBoc75 authored Dec 24, 2023
1 parent f9dc6b8 commit 0815dd1
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 12 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md).
[212] Renault 0435R TPMS
[213] Fine Offset Electronics WS80 weather station
[214] EMOS E6016 weatherstation with DCF77
[215] 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, Weather Station or temperature/humidity sensor
[215] 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
[216]* ANT and ANT+ devices
[217] EMOS E6016 rain gauge
[218] Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
Expand Down
21 changes: 12 additions & 9 deletions src/devices/emax.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ Rebrand and devices decoded :
- Orium Pro Atlanta 13093, Helios 13123
- Protmex PT3390A
- Jula Marquant 014331 weather station /014332 temp hum sensor
- TechniSat IMETEO X6 76-4924-00 weather station without UV/LUX/Gust #2753
S.a. issue #2000 #2299 #2326 #2373 PR #2300 #2346 #2374
S.a. issue #2000 #2299 #2326 #2375 PR #2300 #2346 #2374
- Likely a rebranded device, sold by Altronics
- Data length is 32 bytes with a preamble of 10 bytes (33 bytes for Rain/Wind Station)
Expand Down Expand Up @@ -68,10 +69,11 @@ Emax Rain / Wind speed / Wind Direction / Temp / Hum / UV / Lux
Weather Rain/Wind station : humidity not at same byte position as temp/hum sensor.
- With UV Lux without Wind Gust
AA 04 II IB 0T TT HH 0W WW 0D DD RR RR UU LL LL 04 05 06 07 08 09 10 11 12 13 14 15 16 17 xx SS yy
AA KC II IB 0T TT HH 0W WW 0D DD RR RR UU LL LL 04 05 06 07 08 09 10 11 12 13 14 15 16 17 xx SS yy
- Without UV LUX Wind Gust
AA KC II IB 0T TT HH 0W WW 0D DD RR RR D9 01 01 04 05 06 07 08 09 10 11 12 13 14 15 16 17 xx SS yy
- Without UV / Lux , with Wind Gust
AA 04 II IB 0T TT HH 0W WW 0D DD RR RR ?0 01 01 GG 04 05 06 07 08 09 10 11 12 13 14 15 16 xx SS yy
AA KC II IB 0T TT HH 0W WW 0D DD RR RR ?0 01 01 GG 04 05 06 07 08 09 10 11 12 13 14 15 16 xx SS yy
default empty/null = 0x01 => value = 0
Expand Down Expand Up @@ -200,10 +202,11 @@ static int emax_decode(r_device *decoder, bitbuffer_t *bitbuffer)
if (lux_multi == 1) {
light_lux = light_lux * 10;
}

int tag = ((b[13] - 1) & 0xC0)>>6; // if tag = 3 = model IMETEO X6 without UV and LUX #2753
/* clang-format off */
data_t *data = data_make(
"model", "", DATA_STRING, "Emax-W6",
"model", "", DATA_COND, tag !=3, DATA_STRING, "Emax-W6",
"model", "", DATA_COND, tag ==3, DATA_STRING, "IMETEO-X6",
"id", "", DATA_FORMAT, "%03x", DATA_INT, id,
"channel", "Channel", DATA_INT, channel,
"battery_ok", "Battery_OK", DATA_INT, !battery_low,
Expand All @@ -212,8 +215,8 @@ static int emax_decode(r_device *decoder, bitbuffer_t *bitbuffer)
"wind_avg_km_h", "Wind avg speed", DATA_FORMAT, "%.1f km/h", DATA_DOUBLE, speed_kmh,
"wind_dir_deg", "Wind Direction", DATA_INT, direction_deg,
"rain_mm", "Total rainfall", DATA_FORMAT, "%.1f mm", DATA_DOUBLE, rain_mm,
"uv", "UV Index", DATA_FORMAT, "%u", DATA_INT, uv_index,
"light_lux", "Lux", DATA_FORMAT, "%u", DATA_INT, light_lux,
"uv", "UV Index", DATA_COND, tag !=3, DATA_FORMAT, "%u", DATA_INT, uv_index,
"light_lux", "Lux", DATA_COND, tag !=3, DATA_FORMAT, "%u", DATA_INT, light_lux,
"pairing", "Pairing?", DATA_COND, pairing, DATA_INT, !!pairing,
"mic", "Integrity", DATA_STRING, "CHECKSUM",
NULL);
Expand Down Expand Up @@ -269,7 +272,7 @@ static char const *const output_fields[] = {
};

r_device const 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, Weather Station or temperature/humidity sensor",
.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_PULSE_PCM,
.short_width = 90,
.long_width = 90,
Expand Down
4 changes: 2 additions & 2 deletions src/devices/holman_ws5029.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,9 @@ static int holman_ws5029pcm_decode(r_device *decoder, bitbuffer_t *bitbuffer)
int rain_raw = ((b[4] & 0x0f) << 8) | b[5];
float speed_kmh = (float)b[6];
int direction_deg = wind_dir_degr[(b[7] & 0xf0) >> 4];
int light_lux = ((b[8] & 0x7F) << 10) | (b[9] << 2) | ((b[10] & 0xC0) >> 6);

if (bits < 200) { // model without UV LUX
if (bits < 200 && light_lux == 0) { // model without UV LUX
float rain_mm = rain_raw * 0.79f;

/* clang-format off */
Expand All @@ -159,7 +160,6 @@ static int holman_ws5029pcm_decode(r_device *decoder, bitbuffer_t *bitbuffer)
else if (bits < 221) { // model with UV LUX
float rain_mm = rain_raw * 1.0f;
int uv_index = ((b[7] & 0x07) << 1) | ((b[8] & 0x80) >> 7);
int light_lux = ((b[8] & 0x7F) << 10) | (b[9] << 2) | ((b[10] & 0xC0) >> 6);
int battery_low = ((b[10] & 0x30) >> 4);
int counter = ((b[10] & 0x0f) << 8 | b[11]);
/* clang-format off */
Expand Down

0 comments on commit 0815dd1

Please sign in to comment.