Trasteando con rtl-sdr y el Efergy Hub

Ha llovido ya mucho desde que en esta entrada os mostraba como era el monitor de consumo energético Efergy E2 y hoy retomamos ese tema. Además del monitor de consumo también tengo/tenía el complemento que te permitía subir a la nube de Efergy todos tus consumos para luego poder tener unas gráficas bonitas en un panel de control en la web. Pues bien, todo funcionó muy bien hasta hace unos meses, ya que en octubre’15 dejaron de subirse las lecturas. El módulo encargado de ello, el Efergy Hub, dejó de funcionar. Estuve trasteándolo pero no conseguí hacerlo revivir.

Efergy Hub
Efergy Hub, vista frontal

 

Efergy Hub
Efergy Hub, vista trasera

En la parte frontal vemos los leds de alimentación (rojo), recepción de lectura (naranja) y tráfico de red Ethernet (verde). Por la parte de atrás tenemos el conector de alimentación (5v 300ma) y el conector Ethernet de 10Mb.

Seguimos. Le damos la vuelta al aparato y vemos que tiene cuatro patitas de goma, bajo las que nos imaginamos que están los tornillos que cierran la carcasa:

Efergy Hub, parte inferior
Efergy Hub, parte inferior

 

Vista interna 1
Vista interna 1

Me imagino que esas manchas en las conexiones tendrán algo que ver con el mal funcionamiento del módulo. Pero continuemos, que viene lo mejor. Retiramos esos cuatro tornillos más, soltamos la antena de esa especie de guía por la que va, empujándola ligeramente (no esta pegada ni nada), y vemos el corazón del aparato:

Efergy Hub al desnudo
Efergy Hub al desnudo

 

Más detenidamente, vemos que el procesador central es un PIC18F66j65-I/PT de Microchip, del que podéis descargar el datasheet desde aquí. Junto a él encontramos una memoria (SPI Bus serial EEPROM), también de Microchip, la 25A2E48I, de 256bytes que parece que se usa para guardar la dirección MAC única del dispositivo (12 bytes). Su datasheet lo podéis descargar de aquí. En la parte de la entrada de alimentación vemos un regulador lineal MCP 1703 (también de Microchip, ver hoja de datos aquí) que se usa para adaptar la tensión de 5V a 3.3v que es a la que funciona todo el sistema.

El módulo encargado de la recepción es un RFM01 de HopeRF (datasheet aquí), en su versión de 433Mhz, ya que el emisor que se  coloca en la caja de diferenciales funciona en la banda de 433.55Mhz.

Como curiosidad tenemos ese conector sin soldar de 6 pines a la derecha de la última imagen, en el que con un multímetro se puede ver fácilmente que el primer pin, marcado con un cuadrado, es el de GND, y el tercero es el de 3.3v. Tambien  es fácil ver con el multímetro de donde a donde van el resto de pines.

Una vez llegado a este punto, conecto un alimentador y el cable de red, y para mi sorpresa, el muy ******** ¡FUNCIONA!…

Efergy hub funcionando
Efergy hub funcionando

¡Vaya cara de tonto que se me ha quedado!… Me he ahorrado 65€ que es lo que vale uno nuevo… Pero bueno, eso no me hace desviarme del objetivo de esta entrada, que es lo más divertido de todo esto: el rtl-sdr.

RTL-SDR, ¿qué es? y ¿qué podemos hacer con él?

Pues en principio se vende como un decodificador de TDT por USB para el ordenador, pero le pasa como a las antiguas tarjetas de televisión BT8x8, ¿os acordáis? que valían para decodificar el canal plus en España… Este decodificador que se puede comprar por 6’5€ en ebay, puede escuchar en cualquier frecuencia de radio del rango 52 a 2200Mhz, que nosotros le especifiquemos por software.

Decodificador TDT USB
Decodificador TDT USB

Un mundo de luz y ondas de colores tuvo que ver alguna mente lúcida para crear el software que lo hiciese, porque ahora podemos capturar cualquier señal, como por ejemplo la que nuestro emisor Efergy envía en la banda de 433,55Mhz y, mediante ingeniería inversa en el peor de los casos, decodificarla y usarla para lo que queramos: un datalogger por ejemplo. Existen varias versiones de estos dongles usb, que estan soportados para recibir señales en Linux. El que yo tengo es la version E4000, que soporta el rango que os he dicho antes. En la web del proyecto OsmoSDR tenéis más información.

En cristiano, ¿qué estoy diciendo? Pues que con una inversión de 6.5€ podemos tener un Efergy Hub, y sin necesidad de tener que estar enviando a ninguna web ningún dato de nuestro consumo eléctrico. Vamos a ello.

Lo primero es conectar el dispositivo a nuestro equipo, en mi caso, una odroid C1 y comprobar que es reconocido correctamente:

root@odroid:~/git# lsusb
Bus 001 Device 007: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 005: ID 1058:10b8 Western Digital Technologies, Inc.
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Perfecto. vemos que nuestro modulo RTL2838 DVB-T se reconoce correctamente. Leyendo la documentación vemos, que existe una incompatibilidad entre el software que vamos a usar y el modulo que carga el kernel para controlar habitualmente estos decodificadores, por tanto tenemos que evitar que se cargue el modulo dvb_usb_rtl28xxu al pincharlo. Para ello solo tenemos que añadir en el fichero /etc/modprobe.d/blacklist.conf la linea:

blacklist dvb_usb_rtl28xxu

Reiniciamos el equipo y ya debería bloquear la carga de ese módulo y sus dependencias, que hacen que luego el software de captura y decodificación no funcionen correctamente.

Compilación e instalación del software

El software que vamos a usar es el de OsmoSDR, y un programa de Nathaniel Elijah que decodifica las señales de los dispositivos Efergy.

Descargamos el software OsmoSDR:

root@odroid:/tmp# git clone git://git.osmocom.org/rtl-sdr.git
Cloning into 'rtl-sdr'...
remote: Counting objects: 1617, done.
remote: Compressing objects: 100% (711/711), done.
remote: Total 1617 (delta 1182), reused 1213 (delta 898)
Receiving objects: 100% (1617/1617), 345.89 KiB | 0 bytes/s, done.
Resolving deltas: 100% (1182/1182), done.
Checking connectivity... done.

 

Lo configuramos, y compilamos:

root@odroid:/tmp# cd rtl-sdr/

root@odroid:/tmp/rtl-sdr# ls
AUTHORS cmake CMakeLists.txt configure.ac COPYING Doxyfile.in git-version-gen include librtlsdr.pc.in m4 Makefile.am README rtl-sdr.rules src

root@odroid:/tmp/rtl-sdr# mkdir build

root@odroid:/tmp/rtl-sdr# cd build

root@odroid:/tmp/rtl-sdr/build# cmake ../
-- The C compiler identification is GNU 4.9.3
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Build type not specified: defaulting to release.
-- Extracting version information from git describe...
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.26")
-- checking for module 'libusb-1.0'
-- found libusb-1.0, version 1.0.17
-- Looking for libusb_handle_events_timeout_completed
-- Looking for libusb_handle_events_timeout_completed - found
-- Looking for libusb_error_name
-- Looking for libusb_error_name - found
-- Found libusb-1.0: /usr/include/libusb-1.0, /usr/lib/arm-linux-gnueabihf/libusb-1.0.so
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Udev rules not being installed, install them with -DINSTALL_UDEV_RULES=ON
-- Building with kernel driver detaching disabled, use -DDETACH_KERNEL_DRIVER=ON to enable
-- Building for version: v0.5.3-12-ge3c0 / 0.5git
-- Using install prefix: /usr/local
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/rtl-sdr/build

root@odroid:/tmp/rtl-sdr/build# make
Scanning dependencies of target convenience_static
[ 5%] Building C object src/CMakeFiles/convenience_static.dir/convenience/convenience.c.o
Linking C static library libconvenience_static.a
[ 5%] Built target convenience_static
Scanning dependencies of target rtlsdr_shared
[ 10%] Building C object src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o
[ 15%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o
[ 20%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o
[ 25%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o
[ 30%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o
[ 35%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_r82xx.c.o
Linking C shared library librtlsdr.so
[ 35%] Built target rtlsdr_shared
Scanning dependencies of target rtl_adsb
[ 40%] Building C object src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o
Linking C executable rtl_adsb
[ 40%] Built target rtl_adsb
Scanning dependencies of target rtl_eeprom
[ 45%] Building C object src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o
Linking C executable rtl_eeprom
[ 45%] Built target rtl_eeprom
Scanning dependencies of target rtl_fm
[ 50%] Building C object src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o
Linking C executable rtl_fm
[ 50%] Built target rtl_fm
Scanning dependencies of target rtl_power
[ 55%] Building C object src/CMakeFiles/rtl_power.dir/rtl_power.c.o
Linking C executable rtl_power
[ 55%] Built target rtl_power
Scanning dependencies of target rtl_sdr
[ 60%] Building C object src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o
Linking C executable rtl_sdr
[ 60%] Built target rtl_sdr
Scanning dependencies of target rtl_tcp
[ 65%] Building C object src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o
Linking C executable rtl_tcp
[ 65%] Built target rtl_tcp
Scanning dependencies of target rtl_test
[ 70%] Building C object src/CMakeFiles/rtl_test.dir/rtl_test.c.o
Linking C executable rtl_test
[ 70%] Built target rtl_test
Scanning dependencies of target rtlsdr_static
[ 75%] Building C object src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o
[ 80%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o
[ 85%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o
[ 90%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o
[ 95%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o
[100%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_r82xx.c.o
Linking C static library librtlsdr.a
[100%] Built target rtlsdr_static

root@odroid:/tmp/rtl-sdr/build#

Lo instalamos:

root@odroid:/tmp/rtl-sdr/build# make install
[  5%] Built target convenience_static
[ 35%] Built target rtlsdr_shared
[ 40%] Built target rtl_adsb
[ 45%] Built target rtl_eeprom
[ 50%] Built target rtl_fm
[ 55%] Built target rtl_power
[ 60%] Built target rtl_sdr
[ 65%] Built target rtl_tcp
[ 70%] Built target rtl_test
[100%] Built target rtlsdr_static
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/lib/pkgconfig/librtlsdr.pc
-- Installing: /usr/local/include/rtl-sdr.h
-- Installing: /usr/local/include/rtl-sdr_export.h
-- Installing: /usr/local/lib/librtlsdr.so.0.5git
-- Installing: /usr/local/lib/librtlsdr.so.0
-- Installing: /usr/local/lib/librtlsdr.so
-- Installing: /usr/local/lib/librtlsdr.a
-- Installing: /usr/local/bin/rtl_sdr
-- Installing: /usr/local/bin/rtl_tcp
-- Installing: /usr/local/bin/rtl_test
-- Installing: /usr/local/bin/rtl_fm
-- Installing: /usr/local/bin/rtl_eeprom
-- Installing: /usr/local/bin/rtl_adsb
-- Installing: /usr/local/bin/rtl_power

Como el software no es un paquete que venga de los repositorios del sistema operativo, es recomendable que no se instale en /usr/bin y /usr/lib, para que no sobrescriba nada. Esto tiene dos problemas, que es posible, dependiendo de la configuración del sistema, que no se encuentren las librerías y/o los ejecutables. Para solventarlo, en mi caso tengo que añadir a la variable del sistema PATH la ruta /usr/local/bin, en el fichero /etc/environment, y para que encuentre las librerías creo un fichero /etc/ld.so.conf.d/rtl.conf con el siguiente contenido:

/usr/local/lib/

y ejecutamos el programa ldconfig para que relea las configuraciones de las rutas de librerías:

root@odroid:/etc/ld.so.conf.d# ldconfig

root@odroid:/etc/ld.so.conf.d#

 

Ya tenemos instalada una parte, la de captura de señales, ahora vamos con el software decodificador de la señal:

root@odroid:/tmp# git clone https://github.com/daveblackuk/RPI_Efergy
Cloning into 'RPI_Efergy'...
remote: Counting objects: 28, done.
remote: Total 28 (delta 0), reused 0 (delta 0), pack-reused 28
Unpacking objects: 100% (28/28), done.
Checking connectivity... done.

root@odroid:/tmp# cd RPI_Efergy/

root@odroid:/tmp/RPI_Efergy# ls -ali
total 48
29365 drwxr-xr-x 3 root root 180 ene 19 21:51 .
1860 drwxrwxrwt 12 root root 240 ene 19 22:28 ..
29469 -rwxr-xr-x 1 root root 84 ene 19 21:51 debugit.sh
29470 -rwxr-xr-x 1 root root 83 ene 19 21:51 doit.sh
29466 -rwxr-xr-x 1 root root 4842 ene 19 21:51 EfergyRPI_001.c
29467 -rwxr-xr-x 1 root root 21148 ene 19 21:51 EfergyRPI_log.c
29366 drwxr-xr-x 8 root root 260 ene 19 21:51 .git
29471 -rwxr-xr-x 1 root root 94 ene 19 21:51 logit.sh
29468 -rw-r--r-- 1 root root 41 ene 19 21:51 README.md
root@odroid:/tmp/RPI_Efergy# cd RPI_Efergy/
root@odroid:/tmp/RPI_Efergy# cat README.md
gcc -lm -o EfergyRPI_001 EfergyRPI_001.c

root@odroid:/tmp/RPI_Efergy# gcc -lm -o EfergyRPI_001 EfergyRPI_001.c
/tmp/ccIoHNOM.o: In function `calculate_watts':
EfergyRPI_001.c:(.text+0xb0): undefined reference to `pow'
collect2: error: ld returned 1 exit status

 

Lo que tenemos en este punto es un fallo en la documentación del software, la orden correcta para compilar es la siguiente:

root@odroid:/tmp/RPI_Efergy# gcc -o EfergyRPI_001 EfergyRPI_001.c -lm

root@odroid:/tmp/RPI_Efergy# cp EfergyRPI_001 /usr/local/bin

root@odroid:/tmp/RPI_Efergy#

Ahora ya lo tenemos todo listo para capturar y decodificar la señal. Para ello vamos a usar el programa rtl_fm para sintonizar el canal y capturar la señal, para luego enviarsela a EfergyRPI y que la decodifique:

root@odroid:~# sudo rtl_fm -f 433500000 -s 200000 -r 96000 -g 19.7  2>/dev/null | EfergyRPI_001
Efergy E2 Classic decode

01/19/16,22:42:11,544.775391
01/19/16,22:42:17,542.373047
01/19/16,22:42:23,540.000000
01/19/16,22:42:29,542.373047
01/19/16,22:42:35,540.000000
01/19/16,22:42:41,542.373047
01/19/16,22:42:47,544.775391
01/19/16,22:42:53,547.177734
01/19/16,22:42:59,542.373047
01/19/16,22:43:05,544.775391
01/19/16,22:43:11,542.373047
01/19/16,22:43:17,544.775391
01/19/16,22:43:23,547.177734
01/19/16,22:43:29,547.177734
01/19/16,22:43:35,542.373047
01/19/16,22:43:41,542.373047
01/19/16,22:43:47,540.000000
01/19/16,22:43:53,542.373047
01/19/16,22:43:59,544.775391
01/19/16,22:44:05,542.373047
01/19/16,22:44:11,542.373047
01/19/16,22:44:17,542.373047
01/19/16,22:44:23,544.775391
^C
root@odroid:~#

Dependiendo del modelo de decodificador que useis puede darse el caso, como me ha pasado a mi, que en lugar de 433.55 tenga que poner 433.50 (-f 433500000 en el comando), algo mas o algo menos de la frecuencia que esteis sintonizando. Se debe a la precisión o calibración con la que venga de fábrica el aparato.

Una vez tenemos la información de consumo capturada podemos hacer lo que queramos con ella: enviarla a un servidor MQTT, al que este conectado un arduino con una pantalla LCD y mostrar la información gráficamente (sustituir el receptor LCD de Efergy por uno nuestro a color y con gráficas…), enviar la información a una base de datos MySQL para tener los históricos como hace el Efergy Hub, enviarlos a una base de datos RRD y usar Cacti para hacer los gráficos, enviarnos correos si se supera cierto consumo, o enviar alertas por Telegram… Ya depende de la imaginación de cada uno…

¿y qué pasa con otros dispositivos que usen la banda de 433Mhz?

Pues lo que pasa es que estamos de suerte. Hay cientos de dispositivos que funcionan en la banda de 433Mhz, sensores meteorológicos de Oregon Scientific, enchufes controlados por radio frecuencia, etc… Yo tengo un sensor de temperatura Oregon THGR122NX y unos enchufes radiocontrolados DI-O 54796. Como el decodificador de TDT solo es un receptor, no envía señales, podemos recibir los datos que envía el sensor Oregon, y los que envía el mando de los enchufes radiocontrolados. En el segundo caso nos puede valer para efectuar ciertas acciones con el mando de los enchufes, por ejemplo: reiniciar el servidor cuando se pulse una secuencia concreta de pulsaciones (yo que sé, es lo primero que me ha pasado por la cabeza, no me lo tengáis en cuenta…).

Además ya hay un proyecto que se encarga de decodificar todas estas señales, y mostrárnoslas de forma similar a la del software del Efergy que veíamos antes, se llama rtl_433. El software lo podemos descargar e instalar de forma similar al anterior (da unos cuantos Warnings a la hora de compilar, no os asustéis):

root@odroid:/tmp# git clone https://github.com/merbanan/rtl_433
Cloning into 'rtl_433'...
remote: Counting objects: 3905, done.
remote: Compressing objects: 100% (85/85), done.
remote: Total 3905 (delta 49), reused 1 (delta 1), pack-reused 3819
Receiving objects: 100% (3905/3905), 1.09 MiB | 1.04 MiB/s, done.
Resolving deltas: 100% (2789/2789), done.
Checking connectivity... done.

root@odroid:/tmp# cd rtl_433/

root@odroid:/tmp/rtl_433# ls
AUTHORS  cmake  CMakeLists.txt  configure.ac  COPYING  Doxyfile.in  git-version-gen  include  m4  Makefile.am  README.md  rtl433.pc.in  src  tests

root@odroid:/tmp/rtl_433# mkdir build

root@odroid:/tmp/rtl_433# cd build

root@odroid:/tmp/rtl_433/build# cmake ../
-- The C compiler identification is GNU 4.9.3
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Build type not specified: defaulting to release.
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.26") 
-- checking for module 'librtlsdr'
--   found librtlsdr, version v0.5.3-12-ge3c0
-- Found librtlsdr: /usr/local/include, /usr/local/lib/librtlsdr.so
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/rtl_433/build

root@odroid:/tmp/rtl_433/build# make
Scanning dependencies of target data
[  2%] Building C object src/CMakeFiles/data.dir/data.c.o
/tmp/rtl_433/src/data.c: In function ‘print_json_data’:
/tmp/rtl_433/src/data.c:364:86: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                      ^
/tmp/rtl_433/src/data.c: In function ‘print_json_string’:
/tmp/rtl_433/src/data.c:380:55: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file) {
                                                       ^
/tmp/rtl_433/src/data.c:380:91: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file) {
                                                                                           ^
/tmp/rtl_433/src/data.c: In function ‘print_json_double’:
/tmp/rtl_433/src/data.c:391:55: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                       ^
/tmp/rtl_433/src/data.c:391:87: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                                                       ^
/tmp/rtl_433/src/data.c: In function ‘print_json_int’:
/tmp/rtl_433/src/data.c:396:52: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                    ^
/tmp/rtl_433/src/data.c:396:81: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                                                 ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_data’:
/tmp/rtl_433/src/data.c:402:84: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_kv_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                    ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_double’:
/tmp/rtl_433/src/data.c:432:53: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_int’:
/tmp/rtl_433/src/data.c:437:50: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                  ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_string’:
/tmp/rtl_433/src/data.c:443:53: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_string(data_printer_context_t *printer_ctx, const char *data, char *format, FILE *file)
                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_csv_data’:
/tmp/rtl_433/src/data.c:449:85: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_csv_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_csv_string’:
/tmp/rtl_433/src/data.c:473:90: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_csv_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file)
                                                                                          ^
Linking C static library libdata.a
[  2%] Built target data
Scanning dependencies of target rtl_433
[  4%] Building C object src/CMakeFiles/rtl_433.dir/baseband.c.o
[  6%] Building C object src/CMakeFiles/rtl_433.dir/bitbuffer.c.o
[  8%] Building C object src/CMakeFiles/rtl_433.dir/data.c.o
/tmp/rtl_433/src/data.c: In function ‘print_json_data’:
/tmp/rtl_433/src/data.c:364:86: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                      ^
/tmp/rtl_433/src/data.c: In function ‘print_json_string’:
/tmp/rtl_433/src/data.c:380:55: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file) {
                                                       ^
/tmp/rtl_433/src/data.c:380:91: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file) {
                                                                                           ^
/tmp/rtl_433/src/data.c: In function ‘print_json_double’:
/tmp/rtl_433/src/data.c:391:55: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                       ^
/tmp/rtl_433/src/data.c:391:87: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                                                       ^
/tmp/rtl_433/src/data.c: In function ‘print_json_int’:
/tmp/rtl_433/src/data.c:396:52: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_json_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                    ^
/tmp/rtl_433/src/data.c:396:81: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_json_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                                                 ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_data’:
/tmp/rtl_433/src/data.c:402:84: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_kv_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                    ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_double’:
/tmp/rtl_433/src/data.c:432:53: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_double(data_printer_context_t *printer_ctx, double data, char *format, FILE *file)
                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_int’:
/tmp/rtl_433/src/data.c:437:50: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_int(data_printer_context_t *printer_ctx, int data, char *format, FILE *file)
                                                  ^
/tmp/rtl_433/src/data.c: In function ‘print_kv_string’:
/tmp/rtl_433/src/data.c:443:53: warning: unused parameter ‘printer_ctx’ [-Wunused-parameter]
 static void print_kv_string(data_printer_context_t *printer_ctx, const char *data, char *format, FILE *file)
                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_csv_data’:
/tmp/rtl_433/src/data.c:449:85: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_csv_data(data_printer_context_t *printer_ctx, data_t *data, char *format, FILE *file)
                                                                                     ^
/tmp/rtl_433/src/data.c: In function ‘print_csv_string’:
/tmp/rtl_433/src/data.c:473:90: warning: unused parameter ‘format’ [-Wunused-parameter]
 static void print_csv_string(data_printer_context_t *printer_ctx, const char *str, char *format, FILE *file)
                                                                                          ^
[ 10%] Building C object src/CMakeFiles/rtl_433.dir/pulse_demod.c.o
[ 12%] Building C object src/CMakeFiles/rtl_433.dir/pulse_detect.c.o
[ 14%] Building C object src/CMakeFiles/rtl_433.dir/rtl_433.c.o
[ 17%] Building C object src/CMakeFiles/rtl_433.dir/util.c.o
[ 19%] Building C object src/CMakeFiles/rtl_433.dir/devices/acurite.c.o
[ 21%] Building C object src/CMakeFiles/rtl_433.dir/devices/alecto.c.o
[ 23%] Building C object src/CMakeFiles/rtl_433.dir/devices/ambient_weather.c.o
[ 25%] Building C object src/CMakeFiles/rtl_433.dir/devices/brennstuhl_rcs_2044.c.o
[ 27%] Building C object src/CMakeFiles/rtl_433.dir/devices/calibeur.c.o
[ 29%] Building C object src/CMakeFiles/rtl_433.dir/devices/cardin.c.o
[ 31%] Building C object src/CMakeFiles/rtl_433.dir/devices/chuango.c.o
[ 34%] Building C object src/CMakeFiles/rtl_433.dir/devices/current_cost.c.o
[ 36%] Building C object src/CMakeFiles/rtl_433.dir/devices/danfoss.c.o
[ 38%] Building C object src/CMakeFiles/rtl_433.dir/devices/dsc.c.o
[ 40%] Building C object src/CMakeFiles/rtl_433.dir/devices/ec3k.c.o
[ 42%] Building C object src/CMakeFiles/rtl_433.dir/devices/efergy_e2_classic.c.o
[ 44%] Building C object src/CMakeFiles/rtl_433.dir/devices/elv.c.o
[ 46%] Building C object src/CMakeFiles/rtl_433.dir/devices/esperanza_ews.c.o
[ 48%] Building C object src/CMakeFiles/rtl_433.dir/devices/fineoffset.c.o
[ 51%] Building C object src/CMakeFiles/rtl_433.dir/devices/generic_remote.c.o
[ 53%] Building C object src/CMakeFiles/rtl_433.dir/devices/generic_temperature_sensor.c.o
[ 55%] Building C object src/CMakeFiles/rtl_433.dir/devices/gt_wt_02.c.o
[ 57%] Building C object src/CMakeFiles/rtl_433.dir/devices/hideki.c.o
[ 59%] Building C object src/CMakeFiles/rtl_433.dir/devices/inovalley-kw9015b.c.o
[ 61%] Building C object src/CMakeFiles/rtl_433.dir/devices/intertechno.c.o
[ 63%] Building C object src/CMakeFiles/rtl_433.dir/devices/lacrosse.c.o
[ 65%] Building C object src/CMakeFiles/rtl_433.dir/devices/lacrossews.c.o
[ 68%] Building C object src/CMakeFiles/rtl_433.dir/devices/mebus.c.o
[ 70%] Building C object src/CMakeFiles/rtl_433.dir/devices/newkaku.c.o
[ 72%] Building C object src/CMakeFiles/rtl_433.dir/devices/nexus.c.o
[ 74%] Building C object src/CMakeFiles/rtl_433.dir/devices/oil_watchman.c.o
[ 76%] Building C object src/CMakeFiles/rtl_433.dir/devices/oregon_scientific.c.o
/tmp/rtl_433/src/devices/oregon_scientific.c: In function ‘get_os_temperature’:
/tmp/rtl_433/src/devices/oregon_scientific.c:18:63: warning: unused parameter ‘sensor_id’ [-Wunused-parameter]
 float get_os_temperature(unsigned char *message, unsigned int sensor_id) {
                                                               ^
/tmp/rtl_433/src/devices/oregon_scientific.c: In function ‘get_os_humidity’:
/tmp/rtl_433/src/devices/oregon_scientific.c:27:67: warning: unused parameter ‘sensor_id’ [-Wunused-parameter]
 unsigned int get_os_humidity(unsigned char *message, unsigned int sensor_id) {
                                                                   ^
/tmp/rtl_433/src/devices/oregon_scientific.c: In function ‘get_os_uv’:
/tmp/rtl_433/src/devices/oregon_scientific.c:34:61: warning: unused parameter ‘sensor_id’ [-Wunused-parameter]
 unsigned int get_os_uv(unsigned char *message, unsigned int sensor_id) {
                                                             ^
/tmp/rtl_433/src/devices/oregon_scientific.c: In function ‘get_os_battery’:
/tmp/rtl_433/src/devices/oregon_scientific.c:50:66: warning: unused parameter ‘sensor_id’ [-Wunused-parameter]
 unsigned int get_os_battery(unsigned char *message, unsigned int sensor_id) {
                                                                  ^
/tmp/rtl_433/src/devices/oregon_scientific.c: In function ‘get_os_rollingcode’:
/tmp/rtl_433/src/devices/oregon_scientific.c:57:70: warning: unused parameter ‘sensor_id’ [-Wunused-parameter]
 unsigned int get_os_rollingcode(unsigned char *message, unsigned int sensor_id) {
                                                                      ^
[ 78%] Building C object src/CMakeFiles/rtl_433.dir/devices/prologue.c.o
[ 80%] Building C object src/CMakeFiles/rtl_433.dir/devices/rubicson.c.o
[ 82%] Building C object src/CMakeFiles/rtl_433.dir/devices/silvercrest.c.o
[ 85%] Building C object src/CMakeFiles/rtl_433.dir/devices/steffen.c.o
[ 87%] Building C object src/CMakeFiles/rtl_433.dir/devices/tfa_twin_plus_30.3049.c.o
[ 89%] Building C object src/CMakeFiles/rtl_433.dir/devices/valeo.c.o
[ 91%] Building C object src/CMakeFiles/rtl_433.dir/devices/waveman.c.o
[ 93%] Building C object src/CMakeFiles/rtl_433.dir/devices/wt450.c.o
[ 95%] Building C object src/CMakeFiles/rtl_433.dir/devices/x10_rf.c.o
/tmp/rtl_433/src/devices/x10_rf.c: In function ‘X10_RF_callback’:
/tmp/rtl_433/src/devices/x10_rf.c:20:16: warning: comparison of promoted ~unsigned with unsigned [-Wsign-compare]
   && (bb[1][2] == (uint8_t)(~bb[1][3]))  // Check integrity
                ^
[ 97%] Building C object src/CMakeFiles/rtl_433.dir/devices/xc0348.c.o
Linking C executable rtl_433
[ 97%] Built target rtl_433
Scanning dependencies of target data-test
[100%] Building C object tests/CMakeFiles/data-test.dir/data-test.c.o
Linking C executable data-test
[100%] Built target data-test

root@odroid:/tmp/rtl_433/build# make install
[  2%] Built target data
[ 97%] Built target rtl_433
[100%] Built target data-test
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/include/rtl_433.h
-- Installing: /usr/local/include/rtl_433_devices.h
-- Installing: /usr/local/bin/rtl_433
-- Removed runtime path from "/usr/local/bin/rtl_433"

root@odroid:/tmp/rtl_433/build#

Ya está copilado e instalado en /usr/local/bin. Podemos ejecutarlo con la opción -h y ver que dispositivos es capaz de soportar y sus modos de funcionamiento:

root@odroid:~# rtl_433 -h
rtl_433: invalid option -- 'h'
rtl_433, an ISM band generic data receiver for RTL2832 based DVB-T receivers

Usage: = Tuner options =
[-d <device index>] (default: 0)
[-g <gain>] (default: 0 for auto)
[-f <frequency>] [-f...] Receive frequency(s) (default: 433920000 Hz)
[-p <ppm_error] Correct rtl-sdr tuner frequency offset error (default: 0)
[-s <sample rate>] Set sample rate (default: 250000 Hz)
[-S] Force sync output (default: async)
= Demodulator options =
[-R <device>] Listen only for the specified remote device (can be used multiple times)
[-l <level>] Change detection level used to determine pulses [0-32767] (0 = auto) (default: 8000)
[-z <value>] Override short value in data decoder
[-x <value>] Override long value in data decoder
= Analyze/Debug options =
[-a] Analyze mode. Print a textual description of the signal. Disables decoding
[-A] Pulse Analyzer. Enable pulse analyzis and decode attempt
[-D] Print debug info on event (repeat for more info)
[-q] Quiet mode, suppress non-data messages
[-W] Overwrite mode, disable checks to prevent files from being overwritten
= File I/O options =
[-t] Test signal auto save. Use it together with analyze mode (-a -t). Creates one file per signal
Note: Saves raw I/Q samples (uint8 pcm, 2 channel). Preferred mode for generating test files
[-r <filename>] Read data from input file instead of a receiver
[-m <mode>] Data file mode for input / output file (default: 0)
0 = Raw I/Q samples (uint8, 2 channel)
1 = AM demodulated samples (int16 pcm, 1 channel)
2 = FM demodulated samples (int16) (experimental)
3 = Raw I/Q samples (cf32, 2 channel)
Note: If output file is specified, input will always be I/Q
[-F] kv|json|csv Produce decoded output in given format. Not yet supported by all drivers.
[-C] native|si|customary Convert units in decoded output.
[<filename>] Save data stream to output file (a '-' dumps samples to stdout)

Supported devices:
[01] Silvercrest Remote Control
[02] Rubicson Temperature Sensor
[03] Prologue Temperature Sensor
[04] Waveman Switch Transmitter
[05] Steffen Switch Transmitter
[06] ELV EM 1000
[07] ELV WS 2000
[08] LaCrosse TX Temperature / Humidity Sensor
[09] Acurite 5n1 Weather Station
[10] Acurite 896 Rain Gauge
[11] Acurite Temperature and Humidity Sensor
[12] Oregon Scientific Weather Sensor
[13] Mebus 433
[14] Intertechno 433
[15] KlikAanKlikUit Wireless Switch
[16] AlectoV1 Weather Sensor (Alecto WS3500 WS4500 Ventus W155/W044 Oregon)
[17] Cardin S466-TX2
[18] Fine Offset Electronics, WH-2 Sensor
[19] Nexus Temperature & Humidity Sensor
[20] Ambient Weather Temperature Sensor
[21] Calibeur RF-104 Sensor
[22] X10 RF
[23] DSC Security Contact
[24] Brennstuhl RCS 2044
[25] GT-WT-02 Sensor
[26] Danfoss CFR Thermostat
[27] Energy Count 3000 (868.3 MHz)
[28] Valeo Car Key
[29] Chuango Security Technology
[30] Generic Remote SC226x EV1527
[31] TFA-Twin-Plus-30.3049 and Ea2 BL999
[32] Digitech XC0348 Weather Station
[33] WT450
[34] LaCrosse WS-2310 Weather Station
[35] Esperanza EWS
[36] Efergy e2 classic
[37] Inovalley kw9015b rain and Temperature weather station
[38] Generic temperature sensor 1
[39] Acurite 592TXR Temperature/Humidity Sensor and 5n1 Weather Station
[40] Acurite 986 Refrigerator / Freezer Thermometer
[41] HIDEKI TS04 Temperature and Humidity Sensor
[42] Watchman Sonic / Apollo Ultrasonic / Beckett Rocket oil tank monitor
[43] CurrentCost Current Sensor

root@odroid:~#

No está nada mal la lista de dispositivos soportados, aunque no llega a ser como la de RFXCOM, pero algo es algo por 6’5€ frente a los 100€ del emisor/receptor RFXCOM. Para probarlo solo tenemos que ejecutarlo sin ninguna opción:

root@odroid:~# rtl_433
Registering protocol "Silvercrest Remote Control"
Registering protocol "Rubicson Temperature Sensor"
Registering protocol "Prologue Temperature Sensor"
Registering protocol "Waveman Switch Transmitter"
Registering protocol "Steffen Switch Transmitter"
Registering protocol "ELV EM 1000"
Registering protocol "ELV WS 2000"
Registering protocol "LaCrosse TX Temperature / Humidity Sensor"
Registering protocol "Acurite 5n1 Weather Station"
Registering protocol "Acurite 896 Rain Gauge"
Registering protocol "Acurite Temperature and Humidity Sensor"
Registering protocol "Oregon Scientific Weather Sensor"
Registering protocol "Mebus 433"
Registering protocol "Intertechno 433"
Registering protocol "KlikAanKlikUit Wireless Switch"
Registering protocol "AlectoV1 Weather Sensor (Alecto WS3500 WS4500 Ventus W155/W044 Oregon)"
Registering protocol "Cardin S466-TX2"
Registering protocol "Fine Offset Electronics, WH-2 Sensor"
Registering protocol "Nexus Temperature & Humidity Sensor"
Registering protocol "Ambient Weather Temperature Sensor"
Registering protocol "Calibeur RF-104 Sensor"
Registering protocol "X10 RF"
Registering protocol "DSC Security Contact"
Registering protocol "Brennstuhl RCS 2044"
Registering protocol "GT-WT-02 Sensor"
Registering protocol "Danfoss CFR Thermostat"
Registering protocol "Energy Count 3000 (868.3 MHz)"
Registering protocol "Valeo Car Key"
Registering protocol "Chuango Security Technology"
Registering protocol "Generic Remote SC226x EV1527"
Registering protocol "TFA-Twin-Plus-30.3049 and Ea2 BL999"
Registering protocol "Digitech XC0348 Weather Station"
Registering protocol "WT450"
Registering protocol "LaCrosse WS-2310 Weather Station"
Registering protocol "Esperanza EWS"
Registering protocol "Efergy e2 classic"
Registering protocol "Inovalley kw9015b rain and Temperature weather station"
Registering protocol "Generic temperature sensor 1"
Registering protocol "Acurite 592TXR Temperature/Humidity Sensor and 5n1 Weather Station"
Registering protocol "Acurite 986 Refrigerator / Freezer Thermometer"
Registering protocol "HIDEKI TS04 Temperature and Humidity Sensor"
Registering protocol "Watchman Sonic / Apollo Ultrasonic / Beckett Rocket oil tank monitor"
Registering protocol "CurrentCost Current Sensor"
Found 1 device(s):
0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 250000.000414 Hz
[R82XX] PLL not locked!
Sample rate set to 250000.
Bit detection level set to 8000.
Tuner gain set to Auto.
Reading samples in async mode...
Tuned to 433920000 Hz.
Weather Sensor THGR810  Channel 3 Temp: 19.1C  66.4F   Humidity: 51%
NewKaku event:
Model      = NewKaKu on/off/dimmer switch
KakuId     = 9735826 (H948E92)
Unit       = 4 (H04)
Group Call = No
Command    = On
Dim        = No
Dim Value  = 0
ac b3 2c ad 4c b2 cb 32 80
NewKaku event:
Model      = NewKaKu on/off/dimmer switch
KakuId     = 9735826 (H948E92)
Unit       = 4 (H04)
Group Call = No
Command    = Off
Dim        = No
Dim Value  = 0
ac b3 2c ad 4c b2 ca b2 80
Weather Sensor THGR810  Channel 3 Temp: 19.1C  66.4F   Humidity: 51%

Se puede ver como primero detecta un envío de datos del sensor Oregon, luego la pulsación de una tecla ON para un enchufe radiocontrolado, luego una tecla OFF para el mismo dispositivo, y luego otro envío de datos del sensor Oregon.

Si ejecutamos el comando rtl_433 con los modificadores -a o -A podemos ver información sobre las tramas de datos sin decodificar que se reciben, por si estamos intentando detectar señales que no están actualmente soportadas por el programa, pero eso ya da para otra entrada entera… de momento ahí queda eso 🙂

Espero que os haya gustado y os den ganas de probarlo 🙂

4 comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.