Add support for Maverick XR-30 (#2090)
This commit is contained in:
parent
fc2256c391
commit
fbb5fb32c8
6 changed files with 122 additions and 4 deletions
|
@ -77,7 +77,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md).
|
||||||
[-F kv | json | csv | mqtt | influx | syslog | trigger | null | help] Produce decoded output in given format.
|
[-F kv | json | csv | mqtt | influx | syslog | trigger | null | help] Produce decoded output in given format.
|
||||||
Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.
|
Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.
|
||||||
Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514
|
Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514
|
||||||
[-M time[:<options>] | protocol | level | noise[:secs] | stats | bits | help] Add various meta data to each output.
|
[-M time[:<options>] | protocol | level | noise[:<secs>] | stats | bits | help] Add various meta data to each output.
|
||||||
[-K FILE | PATH | <tag> | <key>=<tag>] Add an expanded token or fixed tag to every output line.
|
[-K FILE | PATH | <tag> | <key>=<tag>] Add an expanded token or fixed tag to every output line.
|
||||||
[-C native | si | customary] Convert units in decoded output.
|
[-C native | si | customary] Convert units in decoded output.
|
||||||
[-n <value>] Specify number of samples to take (each sample is an I/Q pair)
|
[-n <value>] Specify number of samples to take (each sample is an I/Q pair)
|
||||||
|
@ -302,6 +302,7 @@ See [CONTRIBUTING.md](./docs/CONTRIBUTING.md).
|
||||||
[217] EMOS E6016 rain gauge
|
[217] EMOS E6016 rain gauge
|
||||||
[218] Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
|
[218] Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
|
||||||
[219] Fine Offset Electronics WH45 air quality sensor
|
[219] Fine Offset Electronics WH45 air quality sensor
|
||||||
|
[220] Maverick XR-30 BBQ Sensor
|
||||||
|
|
||||||
* Disabled by default, use -R n or a conf file to enable
|
* Disabled by default, use -R n or a conf file to enable
|
||||||
|
|
||||||
|
@ -421,7 +422,7 @@ E.g. -X "n=doorbell,m=OOK_PWM,s=400,l=800,r=7000,g=1000,match={24}0xa9878c,repea
|
||||||
Use "replay[:N]" to replay file inputs at (N-times) realtime.
|
Use "replay[:N]" to replay file inputs at (N-times) realtime.
|
||||||
Use "protocol" / "noprotocol" to output the decoder protocol number meta data.
|
Use "protocol" / "noprotocol" to output the decoder protocol number meta data.
|
||||||
Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
|
Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
|
||||||
Use "noise[:secs]" to report estimated noise level at intervals (default: 10 seconds).
|
Use "noise[:<secs>]" to report estimated noise level at intervals (default: 10 seconds).
|
||||||
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).
|
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).
|
||||||
level 0: no report, 1: report successful devices, 2: report active devices, 3: report all
|
level 0: no report, 1: report successful devices, 2: report active devices, 3: report all
|
||||||
Use "bits" to add bit representation to code outputs (for debug).
|
Use "bits" to add bit representation to code outputs (for debug).
|
||||||
|
|
|
@ -441,6 +441,7 @@ stop_after_successful_events false
|
||||||
protocol 217 # EMOS E6016 rain gauge
|
protocol 217 # EMOS E6016 rain gauge
|
||||||
protocol 218 # Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
|
protocol 218 # Microchip HCS200/HCS300 KeeLoq Hopping Encoder based remotes (FSK)
|
||||||
protocol 219 # Fine Offset Electronics WH45 air quality sensor
|
protocol 219 # Fine Offset Electronics WH45 air quality sensor
|
||||||
|
protocol 220 # Maverick XR-30 BBQ Sensor
|
||||||
|
|
||||||
## Flex devices (command line option "-X")
|
## Flex devices (command line option "-X")
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@
|
||||||
DECL(emos_e6016_rain) \
|
DECL(emos_e6016_rain) \
|
||||||
DECL(hcs200_fsk) \
|
DECL(hcs200_fsk) \
|
||||||
DECL(fineoffset_wh45) \
|
DECL(fineoffset_wh45) \
|
||||||
|
DECL(maverick_xr30) \
|
||||||
|
|
||||||
/* Add new decoders here. */
|
/* Add new decoders here. */
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ Produce decoded output in given format.
|
||||||
Append output to file with :<filename> (e.g. \-F csv:log.csv), defaults to stdout.
|
Append output to file with :<filename> (e.g. \-F csv:log.csv), defaults to stdout.
|
||||||
Specify host/port for syslog with e.g. \-F syslog:127.0.0.1:1514
|
Specify host/port for syslog with e.g. \-F syslog:127.0.0.1:1514
|
||||||
.TP
|
.TP
|
||||||
[ \fB\-M\fI time[:<options>] | protocol | level | noise[:secs] | stats | bits | help\fP ]
|
[ \fB\-M\fI time[:<options>] | protocol | level | noise[:<secs>] | stats | bits | help\fP ]
|
||||||
Add various meta data to each output.
|
Add various meta data to each output.
|
||||||
.TP
|
.TP
|
||||||
[ \fB\-K\fI FILE | PATH | <tag> | <key>=<tag>\fP ]
|
[ \fB\-K\fI FILE | PATH | <tag> | <key>=<tag>\fP ]
|
||||||
|
@ -412,7 +412,7 @@ Use "protocol" / "noprotocol" to output the decoder protocol number meta data.
|
||||||
Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
|
Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
|
||||||
.RE
|
.RE
|
||||||
.RS
|
.RS
|
||||||
Use "noise[:secs]" to report estimated noise level at intervals (default: 10 seconds).
|
Use "noise[:<secs>]" to report estimated noise level at intervals (default: 10 seconds).
|
||||||
.RE
|
.RE
|
||||||
.RS
|
.RS
|
||||||
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).
|
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).
|
||||||
|
|
|
@ -152,6 +152,7 @@ add_library(r_433 STATIC
|
||||||
devices/marlec_solar.c
|
devices/marlec_solar.c
|
||||||
devices/maverick_et73.c
|
devices/maverick_et73.c
|
||||||
devices/maverick_et73x.c
|
devices/maverick_et73x.c
|
||||||
|
devices/maverick_xr30.c
|
||||||
devices/mebus.c
|
devices/mebus.c
|
||||||
devices/megacode.c
|
devices/megacode.c
|
||||||
devices/missil_ml0757.c
|
devices/missil_ml0757.c
|
||||||
|
|
114
src/devices/maverick_xr30.c
Normal file
114
src/devices/maverick_xr30.c
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/** @file
|
||||||
|
Maverick XR-30 BBQ Sensor.
|
||||||
|
|
||||||
|
Copyright (C) 2022 jbfunk
|
||||||
|
Heavily derived from Maverick ET-73x BBQ Sensor (maverick_et73x.c), Copyright (C) 2016 gismo2004
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
Maverick XR-30 BBQ Sensor.
|
||||||
|
|
||||||
|
The thermometer transmits 4 identical messages every 12 seconds at 433.92 MHz,
|
||||||
|
|
||||||
|
Each message consists of 26 nibbles (104 bits total) but the first (non-data) bit (1) is getting dropped sometimes in reception, so for analysis the payload is shifted 7 bits left to align the bytes (or 8 bits if 0xaa is observed rather than 0x55 as the first byte received)
|
||||||
|
|
||||||
|
Payload:
|
||||||
|
|
||||||
|
- P = 32 bit preamble (0xaaaaaaaa; 7 or 8 bits shifted left for analysis)
|
||||||
|
- S = 32 bit sync-word (0xd391d391)
|
||||||
|
- F = 4 bit device state (0=default; 5=init)
|
||||||
|
- T = 10 bit temp1 (degree C, offset by 532)
|
||||||
|
- t = 10 bit temp2 (degree C, offset by 532)
|
||||||
|
- D = 16 bit digest (over FTt, includes non-transmitted device id renewed on a device reset) gen 0x8810 init 0x0d42
|
||||||
|
|
||||||
|
byte (after shift): 0 1 2 3 4 5 6 7 8 9 10 11
|
||||||
|
nibble (after shift): 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
||||||
|
msg: P P P P P P P P S S S S S S S S F T T Tt t t D D D D
|
||||||
|
PRE:32h SYNC: 32h FLAG:4h T:10d t:10d | DIGEST:16h
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "decoder.h"
|
||||||
|
|
||||||
|
static int maverick_xr30_callback(r_device *decoder, bitbuffer_t *bitbuffer)
|
||||||
|
{
|
||||||
|
data_t *data;
|
||||||
|
|
||||||
|
if (bitbuffer->num_rows != 1)
|
||||||
|
return DECODE_ABORT_EARLY;
|
||||||
|
|
||||||
|
//check correct data length
|
||||||
|
if (bitbuffer->bits_per_row[0] != 104) // 104 bits
|
||||||
|
return DECODE_ABORT_LENGTH;
|
||||||
|
|
||||||
|
uint8_t b[12];
|
||||||
|
//check for correct preamble/sync (0xaaaaaad391d391)
|
||||||
|
if (bitbuffer->bb[0][0] == 0x55) {
|
||||||
|
bitbuffer_extract_bytes(bitbuffer, 0, 7, b, 12 * 8); // shift in case first bit was not received properly
|
||||||
|
} else if (bitbuffer->bb[0][0] == 0xaa) {
|
||||||
|
bitbuffer_extract_bytes(bitbuffer, 0, 8, b, 12 * 8); // shift in case first bit was received properly
|
||||||
|
} else {
|
||||||
|
return DECODE_ABORT_EARLY; // preamble/sync missing
|
||||||
|
}
|
||||||
|
if (b[0] != 0xaa || b[1] != 0xaa || b[2] != 0xaa || b[3] != 0xd3 || b[4] != 0x91 || b[5] != 0xd3 || b[6] != 0x91)
|
||||||
|
return DECODE_ABORT_EARLY; // preamble/sync missing
|
||||||
|
|
||||||
|
int sync = b[3] << 24 | b[4] << 16 | b[5] << 8 | b[6];
|
||||||
|
int flags = (b[7] & 0xf0) >> 4;
|
||||||
|
int temp1 = (b[7] & 0x0f) << 6 | (b[8] & 0xfc) >> 2;
|
||||||
|
int temp2 = (b[8] & 0x03) << 8 | b[9];
|
||||||
|
int digest = b[10] << 8 | b[11];
|
||||||
|
|
||||||
|
float temp1_c = temp1 - 532.0f;
|
||||||
|
float temp2_c = temp2 - 532.0f;
|
||||||
|
|
||||||
|
char *status = "unknown";
|
||||||
|
if (flags == 0)
|
||||||
|
status = "default";
|
||||||
|
else if (flags == 5)
|
||||||
|
status = "init";
|
||||||
|
|
||||||
|
//digest is used to represent a session. This means, we get a new id if a reset or battery exchange is done.
|
||||||
|
int id = lfsr_digest16(&b[7], 3, 0x8810, 0x0d42) ^ digest;
|
||||||
|
|
||||||
|
decoder_logf(decoder, 1, __func__, "sync %08x, flags %0x, t1 %d, t2 %d, digest %04x, chk_data %02x%02x%02x, digest xor'ed: %04x",
|
||||||
|
sync, flags, temp1, temp2, digest, b[7], b[8], b[9], id);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
data = data_make(
|
||||||
|
"model", "", DATA_STRING, "Maverick-XR30",
|
||||||
|
"id", "Session_ID", DATA_INT, id,
|
||||||
|
"status", "Status", DATA_STRING, status,
|
||||||
|
"temperature_1_C", "TemperatureSensor1", DATA_FORMAT, "%.02f C", DATA_DOUBLE, temp1_c,
|
||||||
|
"temperature_2_C", "TemperatureSensor2", DATA_FORMAT, "%.02f C", DATA_DOUBLE, temp2_c,
|
||||||
|
NULL);
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
decoder_output_data(decoder, data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *output_fields[] = {
|
||||||
|
"model",
|
||||||
|
"id",
|
||||||
|
"status",
|
||||||
|
"temperature_1_C",
|
||||||
|
"temperature_2_C",
|
||||||
|
"mic",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
r_device maverick_xr30 = {
|
||||||
|
.name = "Maverick XR-30 BBQ Sensor",
|
||||||
|
.modulation = FSK_PULSE_PCM,
|
||||||
|
.short_width = 360,
|
||||||
|
.long_width = 360,
|
||||||
|
.reset_limit = 4096,
|
||||||
|
.decode_fn = &maverick_xr30_callback,
|
||||||
|
.fields = output_fields,
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue