Trigger Software Events Using a Generic 433MHz Wireless Remote
Combine an inexpensive software-defined radio with a generic key fob remote and some open source software to trigger events on a computer.
This post explains how to install the SDR drivers on Windows and Ubuntu and provides sample scripts that can be customized for use with IoT, media playback, photography or any other situation where a small remote is more convenient to use than a keyboard.
Remotes suitable for this use are sold as 433MHz universal fixed code cloning learning remotes and are intended for use with gates and garage doors. Avoid remotes designed to pair only with specific brands because they implement a rolling code security feature that broadcasts a different signal each time a button is pressed.
Windows Installation
Follow the SDR# (SDRSharp) Set Up Guide to install the required drivers on Windows.
- Download the Windows SDR Software Package
- Unzip the contents to a folder on the computer, such as
C:\SDRSharp
- Double-click
C:\SDRSharp\install-rtlsdr.bat
to download the required drivers - Plug in the SDR dongle and wait a few seconds for the system to detect the device
- Right-click
C:\SDRSharp\zadig.exe
and select Run as adminstrator - In the Zadig menu, select Options > List All Devices
- Select the SDR device, which will appear as something like RTL2832UHIDIR, RTL2832U or Bulk-In, Interface (Interface 0) from the drop down list
- Press the Replace Driver button to install the appropriate drivers on the device
Next, download a recent Windows release of rtl_433 from bintray.com
For my 64-bit version of Windows 8, I selected a recently updated win-x64 release, which for me was the file rtl_433-20.02-94-gf03710a-win-x64.zip.
After downloading, unzip the file and copy the static executable, rtl_433_64bit_static.exe, to a folder elsewhere on the computer, such as C:\Users\ccammack\bin
.
Open the console and run rtl_433_64bit_static.exe
from the command line:
C:\Users\ccammack\bin (master)
λ rtl_433_64bit_static.exe
rtl_433 version 20.02-94-gf03710a branch at 202007201253 inputs file rtl_tcp RTL-SDR
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "C:\Users\ccammack\bin\rtl_433.conf"...
Trying conf file at "C:\Users\ccammack\AppData\Local\rtl_433\rtl_433.conf"...
Trying conf file at "C:\ProgramData\rtl_433\rtl_433.conf"...
Registered 130 out of 158 device decoding protocols [ 1-4 8 11-12 15-17 19-21 23 25-26 29-36 38-60 63 67-71 73-100 102-105 108-116 119 121 124-128 130-149 151-158 ]
Found Rafael Micro R820T tuner
Exact sample rate is: 250000.000414 Hz
[R82XX] PLL not locked!
Sample rate set to 250000 S/s.
Tuner gain set to Auto.
Tuned to 433.920MHz.
Press each button on the remote, noting the output that appears in the console.
My remote has four buttons, labeled A
-D
, which produced the following output.
time : 2020-07-24 16:27:38
model : Generic-Remote House Code: 21845
Command : 12 Tri-State : ZZZZZZZZ0010
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 16:27:40
model : Generic-Remote House Code: 21845
Command : 48 Tri-State : ZZZZZZZZ0100
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 16:27:50
model : Generic-Remote House Code: 21845
Command : 192 Tri-State : ZZZZZZZZ1000
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 16:27:52
model : Generic-Remote House Code: 21845
Command : 3 Tri-State : ZZZZZZZZ0001
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
In population-dense areas, the SDR dongle may also pick up messages from other devices operating on the same frequency. For example, while testing, my SDR also received a message from one of the tire sensors on a passing Toyota indicating that it is over-inflated to nearly 38 PSI.
time : 2020-07-24 16:45:45
model : Schrader type : TPMS flags : 07
ID : 0CA376E
Pressure : 260.0 kPa Temperature: 28 C Integrity : CRC
To filter out these extraneous messages, create a wrapper script around rtl_433_64bit_static.exe
that looks for the button-specific Command
messages and triggers the desired events.
For my own use, I created a script called remote.bat
and placed it in C:\Users\ccammack\bin
along with rtl_433_64bit_static.exe
.
It might be possible to write this as a pure batch script using FOR
and FINDSTR
,
but a polyglot of batch and Powershell was much easier to get working.
Replace the calls to Write-Host
with your own functionality and adjust the length of the debounce
variable as needed to ignore duplicate events.
C:\Users\ccammack\bin (master)
λ cat remote.bat
<# :cmd header for PowerShell script
@ set dir=%~dp0
@ set ps1="%TMP%\%~n0-%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.ps1"
@ copy /b /y "%~f0" %ps1% >nul
@ powershell -NoProfile -ExecutionPolicy Bypass -File %ps1% %*
@ del /f %ps1%
@ goto :eof
#>
$ps = New-Object System.Diagnostics.Process
$ps.StartInfo.Filename = "rtl_433_64bit_static.exe"
$ps.StartInfo.RedirectStandardError = $True
$ps.StartInfo.RedirectStandardOutput = $True
$ps.StartInfo.UseShellExecute = $False
[void] $ps.Start()
$stopWatch = [System.Diagnostics.Stopwatch]::StartNew()
$debounce = 750
$prevLine = ""
while (!$ps.HasExited) {
[string] $line = $ps.StandardOutput.ReadLine();
if ($stopWatch.ElapsedMilliseconds -gt $debounce -and
$prevLine -like "*House Code: 21845") {
switch -wildcard ($line) {
"Command : 12*" { Write-Host "Button A" }
"Command : 48*" { Write-Host "Button B" }
"Command : 192*" { Write-Host "Button C" }
"Command : 3*" { Write-Host "Button D" }
}
$stopWatch.Restart()
}
$prevLine = $line
}
To test, run the batch file, press each button on the remote to see the feedback and then press Ctrl-C
to exit.
C:\Users\ccammack\bin (master)
λ remote.bat
Button A
Button B
Button C
Button D
Terminate batch job (Y/N)? y
Ubuntu Installation
Installation on Ubuntu is much simpler. Simply plug in the SDR dongle, install rtl-433
and run a quick test to make sure everything works.
~$ sudo apt -y install rtl-433
[...]
~$ rtl_433
[...]
Tuned to 433.920MHz.
Allocating 15 zero-copy buffers
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 01:13:14
model : Generic-Remote House Code: 21845
Command : 12 Tri-State : ZZZZZZZZ0010
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 01:13:15
model : Generic-Remote House Code: 21845
Command : 48 Tri-State : ZZZZZZZZ0100
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 01:13:17
model : Generic-Remote House Code: 21845
Command : 192 Tri-State : ZZZZZZZZ1000
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-07-24 01:13:18
model : Generic-Remote House Code: 21845
Command : 3 Tri-State : ZZZZZZZZ0001
^CSignal caught, exiting!
Reattached kernel driver
Write a shell script to filter the output.
~/bin$ cat ./remote.sh
#!/bin/sh
stopWatch=$(date +%s%3N)
debounce=750
prevLine=""
rtl_433 2>/dev/null | while read line; do
elapsed=$(( $(date +%s%3N) - stopWatch ))
if [ "$elapsed" -gt "$debounce" ] && \
[ "$prevLine" = "House Code: 21845" ]; then
case "$line" in
"Command : 12") echo "Button A"
;;
"Command : 48") echo "Button B"
;;
"Command : 192") echo "Button C"
;;
"Command : 3") echo "Button D"
;;
esac
stopWatch=$(date +%s%3N)
fi
prevLine="$line"
done
Run the script and press the remote buttons.
~/bin$ chmod +x ./remote.sh
~/bin$ ./remote.sh
Button A
Button B
Button C
Button D
^C
Need More Buttons?
If the key fob doesn’t have enough buttons for your needs, check the list of Supported device protocols on the rtl_433 page and the corresponding test folder for each device for some other possibilities.
One good option is the DirecTV RC66RX Remote Control, which can be had for under $10 and works well with this setup.
To enable RF mode on the remote:
- Move the device select slider all the way to the left
- Press and hold
Mute
andSELECT
until the LED flashes twice - Enter
9
6
1
and the LED will flash twice - Press
CHAN|PAGE Up
to enter RF mode and the LED will flash twice - Enter any 6-digit code you want to identify the remote
- Press
SELECT
and the LED will flash twice
If the LED does not flash twice in the last step, repeat the procedure without any delay between steps.
Run rtl_433
again and press some buttons to see the output.
C:\Users\ccammack\bin (master)
λ rtl_433_64bit_static.exe
[...]
Tuned to 433.920MHz.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-08-16 00:54:49
model : DirecTV-RC66RX id : 123456
button_id : 0x30 button_name: [VCR PLAY] event : INITIAL
mic : CHECKSUM
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-08-16 00:54:49
model : DirecTV-RC66RX id : 123456
button_id : 0x30 button_name: [VCR PLAY] event : REPEAT
mic : CHECKSUM
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-08-16 00:55:03
model : DirecTV-RC66RX id : 123456
button_id : 0x31 button_name: [VCR STOP] event : INITIAL
mic : CHECKSUM
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-08-16 00:55:03
model : DirecTV-RC66RX id : 123456
button_id : 0x31 button_name: [VCR STOP] event : REPEAT
mic : CHECKSUM
Signal caught, exiting!
The VOL
, Mute
, TV INPUT
and TV POWER
buttons do not generate unique RF signals because they were intended to control the functions on a TV or stereo using IR.
Instead, they all broadcast a single common RF signal, which appears as DTV: IR ALERT
in the output stream.
The remaining ~40 buttons all generate unique RF signals. In addition, rtl_433
will automatically distinguish the INITIAL
and REPEAT
button events in the output.
time : 2020-08-16 00:48:54
model : DirecTV-RC66RX id : 123456
button_id : 0x5B button_name: [DTV: IR ALERT] event : INITIAL
mic : CHECKSUM
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2020-08-16 00:48:54
model : DirecTV-RC66RX id : 123456
button_id : 0x5B button_name: [DTV: IR ALERT] event : REPEAT
mic : CHECKSUM