R900 meter, HackRF and signal transmission - can't receive anything on ESP32 ( hardwired to HackRF )
Current Situation
I captured a R900 packet from a meter, cleaned it using URH to remove noise etc - got the perfect waveform.
Connected my HackRF to a CC1101 module ( E07 900M10S) directly, flashed the example/OOK_Receiver onto ESP32. The pin connection is:
- GD02 - IO21
- GD00 - O15
- MISO - IO19
- MOSI - IO23
- SCK - IO18
- CSN - IO5
I confirmed that the packet is recognized by rtl-sdr dongle and rtl_433:
rtl_433 -f 912e6 -s 2e6 -R 228
rtl_433 version 25.02 (2025-02-19) inputs file rtl_tcp RTL-SDR SoapySDR with TLS
New defaults active, use "-Y classic -s 250k" if you need the old defaults
Found Rafael Micro R820T tuner
[SDR] Using device 0: Realtek, RTL2838UHIDIR, SN: 00000001, "Generic RTL2832U OEM"
Exact sample rate is: 2000000.052982 Hz
[R82XX] PLL not locked!
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2025-09-26 16:36:57
model : Neptune-R900 id : 1234567890
unkn1 : 163 unkn2 : 4 nouse : 0 backflow : 0 consumption: 12345678 unkn3 : 0 leak : 0 leaknow : 0 extra : 123456
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
I do the transfer as
hackrf_transfer -f 912e6 -s 2e6 -x 1 -t generated.cs8
Logs
> pio run -e esp32_cc1101 -t monitor --upload-port /dev/ttyUSB0
Processing esp32_cc1101 (board: esp32dev; framework: arduino; platform: [email protected])
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Please build project in debug configuration to get more details about an exception.
See https://docs.platformio.org/page/projectconf/build_configurations.html
--- Terminal on /dev/ttyUSB0 | 921600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
N:
N: ****** setup ******
rtl_433_ESP(6): CC1101 gpio receive pin: 15
rtl_433_ESP(6): CC1101 receive frequency: 912.000000
rtl_433_ESP(6): # of device(s) configured 170
rtl_433_ESP(6): ssizeof(r_device): 112
rtl_433_ESP(6): cfg->devices size: 19040
N: ****** setup complete ******
----- CC1101 Status -----
CC1101_MDMCFG1: 0x02
CC1101_MDMCFG2: 0x30
CC1101_MDMCFG3: 0x93
CC1101_MDMCFG4: 0x07
-------------------------
CC1101_DEVIATN: 0x14
CC1101_AGCCTRL0: 0x91
CC1101_AGCCTRL1: 0x40
CC1101_AGCCTRL2: 0xc7
-------------------------
CC1101_IOCFG0: 0x0d
CC1101_IOCFG1: 0x2e
CC1101_IOCFG2: 0x2e
-------------------------
CC1101_FIFOTHR: 0x07
CC1101_SYNC0: 0xad
CC1101_SYNC1: 0x12
-------------------------
CC1101_PKTLEN: 0x00
CC1101_PKTCTRL0: 0x32
CC1101_PKTCTRL1: 0x04
-------------------------
CC1101_ADDR: 0x00
CC1101_CHANNR: 0x00
CC1101_FSCTRL0: 0x00
CC1101_FSCTRL1: 0x0f
-------------------------
CC1101_FREQ0: 0xb1
CC1101_FREQ1: 0x13
CC1101_FREQ2: 0x23
-------------------------
CC1101_MCSM0: 0x14
CC1101_MCSM1: 0x30
CC1101_MCSM2: 0x07
-------------------------
CC1101_FOCCFG: 0x76
CC1101_BSCFG: 0x6c
CC1101_WOREVT0: 0x6b
CC1101_WOREVT1: 0x87
CC1101_WORCTRL: 0xf8
CC1101_FREND0: 0x11
CC1101_FREND1: 0x56
-------------------------
rtl_433_ESP(6): CC1101_FSCAL0: 0x0d
Ignored Signal length: 8681CC1101_FSCAL1: 0x2f
, Time since last bit length: 1689, Gap length: 1180707, Signal RSSI: -76, Current RSSI: -82, pulses: 0CC1101_FSCAL2: 0x2b
, noise count: 1
CC1101_FSCAL3: 0xaa
-------------------------
CC1101_RCCTRL0: 0x00
CC1101_RCCTRL1: 0x41
-------------------------
CC1101_PARTNUM: 0x00
CC1101_VERSION: 0x14
CC1101_MARCSTATE: 0x0d
CC1101_PKTSTATUS: 0xb0
CC1101_RXBYTES: 0x00
----- CC1101 Status -----
rtl_433_ESP(6): Ignored Signal length: 60000, Time since last bit length: 40064, Gap length: 30227376, Signal RSSI: -58, Current RSSI: -92, pulses: 0, noise count: 1
rtl_433_ESP(6): Ignored Signal length: 60000, Time since last bit length: 40064, Gap length: 1220420, Signal RSSI: -58, Current RSSI: -92, pulses: 0, noise count: 3
rtl_433_ESP(6): Ignored Signal length: 61000, Time since last bit length: 40064, Gap length: 802432, Signal RSSI: -58, Current RSSI: -92, pulses: 0, noise count: 5
rtl_433_ESP(6): Ignored Signal length: 60000, Time since last bit length: 40064, Gap length: 646444, Signal RSSI: -58, Current RSSI: -92, pulses: 0, noise count: 7
rtl_433_ESP(6): Ignored Signal length: 36000, Time since last bit length: 40064, Gap length: 2098444, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 7
rtl_433_ESP(6): Ignored Signal length: 37000, Time since last bit length: 40064, Gap length: 1043432, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 7
rtl_433_ESP(6): Ignored Signal length: 36000, Time since last bit length: 40064, Gap length: 665432, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 7
rtl_433_ESP(6): Ignored Signal length: 37000, Time since last bit length: 40064, Gap length: 2635444, Signal RSSI: -70, Current RSSI: -92, pulses: 0, noise count: 7
rtl_433_ESP(6): Ignored Signal length: 87000, Time since last bit length: 40064, Gap length: 6179432, Signal RSSI: -81, Current RSSI: -92, pulses: 0, noise count: 8
rtl_433_ESP(6): Ignored Signal length: 87000, Time since last bit length: 40064, Gap length: 795432, Signal RSSI: -81, Current RSSI: -92, pulses: 0, noise count: 9
rtl_433_ESP(7): Average RSSI Signal -91 dbm, adjusted RSSI Threshold -82, samples 50000
rtl_433_ESP(6): Ignored Signal length: 87000, Time since last bit length: 40060, Gap length: 11068444, Signal RSSI: -81, Current RSSI: -92, pulses: 0, noise count: 10
rtl_433_ESP(6): Ignored Signal length: 37000, Time since last bit length: 40064, Gap length: 4079413, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 12
rtl_433_ESP(6): Ignored Signal length: 37000, Time since last bit length: 40064, Gap length: 957421, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 12
rtl_433_ESP(6): Ignored Signal length: 36000, Time since last bit length: 40064, Gap length: 3162433, Signal RSSI: -64, Current RSSI: -92, pulses: 0, noise count: 12
rtl_433_ESP(6): Ignored Signal length: 102000, Time since last bit length: 40065, Gap length: 3862421, Signal RSSI: -57, Current RSSI: -92, pulses: 1, noise count: 13
rtl_433_ESP(6): Ignored Signal length: 100000, Time since last bit length: 40065, Gap length: 1310410, Signal RSSI: -66, Current RSSI: -92, pulses: 0, noise count: 14
rtl_433_ESP(6): Ignored Signal length: 102000, Time since last bit length: 40065, Gap length: 935409, Signal RSSI: -56, Current RSSI: -92, pulses: 0, noise count: 16
Configuration
### platformio.ini
[env:esp32_cc1101]
board = esp32dev
build_flags =
'-DLOG_LEVEL=LOG_LEVEL_TRACE'
'-DONBOARD_LED=2' ; My ESP32 board had this wiring
; *** rtl_433_ESP Options ***
'-DRF_MODULE_FREQUENCY=912.00'
'-DOOK_MODULATION=true' ; False is FSK, True is OOK
; '-DRTL_DEBUG=4' ; rtl_433 verbose mode
; '-DRTL_VERBOSE=58' ; LaCrosse TX141-Bv2, TX141TH-Bv2, TX141-Bv3, TX141W, TX145wsdth sensor
; '-DRAW_SIGNAL_DEBUG=true' ; display raw received messages
; '-DMEMORY_DEBUG=true' ; display memory usage information
'-DDEMOD_DEBUG=true' ; display signal debug info
; '-DMY_DEVICES=true' ; subset of devices
'-DENABLE_DECODE_Lacrosse_TX141' ; needed for some compatibility
'-DENABLE_DECODE_NeptuneR900' ; only Neptune is enabled
; '-DPUBLISH_UNPARSED=true' ; publish unparsed signal details
'-DMINRSSI=-82'
; '-DRSSI_THRESHOLD=12' ; Apply a delta of 12 to average RSSI level
; '-DAVERAGE_RSSI=5000' ; Display RSSI floor ( Average of 5000 samples )
; '-DSIGNAL_RSSI=true' ; Display during signal receive
; '-DOOK_MODULATION=false' ; False is FSK, True is OOK
; *** RF Module Options ***
'-DRF_CC1101="CC1101"' ; CC1101 Transceiver Module
; '-DRF_MODULE_CS=5' ; pin to be used as chip select
'-DRF_MODULE_GDO0=15' ; CC1101 pin GDO0 - Breadboard is 22 versus 13 on soldered
'-DRF_MODULE_GDO2=21' ; CC1101 pin GDO2
; '-DRF_MODULE_INIT_STATUS=true' ; Display transceiver config during startup
; *** RadioLib Options ***
; '-DRADIOLIB_DEBUG=true'
; '-DRADIOLIB_VERBOSE=true'
; *** FSK Setting Testing ***
;'-DsetBitrate'
;'-DsetFreqDev'
;'-DsetRxBW'
monitor_port = /dev/ttyUSB0
monitor_speed = 921600
upload_port = /dev/ttyUSB0
upload_speed = 921600
Environment
- OS: Arch Linux
- Software: examples/OOK_Receiver
- Node: n/a
- npm: n/a
Process Supervisor
not applicable
Additional Context
No response
The current code has issues with high-bitrate short messages.
See https://github.com/Entropy512/rtl_433_ESP/tree/neptune_r900 - At some point I'm going to upstream the "pending noise" fixes for preambles, but fixing the other stuff needs more work. But making R900 work also requires changing a bunch of hardcoded values, so changes to the build system are going to be required. I might revisit this sometime next year.