diff --git a/conf/rtl_433.example.conf b/conf/rtl_433.example.conf index 2c177c6b..67f6deb2 100644 --- a/conf/rtl_433.example.conf +++ b/conf/rtl_433.example.conf @@ -180,7 +180,7 @@ signal_grabber none ## Data output options # as command line option: -# [-F kv|json|csv|mqtt|syslog|null] Produce decoded output in given format. +# [-F kv|json|csv|mqtt|influx|syslog|trigger|null] Produce decoded output in given format. # Without this option the default is KV output. Use "-F null" to remove the default. # Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout. # Specify MQTT server with e.g. -F mqtt://localhost:1883 @@ -192,6 +192,11 @@ signal_grabber none # devices: posts device and sensor info in nested topics # The topic string will expand keys like [/model] # E.g. -F "mqtt://localhost:1883,user=USERNAME,pass=PASSWORD,retain=0,devices=rtl_433[/id]" +# With MQTT each rtl_433 instance needs a distinct driver selection. The MQTT Client-ID is computed from the driver string. +# If you use multiple RTL-SDR, perhaps set a serial and select by that (helps not to get the wrong antenna). +# Specify InfluxDB 2.0 server with e.g. -F "influx://localhost:9999/api/v2/write?org=<org>&bucket=<bucket>,token=<authtoken>" +# Specify InfluxDB 1.x server with e.g. -F "influx://localhost:8086/write?db=<db>&p=<password>&u=<user>" +# Additional parameter -M time:unix:usec:utc for correct timestamps in InfluxDB recommended # Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514 # default is "kv", multiple outputs can be used. output json diff --git a/include/output_trigger.h b/include/output_trigger.h new file mode 100644 index 00000000..3afa5f11 --- /dev/null +++ b/include/output_trigger.h @@ -0,0 +1,33 @@ +/** @file + Trigger output for rtl_433 events. + + Copyright (C) 2021 Christian Zuckschwerdt + + 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. +*/ + +#ifndef INCLUDE_OUTPUT_TRIGGER_H_ +#define INCLUDE_OUTPUT_TRIGGER_H_ + +#include "data.h" +#include <stdio.h> + +/// Construct data output for a trigger stream. +/// +/// This will print a `1` to the stream for every event. +/// +/// Use e.g. on a Raspberry Pi to flash the LED: +/// +/// $ sudo chmod a+w /sys/class/leds/led0/shot +/// $ echo oneshot | sudo tee /sys/class/leds/led0/trigger +/// $ rtl_433 ... -F trigger:/sys/class/leds/led0/shot +/// +/// @param file a trigger output stream +/// @return The initialized data output. +/// You must release this object with data_output_free once you're done with it. +struct data_output *data_output_trigger_create(FILE *file); + +#endif /* INCLUDE_OUTPUT_TRIGGER_H_ */ diff --git a/include/r_api.h b/include/r_api.h index cfa080ed..299ac9d5 100644 --- a/include/r_api.h +++ b/include/r_api.h @@ -81,6 +81,8 @@ void add_syslog_output(struct r_cfg *cfg, char *param); void add_http_output(struct r_cfg *cfg, char *param); +void add_trigger_output(struct r_cfg *cfg, char *param); + void add_null_output(struct r_cfg *cfg, char *param); void start_outputs(struct r_cfg *cfg, char const *const *well_known); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6f37bf86..3f5b2a0b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,6 +25,7 @@ add_library(r_433 STATIC output_file.c output_influx.c output_mqtt.c + output_trigger.c output_udp.c pulse_analyzer.c pulse_demod.c diff --git a/src/output_trigger.c b/src/output_trigger.c new file mode 100644 index 00000000..1e61a16a --- /dev/null +++ b/src/output_trigger.c @@ -0,0 +1,59 @@ +/** @file + Trigger output for rtl_433 events. + + Copyright (C) 2021 Christian Zuckschwerdt + + 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. +*/ + +#include "output_trigger.h" + +#include "data.h" +#include "r_util.h" +#include "fatal.h" + +#include <stdio.h> +#include <stdlib.h> + +/* Trigger printer */ + +typedef struct { + struct data_output output; + FILE *file; +} data_output_trigger_t; + +static void print_trigger_data(data_output_t *output, data_t *data, char const *format) +{ + UNUSED(data); + UNUSED(format); + data_output_trigger_t *trigger = (data_output_trigger_t *)output; + + fputc('1', trigger->file); + fflush(trigger->file); +} + +static void data_output_trigger_free(data_output_t *output) +{ + if (!output) + return; + + free(output); +} + +struct data_output *data_output_trigger_create(FILE *file) +{ + data_output_trigger_t *trigger = calloc(1, sizeof(data_output_trigger_t)); + if (!trigger) { + WARN_CALLOC("data_output_trigger_create()"); + return NULL; // NOTE: returns NULL on alloc failure. + } + + trigger->output.print_data = print_trigger_data; + trigger->output.output_free = data_output_trigger_free; + trigger->file = file; + + return &trigger->output; +} diff --git a/src/r_api.c b/src/r_api.c index c72f2d0c..b2c4a24f 100644 --- a/src/r_api.c +++ b/src/r_api.c @@ -33,6 +33,7 @@ #include "output_udp.h" #include "output_mqtt.h" #include "output_influx.h" +#include "output_trigger.h" #include "write_sigrok.h" #include "mongoose.h" #include "compat_time.h" @@ -987,6 +988,11 @@ void add_http_output(r_cfg_t *cfg, char *param) list_push(&cfg->output_handler, data_output_http_create(get_mgr(cfg), host, port, cfg)); } +void add_trigger_output(r_cfg_t *cfg, char *param) +{ + list_push(&cfg->output_handler, data_output_trigger_create(fopen_output(param))); +} + void add_null_output(r_cfg_t *cfg, char *param) { UNUSED(param); diff --git a/src/rtl_433.c b/src/rtl_433.c index c052990a..df24acab 100644 --- a/src/rtl_433.c +++ b/src/rtl_433.c @@ -173,7 +173,7 @@ static void usage(int exit_code) " [-w <filename> | help] Save data stream to output file (a '-' dumps samples to stdout)\n" " [-W <filename> | help] Save data stream to output file, overwrite existing file\n" "\t\t= Data output options =\n" - " [-F kv | json | csv | mqtt | influx | syslog | null | help] Produce decoded output in given format.\n" + " [-F kv | json | csv | mqtt | influx | syslog | trigger | null | help] Produce decoded output in given format.\n" " Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.\n" " Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514\n" " [-M time[:<options>] | protocol | level | noise[:secs] | stats | bits | help] Add various meta data to each output.\n" @@ -249,7 +249,7 @@ static void help_output(void) { term_help_printf( "\t\t= Output format option =\n" - " [-F kv|json|csv|mqtt|influx|syslog|null] Produce decoded output in given format.\n" + " [-F kv|json|csv|mqtt|influx|syslog|trigger|null] Produce decoded output in given format.\n" "\tWithout this option the default is KV output. Use \"-F null\" to remove the default.\n" "\tAppend output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.\n" "\tSpecify MQTT server with e.g. -F mqtt://localhost:1883\n" @@ -1138,6 +1138,9 @@ static void parse_conf_option(r_cfg_t *cfg, int opt, char *arg) else if (strncmp(optarg, "http", 4) == 0) { add_http_output(cfg, arg_param(optarg)); } + else if (strncmp(arg, "trigger", 7) == 0) { + add_trigger_output(cfg, arg_param(arg)); + } else if (strncmp(arg, "null", 4) == 0) { add_null_output(cfg, arg_param(arg)); } diff --git a/vs15/rtl_433.vcxproj b/vs15/rtl_433.vcxproj index 168ce239..83dd769b 100644 --- a/vs15/rtl_433.vcxproj +++ b/vs15/rtl_433.vcxproj @@ -115,6 +115,7 @@ COPY ..\..\libusb\MS64\dll\libusb*.dll $(TargetDir)</Command> <ClInclude Include="..\include\output_file.h" /> <ClInclude Include="..\include\output_influx.h" /> <ClInclude Include="..\include\output_mqtt.h" /> + <ClInclude Include="..\include\output_trigger.h" /> <ClInclude Include="..\include\output_udp.h" /> <ClInclude Include="..\include\pulse_analyzer.h" /> <ClInclude Include="..\include\pulse_demod.h" /> @@ -155,6 +156,7 @@ COPY ..\..\libusb\MS64\dll\libusb*.dll $(TargetDir)</Command> <ClCompile Include="..\src\output_file.c" /> <ClCompile Include="..\src\output_influx.c" /> <ClCompile Include="..\src\output_mqtt.c" /> + <ClCompile Include="..\src\output_trigger.c" /> <ClCompile Include="..\src\output_udp.c" /> <ClCompile Include="..\src\pulse_analyzer.c" /> <ClCompile Include="..\src\pulse_demod.c" /> diff --git a/vs15/rtl_433.vcxproj.filters b/vs15/rtl_433.vcxproj.filters index ea8fbae7..86d9df34 100644 --- a/vs15/rtl_433.vcxproj.filters +++ b/vs15/rtl_433.vcxproj.filters @@ -83,6 +83,9 @@ <ClInclude Include="..\include\output_mqtt.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\include\output_trigger.h"> + <Filter>Header Files</Filter> + </ClInclude> <ClInclude Include="..\include\output_udp.h"> <Filter>Header Files</Filter> </ClInclude> @@ -199,6 +202,9 @@ <ClCompile Include="..\src\output_mqtt.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\src\output_trigger.c"> + <Filter>Source Files</Filter> + </ClCompile> <ClCompile Include="..\src\output_udp.c"> <Filter>Source Files</Filter> </ClCompile>