silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / misc / mqtt2influxdb.nix
blobcefe7acbba2fb0c0d4fdb72b07462ca8faa24d46
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
8   cfg = config.services.mqtt2influxdb;
9   filterNull = lib.filterAttrsRecursive (n: v: v != null);
10   configFile = (pkgs.formats.yaml {}).generate "mqtt2influxdb.config.yaml" (
11     filterNull {
12       inherit (cfg) mqtt influxdb;
13       points = map filterNull cfg.points;
14     }
15   );
17   pointType = lib.types.submodule {
18     options = {
19       measurement = lib.mkOption {
20         type = lib.types.str;
21         description = "Name of the measurement";
22       };
23       topic = lib.mkOption {
24         type = lib.types.str;
25         description = "MQTT topic to subscribe to.";
26       };
27       fields = lib.mkOption {
28         type = lib.types.submodule {
29           options = {
30             value = lib.mkOption {
31               type = lib.types.str;
32               default = "$.payload";
33               description = "Value to be picked up";
34             };
35             type = lib.mkOption {
36               type = with lib.types; nullOr str;
37               default = null;
38               description = "Type to be picked up";
39             };
40           };
41         };
42         description = "Field selector.";
43       };
44       tags = lib.mkOption {
45         type = with lib.types; attrsOf str;
46         default = {};
47         description = "Tags applied";
48       };
49     };
50   };
52   defaultPoints = [
53     {
54       measurement = "temperature";
55       topic = "node/+/thermometer/+/temperature";
56       fields.value = "$.payload";
57       tags = {
58         id = "$.topic[1]";
59         channel = "$.topic[3]";
60       };
61     }
62     {
63       measurement = "relative-humidity";
64       topic = "node/+/hygrometer/+/relative-humidity";
65       fields.value = "$.payload";
66       tags = {
67         id = "$.topic[1]";
68         channel = "$.topic[3]";
69       };
70     }
71     {
72       measurement = "illuminance";
73       topic = "node/+/lux-meter/0:0/illuminance";
74       fields.value = "$.payload";
75       tags = {
76         id = "$.topic[1]";
77       };
78     }
79     {
80       measurement = "pressure";
81       topic = "node/+/barometer/0:0/pressure";
82       fields.value = "$.payload";
83       tags = {
84         id = "$.topic[1]";
85       };
86     }
87     {
88       measurement = "co2";
89       topic = "node/+/co2-meter/-/concentration";
90       fields.value = "$.payload";
91       tags = {
92         id = "$.topic[1]";
93       };
94     }
95     {
96       measurement = "voltage";
97       topic = "node/+/battery/+/voltage";
98       fields.value = "$.payload";
99       tags = {
100         id = "$.topic[1]";
101       };
102     }
103     {
104       measurement = "button";
105       topic = "node/+/push-button/+/event-count";
106       fields.value = "$.payload";
107       tags = {
108         id = "$.topic[1]";
109         channel = "$.topic[3]";
110       };
111     }
112     {
113       measurement = "tvoc";
114       topic = "node/+/voc-lp-sensor/0:0/tvoc";
115       fields.value = "$.payload";
116       tags = {
117         id = "$.topic[1]";
118       };
119     }
120   ];
121 in {
122   options = {
123     services.mqtt2influxdb = {
124       enable = lib.mkEnableOption "BigClown MQTT to InfluxDB bridge";
125       package = lib.mkPackageOption pkgs ["python3Packages" "mqtt2influxdb"] {};
126       environmentFiles = lib.mkOption {
127         type = lib.types.listOf lib.types.path;
128         default = [];
129         example = [ "/run/keys/mqtt2influxdb.env" ];
130         description = ''
131           File to load as environment file. Environment variables from this file
132           will be interpolated into the config file using envsubst with this
133           syntax: `$ENVIRONMENT` or `''${VARIABLE}`.
134           This is useful to avoid putting secrets into the nix store.
135         '';
136       };
137       mqtt = {
138         host = lib.mkOption {
139           type = lib.types.str;
140           default = "127.0.0.1";
141           description = "Host where MQTT server is running.";
142         };
143         port = lib.mkOption {
144           type = lib.types.port;
145           default = 1883;
146           description = "MQTT server port.";
147         };
148         username = lib.mkOption {
149           type = with lib.types; nullOr str;
150           default = null;
151           description = "Username used to connect to the MQTT server.";
152         };
153         password = lib.mkOption {
154           type = with lib.types; nullOr str;
155           default = null;
156           description = ''
157             MQTT password.
159             It is highly suggested to use here replacement through
160             environmentFiles as otherwise the password is put world readable to
161             the store.
162           '';
163         };
164         cafile = lib.mkOption {
165           type = with lib.types; nullOr path;
166           default = null;
167           description = "Certification Authority file for MQTT";
168         };
169         certfile = lib.mkOption {
170           type = with lib.types; nullOr path;
171           default = null;
172           description = "Certificate file for MQTT";
173         };
174         keyfile = lib.mkOption {
175           type = with lib.types; nullOr path;
176           default = null;
177           description = "Key file for MQTT";
178         };
179       };
180       influxdb = {
181         host = lib.mkOption {
182           type = lib.types.str;
183           default = "127.0.0.1";
184           description = "Host where InfluxDB server is running.";
185         };
186         port = lib.mkOption {
187           type = lib.types.port;
188           default = 8086;
189           description = "InfluxDB server port";
190         };
191         database = lib.mkOption {
192           type = lib.types.str;
193           description = "Name of the InfluxDB database.";
194         };
195         username = lib.mkOption {
196           type = with lib.types; nullOr str;
197           default = null;
198           description = "Username for InfluxDB login.";
199         };
200         password = lib.mkOption {
201           type = with lib.types; nullOr str;
202           default = null;
203           description = ''
204             Password for InfluxDB login.
206             It is highly suggested to use here replacement through
207             environmentFiles as otherwise the password is put world readable to
208             the store.
209             '';
210         };
211         ssl = lib.mkOption {
212           type = lib.types.bool;
213           default = false;
214           description = "Use SSL to connect to the InfluxDB server.";
215         };
216         verify_ssl = lib.mkOption {
217           type = lib.types.bool;
218           default = true;
219           description = "Verify SSL certificate when connecting to the InfluxDB server.";
220         };
221       };
222       points = lib.mkOption {
223         type = lib.types.listOf pointType;
224         default = defaultPoints;
225         description = "Points to bridge from MQTT to InfluxDB.";
226       };
227     };
228   };
230   config = lib.mkIf cfg.enable {
231     systemd.services.bigclown-mqtt2influxdb = let
232       envConfig = cfg.environmentFiles != [];
233       finalConfig = if envConfig
234         then "$RUNTIME_DIRECTORY/mqtt2influxdb.config.yaml"
235         else configFile;
236     in {
237       description = "BigClown MQTT to InfluxDB bridge";
238       wantedBy = ["multi-user.target"];
239       wants = lib.mkIf config.services.mosquitto.enable ["mosquitto.service"];
240       preStart = ''
241         umask 077
242         ${pkgs.envsubst}/bin/envsubst -i "${configFile}" -o "${finalConfig}"
243       '';
244       serviceConfig = {
245         EnvironmentFile = cfg.environmentFiles;
246         ExecStart = "${lib.getExe cfg.package} -dc ${finalConfig}";
247         RuntimeDirectory = "mqtt2influxdb";
248       };
249     };
250   };