nixos/prometheus-rtl_433-exporter: new module
This commit is contained in:
parent
af28dac3ac
commit
121bc17ab9
|
@ -42,6 +42,7 @@ let
|
|||
"postgres"
|
||||
"redis"
|
||||
"rspamd"
|
||||
"rtl_433"
|
||||
"snmp"
|
||||
"surfboard"
|
||||
"tor"
|
||||
|
@ -226,6 +227,8 @@ in
|
|||
services.prometheus.exporters.minio.minioAccessSecret = mkDefault config.services.minio.secretKey;
|
||||
})] ++ [(mkIf config.services.rspamd.enable {
|
||||
services.prometheus.exporters.rspamd.url = mkDefault "http://localhost:11334/stat";
|
||||
})] ++ [(mkIf config.services.prometheus.exporters.rtl_433.enable {
|
||||
hardware.rtl-sdr.enable = mkDefault true;
|
||||
})] ++ [(mkIf config.services.nginx.enable {
|
||||
systemd.services.prometheus-nginx-exporter.after = [ "nginx.service" ];
|
||||
systemd.services.prometheus-nginx-exporter.requires = [ "nginx.service" ];
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
{ config, lib, pkgs, options }:
|
||||
|
||||
let
|
||||
cfg = config.services.prometheus.exporters.rtl_433;
|
||||
in
|
||||
{
|
||||
port = 9550;
|
||||
|
||||
extraOpts = let
|
||||
mkMatcherOptionType = field: description: with lib.types;
|
||||
listOf (submodule {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = str;
|
||||
description = "Name to match.";
|
||||
};
|
||||
"${field}" = lib.mkOption {
|
||||
type = int;
|
||||
inherit description;
|
||||
};
|
||||
location = lib.mkOption {
|
||||
type = str;
|
||||
description = "Location to match.";
|
||||
};
|
||||
};
|
||||
});
|
||||
in
|
||||
{
|
||||
rtl433Flags = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "-C si";
|
||||
example = "-C si -R 19";
|
||||
description = ''
|
||||
Flags passed verbatim to rtl_433 binary.
|
||||
Having <literal>-C si</literal> (the default) is recommended since only Celsius temperatures are parsed.
|
||||
'';
|
||||
};
|
||||
channels = lib.mkOption {
|
||||
type = mkMatcherOptionType "channel" "Channel to match.";
|
||||
default = [];
|
||||
example = [
|
||||
{ name = "Acurite"; channel = 6543; location = "Kitchen"; }
|
||||
];
|
||||
description = ''
|
||||
List of channel matchers to export.
|
||||
'';
|
||||
};
|
||||
ids = lib.mkOption {
|
||||
type = mkMatcherOptionType "id" "ID to match.";
|
||||
default = [];
|
||||
example = [
|
||||
{ name = "Nexus"; id = 1; location = "Bedroom"; }
|
||||
];
|
||||
description = ''
|
||||
List of ID matchers to export.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
serviceOpts = {
|
||||
serviceConfig = {
|
||||
# rtl-sdr udev rules make supported USB devices +rw by plugdev.
|
||||
SupplementaryGroups = "plugdev";
|
||||
ExecStart = let
|
||||
matchers = (map (m:
|
||||
"--channel_matcher '${m.name},${toString m.channel},${m.location}'"
|
||||
) cfg.channels) ++ (map (m:
|
||||
"--id_matcher '${m.name},${toString m.id},${m.location}'"
|
||||
) cfg.ids); in ''
|
||||
${pkgs.prometheus-rtl_433-exporter}/bin/rtl_433_prometheus \
|
||||
-listen ${cfg.listenAddress}:${toString cfg.port} \
|
||||
-subprocess "${pkgs.rtl_433}/bin/rtl_433 -F json ${cfg.rtl433Flags}" \
|
||||
${lib.concatStringsSep " \\\n " matchers} \
|
||||
${lib.concatStringsSep " \\\n " cfg.extraFlags}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
|
@ -536,6 +536,37 @@ let
|
|||
'';
|
||||
};
|
||||
|
||||
rtl_433 = {
|
||||
exporterConfig = {
|
||||
enable = true;
|
||||
};
|
||||
metricProvider = {
|
||||
# Mock rtl_433 binary to return a dummy metric stream.
|
||||
nixpkgs.overlays = [ (self: super: {
|
||||
rtl_433 = self.runCommand "rtl_433" {} ''
|
||||
mkdir -p "$out/bin"
|
||||
cat <<EOF > "$out/bin/rtl_433"
|
||||
#!/bin/sh
|
||||
while true; do
|
||||
printf '{"time" : "2020-04-26 13:37:42", "model" : "zopieux", "id" : 55, "channel" : 3, "temperature_C" : 18.000}\n'
|
||||
sleep 4
|
||||
done
|
||||
EOF
|
||||
chmod +x "$out/bin/rtl_433"
|
||||
'';
|
||||
}) ];
|
||||
};
|
||||
exporterTest = ''
|
||||
wait_for_unit("prometheus-rtl_433-exporter.service")
|
||||
wait_for_open_port(9550)
|
||||
wait_until_succeeds(
|
||||
"curl -sSf localhost:9550/metrics | grep -q '{}'".format(
|
||||
'rtl_433_temperature_celsius{channel="3",id="55",location="",model="zopieux"} 18'
|
||||
)
|
||||
)
|
||||
'';
|
||||
};
|
||||
|
||||
snmp = {
|
||||
exporterConfig = {
|
||||
enable = true;
|
||||
|
|
Loading…
Reference in a new issue