├── .gitignore
├── README.md
├── sensors.conf
├── sensors.py
├── template_sensors_4.4.xml
├── template_sensors_5.0.xml
├── template_sensors_6.0.xml
└── template_sensors_6.4.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # zabbix-sensors
2 |
3 | Zabbix template & scripts to discover & monitor Linux sensors
4 |
5 | ## Features
6 |
7 | - Low-level discovery of sensors: temperature (with thresholds), fans, voltage and power
8 | - Triggers on temperature, fans and voltage (detect stopped fan, adjustable)
9 | - Data is gathered once as a single JSON and all other items are `Dependent` - extracted from raw JSON
10 | - All data is gathered directly from `SysFS` - no `lm-sensors` needed to function
11 |
12 | ## Usage
13 |
14 | - Put _sensors.conf_ in _/etc/zabbix/zabbix_agentd.d_ folder
15 | - Put _sensors.py_ in _/etc/zabbix/scripts_ folder (or in any other, but then you'll need to adjust _sensors.conf_)
16 | - Import & link template
17 |
18 | ## Requirements
19 |
20 | - Python3
21 |
22 | ## Macros
23 | - `{$SENSORS_FAN_LOW}`: Low fan speed sensor threshold
24 | - `{$SENSORS_TEMP_CRIT}`: Crit value for temp sensors
25 | - `{$SENSORS_TEMP_HIGH}`: High value for temp sensors
26 | - `{$SENSORS_TEMP_HYST}`: Hysteresis for temp sensors to make sure that trigger is not firing when value oscillates over threshold and back
27 | - `{$SENSORS_VOLTAGE_HIGH}`: Voltage high threshold
28 | - `{$SENSORS_VOLTAGE_LOW}`: Voltage low threshold
29 |
30 | ## Update 2023-06
31 |
32 | - Script was rewritten to gather data directly from `sysfs` instead of using `sensors` binary
33 | - Updated templates for `6.0` and `6.4`
34 |
35 | ## Update 2020-12
36 |
37 | - Script was rewritten from scratch to make use of new `sensors` argument `-j` to export in JSON format. If it's not supported then it'll fall back to parse raw text output of `-u` - this will stick for some time for backwards compatibility
38 | - Move to Python3
39 |
--------------------------------------------------------------------------------
/sensors.conf:
--------------------------------------------------------------------------------
1 | UserParameter=sensors,/etc/zabbix/scripts/sensors.py
--------------------------------------------------------------------------------
/sensors.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | import errno
4 | import json
5 | import re
6 | import os
7 | import sys
8 | import glob
9 |
10 | DIR = "/sys/class/hwmon"
11 |
12 |
13 | def read(fn):
14 | try:
15 | with open(fn) as f:
16 | return f.read()
17 | except OSError as e:
18 | # in some cases nouveau might return EINVAL when GPU is not in use
19 | # We are defaulting to 0 when the value cannot be read
20 | # https://github.com/torvalds/linux/blob/v6.9/drivers/gpu/drm/nouveau/nouveau_hwmon.c#L379
21 | if e.errno == errno.EINVAL:
22 | return '0'
23 | else:
24 | raise
25 |
26 |
27 | def read_parse(fn):
28 | x = read(fn).strip()
29 | try:
30 | return int(x)
31 | except ValueError:
32 | return x
33 |
34 |
35 | def list_hwmon():
36 | return sorted([f for f in os.listdir(DIR) if f.startswith("hwmon")])
37 |
38 |
39 | def process_sensors(path):
40 | r = {}
41 | for fn in os.listdir(path):
42 | m = re.match(r"^(fan|in|temp|power)(\d+)_(.*)$", fn)
43 | if not m:
44 | continue
45 |
46 | t, i, rd = m.group(1, 2, 3)
47 |
48 | sens = f"{t}{i}"
49 | if sens not in r:
50 | r[sens] = {"sensor_type": t}
51 |
52 | r[sens][rd] = read_parse(f"{path}/{fn}")
53 |
54 | return r
55 |
56 |
57 | def process_hwmon(n):
58 | path = f"{DIR}/{n}"
59 | if not os.path.exists(f"{path}/name"):
60 | return None, None
61 |
62 | name = read(f"{path}/name").strip()
63 |
64 | blockdev = False
65 | if os.path.isdir(f"{path}/device/block"):
66 | blockdev = os.path.basename(glob.glob(f"{path}/device/block/*")[0])
67 |
68 | if glob.glob(f"{path}/device/nvme*"):
69 | blockdev = os.path.basename(glob.glob(f"{path}/device/nvme*")[0])
70 |
71 | raw_devlinks = glob.glob("/dev/disk/by-id/*")
72 | devlinks = list(filter(lambda x: not re.search("^nvme-eui|^nvme-nvme|^wwn-0x|^scsi-[0-9]", os.path.basename(x)), raw_devlinks))
73 | if blockdev:
74 | for devlink in devlinks:
75 | if os.path.islink(devlink) and blockdev==os.path.basename(os.readlink(devlink)):
76 | name = os.path.basename(devlink)
77 | break
78 |
79 | return name, process_sensors(path)
80 |
81 |
82 | def main():
83 | r = {}
84 |
85 | for hwm in list_hwmon():
86 | try:
87 | name, sensors = process_hwmon(hwm)
88 | except Exception as e:
89 | sys.stderr.write(f"Failure to process {hwm}: {e}\n")
90 | continue
91 | if not sensors:
92 | continue
93 |
94 | r[name] = sensors
95 |
96 | print(json.dumps(r, indent=2, sort_keys=True))
97 |
98 |
99 | if __name__ == "__main__":
100 | main()
101 |
--------------------------------------------------------------------------------
/template_sensors_4.4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.4
4 | 2023-12-21T08:18:32Z
5 |
6 |
7 | Templates
8 |
9 |
10 |
11 |
12 | Template_Sensors
13 | Template_Sensors
14 |
15 |
16 | Templates
17 |
18 |
19 |
20 |
21 | Sensors - All
22 |
23 |
24 | Sensors - Fan
25 |
26 |
27 | Sensors - Power
28 |
29 |
30 | Sensors - Temperature
31 |
32 |
33 | Sensors - Voltage
34 |
35 |
36 | Sensors Raw
37 |
38 |
39 |
40 | -
41 | Sensors JSON
42 | sensors
43 | 10m
44 | 0
45 | TEXT
46 |
47 |
48 | Sensors Raw
49 |
50 |
51 |
52 |
53 | {nodata(1h)}=1
54 | Sensors NO DATA
55 | HIGH
56 |
57 |
58 |
59 |
60 |
61 |
62 | Discover Fans
63 | DEPENDENT
64 | sensors.discovery.fan
65 | 0
66 |
67 |
68 | Fan '{#DRIVER}' - '{#LABEL}'
69 | DEPENDENT
70 | sensors.fan['{#DRIVER}', '{#SENSOR}']
71 | 0
72 | RPM
73 |
74 |
75 | Sensors - All
76 |
77 |
78 | Sensors - Fan
79 |
80 |
81 |
82 |
83 | JSONPATH
84 | $.['{#DRIVER}']['{#SENSOR}'].input
85 |
86 |
87 |
88 | sensors
89 |
90 |
91 |
92 | {last()}<{$SENSORS_FAN_LOW:"{#DRIVER}_{#SENSOR}"}
93 | Fan '{#DRIVER}' - '{#LABEL}' speed is too low ({ITEM.LASTVALUE})
94 | HIGH
95 |
96 |
97 | Sensors NO DATA
98 | {Template_Sensors:sensors.nodata(1h)}=1
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | sensors
107 |
108 |
109 |
110 | JAVASCRIPT
111 | var inp = JSON.parse(value);
112 | var out = [];
113 |
114 | Object.keys(inp).forEach(function(drv) {
115 | var v = inp[drv];
116 |
117 | Object.keys(v).forEach(function(sens) {
118 | var v2 = v[sens];
119 | var label = sens;
120 | if (v2.label) {
121 | label = v2.label;
122 | }
123 | if (v2.sensor_type == "fan") {
124 | out.push({
125 | "{#DRIVER}": drv,
126 | "{#SENSOR}": sens,
127 | "{#LABEL}": label
128 | })
129 | }
130 | })
131 | })
132 |
133 | return JSON.stringify(out);
134 |
135 |
136 |
137 |
138 | Discover Power
139 | DEPENDENT
140 | sensors.discovery.power
141 | 0
142 |
143 |
144 | Power '{#DRIVER}' - '{#LABEL}'
145 | DEPENDENT
146 | sensors.power['{#DRIVER}', '{#SENSOR}']
147 | 0
148 | W
149 |
150 |
151 | Sensors - All
152 |
153 |
154 | Sensors - Power
155 |
156 |
157 |
158 |
159 | JSONPATH
160 | $.['{#DRIVER}']['{#SENSOR}'].average
161 |
162 |
163 | MULTIPLIER
164 | 0.000001
165 |
166 |
167 |
168 | sensors
169 |
170 |
171 |
172 |
173 | sensors
174 |
175 |
176 |
177 | JAVASCRIPT
178 | var inp = JSON.parse(value);
179 | var out = [];
180 |
181 | Object.keys(inp).forEach(function(drv) {
182 | var v = inp[drv];
183 |
184 | Object.keys(v).forEach(function(sens) {
185 | var v2 = v[sens];
186 | var label = sens;
187 | if (v2.label) {
188 | label = v2.label;
189 | }
190 | if (v2.sensor_type == "power") {
191 | out.push({
192 | "{#DRIVER}": drv,
193 | "{#SENSOR}": sens,
194 | "{#LABEL}": label
195 | })
196 | }
197 | })
198 | })
199 |
200 | return JSON.stringify(out);
201 |
202 |
203 |
204 |
205 | Discover Temperature
206 | DEPENDENT
207 | sensors.discovery.temp
208 | 0
209 |
210 |
211 |
212 | {#VALUE}
213 | ^-?\d+$
214 | A
215 |
216 |
217 |
218 |
219 |
220 | Temperature '{#DRIVER}' - '{#LABEL}'
221 | DEPENDENT
222 | sensors.temp['{#DRIVER}', '{#SENSOR}']
223 | 0
224 | C
225 |
226 |
227 | Sensors - All
228 |
229 |
230 | Sensors - Temperature
231 |
232 |
233 |
234 |
235 | JSONPATH
236 | $.['{#DRIVER}']['{#SENSOR}'].input
237 |
238 |
239 | MULTIPLIER
240 | 0.001
241 |
242 |
243 |
244 | sensors
245 |
246 |
247 |
248 | {min(600)}>{$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}
249 | RECOVERY_EXPRESSION
250 | {min(600)}<={$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
251 | Temperature '{#DRIVER}' - '{#LABEL}' is critical ({ITEM.LASTVALUE})
252 | HIGH
253 | YES
254 |
255 |
256 | Sensors NO DATA
257 | {Template_Sensors:sensors.nodata(1h)}=1
258 |
259 |
260 |
261 |
262 | {min(600)}<{$SENSORS_TEMP_CRIT_MIN:"{#DRIVER}_{#SENSOR}"}
263 | RECOVERY_EXPRESSION
264 | {min(600)}>={$SENSORS_TEMP_CRIT_MIN:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
265 | Temperature '{#DRIVER}' - '{#LABEL}' is critical minimal ({ITEM.LASTVALUE})
266 | HIGH
267 | YES
268 |
269 |
270 | Sensors NO DATA
271 | {Template_Sensors:sensors.nodata(1h)}=1
272 |
273 |
274 |
275 |
276 | {min(600)}>{$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}
277 | RECOVERY_EXPRESSION
278 | {min(600)}<={$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
279 | Temperature '{#DRIVER}' - '{#LABEL}' is high ({ITEM.LASTVALUE})
280 | AVERAGE
281 | YES
282 |
283 |
284 | Sensors NO DATA
285 | {Template_Sensors:sensors.nodata(1h)}=1
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 | sensors
294 |
295 |
296 |
297 | JAVASCRIPT
298 | var inp = JSON.parse(value);
299 | var out = [];
300 |
301 | Object.keys(inp).forEach(function(drv) {
302 | var v = inp[drv];
303 |
304 | Object.keys(v).forEach(function(sens) {
305 | var v2 = v[sens];
306 | var label = sens;
307 | if (v2.label) {
308 | label = v2.label;
309 | }
310 | if (v2.sensor_type == "temp") {
311 | out.push({
312 | "{#DRIVER}": drv,
313 | "{#SENSOR}": sens,
314 | "{#LABEL}": label,
315 | "{#VALUE}": v2.input
316 | })
317 | }
318 | })
319 | })
320 |
321 | return JSON.stringify(out);
322 |
323 |
324 |
325 |
326 | Discover Voltage
327 | DEPENDENT
328 | sensors.discovery.voltage
329 | 0
330 |
331 |
332 | Voltage '{#DRIVER}' - '{#LABEL}'
333 | DEPENDENT
334 | sensors.voltage['{#DRIVER}', '{#SENSOR}']
335 | 0
336 | V
337 |
338 |
339 | Sensors - All
340 |
341 |
342 | Sensors - Voltage
343 |
344 |
345 |
346 |
347 | JSONPATH
348 | $.['{#DRIVER}']['{#SENSOR}'].input
349 |
350 |
351 | MULTIPLIER
352 | 0.001
353 |
354 |
355 |
356 | sensors
357 |
358 |
359 |
360 | {min(300)}>{$SENSORS_VOLTAGE_HIGH:"{#DRIVER}_{#SENSOR}"}
361 | Voltage '{#DRIVER}' - '{#LABEL}' is too high ({ITEM.LASTVALUE})
362 | AVERAGE
363 | YES
364 |
365 |
366 | Sensors NO DATA
367 | {Template_Sensors:sensors.nodata(1h)}=1
368 |
369 |
370 |
371 |
372 | {max(300)}<{$SENSORS_VOLTAGE_LOW:"{#DRIVER}_{#SENSOR}"}
373 | Voltage '{#DRIVER}' - '{#LABEL}' is too low ({ITEM.LASTVALUE})
374 | AVERAGE
375 | YES
376 |
377 |
378 | Sensors NO DATA
379 | {Template_Sensors:sensors.nodata(1h)}=1
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 | sensors
388 |
389 |
390 |
391 | JAVASCRIPT
392 | var inp = JSON.parse(value);
393 | var out = [];
394 |
395 | Object.keys(inp).forEach(function(drv) {
396 | var v = inp[drv];
397 |
398 | Object.keys(v).forEach(function(sens) {
399 | var v2 = v[sens];
400 | var label = sens;
401 | if (v2.label) {
402 | label = v2.label;
403 | }
404 | if (v2.sensor_type == "in") {
405 | out.push({
406 | "{#DRIVER}": drv,
407 | "{#SENSOR}": sens,
408 | "{#LABEL}": label
409 | })
410 | }
411 | })
412 | })
413 |
414 | return JSON.stringify(out);
415 |
416 |
417 |
418 |
419 |
420 |
421 | {$SENSORS_FAN_LOW}
422 | 0
423 |
424 |
425 | {$SENSORS_TEMP_CRIT}
426 | 80
427 |
428 |
429 | {$SENSORS_TEMP_CRIT_MIN}
430 | 1
431 |
432 |
433 | {$SENSORS_TEMP_HIGH}
434 | 70
435 |
436 |
437 | {$SENSORS_TEMP_HYST}
438 | 5
439 |
440 |
441 | {$SENSORS_VOLTAGE_HIGH}
442 | 1000
443 |
444 |
445 | {$SENSORS_VOLTAGE_LOW}
446 | 0
447 |
448 |
449 |
450 |
451 |
452 |
--------------------------------------------------------------------------------
/template_sensors_5.0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 5.0
4 | 2023-12-08T05:12:50Z
5 |
6 |
7 | Templates
8 |
9 |
10 |
11 |
12 | Template_Sensors
13 | Template_Sensors
14 |
15 |
16 | Templates
17 |
18 |
19 |
20 |
21 | Sensors - Fan
22 |
23 |
24 | Sensors - Power
25 |
26 |
27 | Sensors - Temperature
28 |
29 |
30 | Sensors - Voltage
31 |
32 |
33 | Sensors Raw
34 |
35 |
36 |
37 | -
38 | Sensors JSON
39 | sensors
40 | 10m
41 | 0
42 | TEXT
43 |
44 |
45 | Sensors Raw
46 |
47 |
48 |
49 |
50 | {nodata(1h)}=1
51 | Sensors NO DATA
52 | HIGH
53 | YES
54 |
55 |
56 |
57 |
58 |
59 |
60 | Discover Fans
61 | DEPENDENT
62 | sensors.discovery.fan
63 | 0
64 |
65 |
66 | Fan '{#DRIVER}' - '{#LABEL}'
67 | DEPENDENT
68 | sensors.fan['{#DRIVER}', '{#SENSOR}']
69 | 0
70 | RPM
71 |
72 |
73 | Sensors - Fan
74 |
75 |
76 |
77 |
78 | JSONPATH
79 | $.['{#DRIVER}']['{#SENSOR}'].input
80 |
81 |
82 |
83 | sensors
84 |
85 |
86 |
87 | {last()}<{$SENSORS_FAN_LOW:"{#DRIVER}_{#SENSOR}"}
88 | Fan '{#DRIVER}' - '{#LABEL}' speed is too low ({ITEM.LASTVALUE})
89 | HIGH
90 | YES
91 |
92 |
93 | Sensors NO DATA
94 | {Template_Sensors:sensors.nodata(1h)}=1
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | sensors
103 |
104 |
105 |
106 | JAVASCRIPT
107 | var inp = JSON.parse(value);
108 | var out = [];
109 |
110 | Object.keys(inp).forEach(function(drv) {
111 | var v = inp[drv];
112 |
113 | Object.keys(v).forEach(function(sens) {
114 | var v2 = v[sens];
115 | var label = sens;
116 | if (v2.label) {
117 | label = v2.label;
118 | }
119 | if (v2.sensor_type == "fan") {
120 | out.push({
121 | "{#DRIVER}": drv,
122 | "{#SENSOR}": sens,
123 | "{#LABEL}": label
124 | })
125 | }
126 | })
127 | })
128 |
129 | return JSON.stringify(out);
130 |
131 |
132 |
133 |
134 | Discover Power
135 | DEPENDENT
136 | sensors.discovery.power
137 | 0
138 |
139 |
140 | Power '{#DRIVER}' - '{#LABEL}'
141 | DEPENDENT
142 | sensors.power['{#DRIVER}', '{#SENSOR}']
143 | 0
144 | FLOAT
145 | W
146 |
147 |
148 | Sensors - Power
149 |
150 |
151 |
152 |
153 | JSONPATH
154 | $.['{#DRIVER}']['{#SENSOR}'].average
155 |
156 |
157 | MULTIPLIER
158 | 0.000001
159 |
160 |
161 |
162 | sensors
163 |
164 |
165 |
166 |
167 | sensors
168 |
169 |
170 |
171 | JAVASCRIPT
172 | var inp = JSON.parse(value);
173 | var out = [];
174 |
175 | Object.keys(inp).forEach(function(drv) {
176 | var v = inp[drv];
177 |
178 | Object.keys(v).forEach(function(sens) {
179 | var v2 = v[sens];
180 | var label = sens;
181 | if (v2.label) {
182 | label = v2.label;
183 | }
184 | if (v2.sensor_type == "power") {
185 | out.push({
186 | "{#DRIVER}": drv,
187 | "{#SENSOR}": sens,
188 | "{#LABEL}": label
189 | })
190 | }
191 | })
192 | })
193 |
194 | return JSON.stringify(out);
195 |
196 |
197 |
198 |
199 | Discover Temperature
200 | DEPENDENT
201 | sensors.discovery.temp
202 | 0
203 |
204 |
205 |
206 | {#VALUE}
207 | ^-?\d+$
208 | A
209 |
210 |
211 |
212 |
213 |
214 | Temperature '{#DRIVER}' - '{#LABEL}'
215 | DEPENDENT
216 | sensors.temp['{#DRIVER}', '{#SENSOR}']
217 | 0
218 | FLOAT
219 | C
220 |
221 |
222 | Sensors - Temperature
223 |
224 |
225 |
226 |
227 | JSONPATH
228 | $.['{#DRIVER}']['{#SENSOR}'].input
229 |
230 |
231 | MULTIPLIER
232 | 0.001
233 |
234 |
235 |
236 | sensors
237 |
238 |
239 |
240 | {min(600)}>{$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}
241 | RECOVERY_EXPRESSION
242 | {min(600)}<={$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
243 | Temperature '{#DRIVER}' - '{#LABEL}' is critical ({ITEM.LASTVALUE})
244 | HIGH
245 | YES
246 |
247 |
248 | Sensors NO DATA
249 | {Template_Sensors:sensors.nodata(1h)}=1
250 |
251 |
252 |
253 |
254 | {min(600)}<{$SENSORS_TEMP_CRIT_MIN:"{#DRIVER}_{#SENSOR}"}
255 | RECOVERY_EXPRESSION
256 | {min(600)}>={$SENSORS_TEMP_CRIT_MIN:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
257 | Temperature '{#DRIVER}' - '{#LABEL}' is critical minimal ({ITEM.LASTVALUE})
258 | HIGH
259 | YES
260 |
261 |
262 | Sensors NO DATA
263 | {Template_Sensors:sensors.nodata(1h)}=1
264 |
265 |
266 |
267 |
268 | {min(600)}>{$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}
269 | RECOVERY_EXPRESSION
270 | {min(600)}<={$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
271 | Temperature '{#DRIVER}' - '{#LABEL}' is high ({ITEM.LASTVALUE})
272 | AVERAGE
273 | YES
274 |
275 |
276 | Sensors NO DATA
277 | {Template_Sensors:sensors.nodata(1h)}=1
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 | sensors
286 |
287 |
288 |
289 | JAVASCRIPT
290 | var inp = JSON.parse(value);
291 | var out = [];
292 |
293 | Object.keys(inp).forEach(function(drv) {
294 | var v = inp[drv];
295 |
296 | Object.keys(v).forEach(function(sens) {
297 | var v2 = v[sens];
298 | var label = sens;
299 | if (v2.label) {
300 | label = v2.label;
301 | }
302 | if (v2.sensor_type == "temp") {
303 | out.push({
304 | "{#DRIVER}": drv,
305 | "{#SENSOR}": sens,
306 | "{#LABEL}": label,
307 | "{#VALUE}": v2.input
308 | })
309 | }
310 | })
311 | })
312 |
313 | return JSON.stringify(out);
314 |
315 |
316 |
317 |
318 | Discover Voltage
319 | DEPENDENT
320 | sensors.discovery.voltage
321 | 0
322 |
323 |
324 | Voltage '{#DRIVER}' - '{#LABEL}'
325 | DEPENDENT
326 | sensors.voltage['{#DRIVER}', '{#SENSOR}']
327 | 0
328 | 30d
329 | V
330 |
331 |
332 | Sensors - Voltage
333 |
334 |
335 |
336 |
337 | JSONPATH
338 | $.['{#DRIVER}']['{#SENSOR}'].input
339 |
340 |
341 | MULTIPLIER
342 | 0.001
343 |
344 |
345 |
346 | sensors
347 |
348 |
349 |
350 | {min(300)}>{$SENSORS_VOLTAGE_HIGH:"{#DRIVER}_{#SENSOR}"}
351 | Voltage '{#DRIVER}' - '{#LABEL}' is too high ({ITEM.LASTVALUE})
352 | AVERAGE
353 | YES
354 |
355 |
356 | Sensors NO DATA
357 | {Template_Sensors:sensors.nodata(1h)}=1
358 |
359 |
360 |
361 |
362 | {max(300)}<{$SENSORS_VOLTAGE_LOW:"{#DRIVER}_{#SENSOR}"}
363 | Voltage '{#DRIVER}' - '{#LABEL}' is too low ({ITEM.LASTVALUE})
364 | AVERAGE
365 |
366 |
367 | Sensors NO DATA
368 | {Template_Sensors:sensors.nodata(1h)}=1
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 | sensors
377 |
378 |
379 |
380 | JAVASCRIPT
381 | var inp = JSON.parse(value);
382 | var out = [];
383 |
384 | Object.keys(inp).forEach(function(drv) {
385 | var v = inp[drv];
386 |
387 | Object.keys(v).forEach(function(sens) {
388 | var v2 = v[sens];
389 | var label = sens;
390 | if (v2.label) {
391 | label = v2.label;
392 | }
393 | if (v2.sensor_type == "in") {
394 | out.push({
395 | "{#DRIVER}": drv,
396 | "{#SENSOR}": sens,
397 | "{#LABEL}": label
398 | })
399 | }
400 | })
401 | })
402 |
403 | return JSON.stringify(out);
404 |
405 |
406 |
407 |
408 |
409 |
410 | {$SENSORS_FAN_LOW}
411 | 0
412 |
413 |
414 | {$SENSORS_TEMP_CRIT}
415 | 80
416 |
417 |
418 | {$SENSORS_TEMP_CRIT_MIN}
419 | 10
420 |
421 |
422 | {$SENSORS_TEMP_HIGH}
423 | 70
424 |
425 |
426 | {$SENSORS_TEMP_HYST}
427 | 5
428 |
429 |
430 | {$SENSORS_VOLTAGE_HIGH}
431 | 1000
432 |
433 |
434 | {$SENSORS_VOLTAGE_LOW}
435 | 0
436 |
437 |
438 |
439 |
440 |
441 |
--------------------------------------------------------------------------------
/template_sensors_6.0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 6.0
4 | 2023-08-06T11:45:42Z
5 |
6 |
7 | 7df96b18c230490a9a0a9e2307226338
8 | Templates
9 |
10 |
11 |
12 |
13 | 92e2c226868147639dc11ff428f9609b
14 | Template_Sensors
15 | Template_Sensors
16 |
17 |
18 | Templates
19 |
20 |
21 |
22 | -
23 | 74dde517a2de4bb2b168291348b4fca9
24 | Sensors JSON
25 | sensors
26 | 0
27 | 0
28 | TEXT
29 |
30 |
31 | Application
32 | Sensors Raw
33 |
34 |
35 |
36 |
37 |
38 |
39 | 7b11738186104c5fab579069bfa70a77
40 | Discover Fans
41 | DEPENDENT
42 | sensors.discovery.fan
43 | 0
44 | 7d
45 |
46 |
47 | a04c66a84f894cb5a7c4080de4bca288
48 | Fan '{#DRIVER}' - '{#LABEL}'
49 | DEPENDENT
50 | sensors.fan['{#DRIVER}', '{#SENSOR}']
51 | 0
52 | 30d
53 | RPM
54 |
55 |
56 | JSONPATH
57 |
58 | $.['{#DRIVER}']['{#SENSOR}'].input
59 |
60 |
61 |
62 |
63 | sensors
64 |
65 |
66 |
67 | Application
68 | Sensors - Fan
69 |
70 |
71 |
72 |
73 | 14bff65404db4e7ea722a124d4ec42f6
74 | last(/Template_Sensors/sensors.fan['{#DRIVER}', '{#SENSOR}'])<{$SENSORS_FAN_LOW:"{#DRIVER}_{#SENSOR}"}
75 | Fan '{#DRIVER}' - '{#LABEL}' speed is too low ({ITEM.LASTVALUE})
76 | HIGH
77 |
78 |
79 |
80 |
81 |
82 | sensors
83 |
84 |
85 |
86 | JAVASCRIPT
87 |
88 | var inp = JSON.parse(value);
89 | var out = [];
90 |
91 | Object.keys(inp).forEach(function(drv) {
92 | var v = inp[drv];
93 |
94 | Object.keys(v).forEach(function(sens) {
95 | var v2 = v[sens];
96 | var label = sens;
97 | if (v2.label) {
98 | label = v2.label;
99 | }
100 | if (v2.sensor_type == "fan") {
101 | out.push({
102 | "{#DRIVER}": drv,
103 | "{#SENSOR}": sens,
104 | "{#LABEL}": label
105 | })
106 | }
107 | })
108 | })
109 |
110 | return JSON.stringify(out);
111 |
112 |
113 |
114 |
115 |
116 | acd8137d037a4ae390660a23374a56c9
117 | Discover Power
118 | DEPENDENT
119 | sensors.discovery.power
120 | 0
121 | 7d
122 |
123 |
124 | fbd5e4aaab9c4d85b24cbbaa6238804c
125 | Power '{#DRIVER}' - '{#LABEL}'
126 | DEPENDENT
127 | sensors.power['{#DRIVER}', '{#SENSOR}']
128 | 0
129 | 30d
130 | FLOAT
131 | W
132 |
133 |
134 | JSONPATH
135 |
136 | $.['{#DRIVER}']['{#SENSOR}'].average
137 |
138 |
139 |
140 | MULTIPLIER
141 |
142 | 0.000001
143 |
144 |
145 |
146 |
147 | sensors
148 |
149 |
150 |
151 | Application
152 | Sensors - Power
153 |
154 |
155 |
156 |
157 |
158 | sensors
159 |
160 |
161 |
162 | JAVASCRIPT
163 |
164 | var inp = JSON.parse(value);
165 | var out = [];
166 |
167 | Object.keys(inp).forEach(function(drv) {
168 | var v = inp[drv];
169 |
170 | Object.keys(v).forEach(function(sens) {
171 | var v2 = v[sens];
172 | var label = sens;
173 | if (v2.label) {
174 | label = v2.label;
175 | }
176 | if (v2.sensor_type == "power") {
177 | out.push({
178 | "{#DRIVER}": drv,
179 | "{#SENSOR}": sens,
180 | "{#LABEL}": label
181 | })
182 | }
183 | })
184 | })
185 |
186 | return JSON.stringify(out);
187 |
188 |
189 |
190 |
191 |
192 | 393379127d0f48f4bb3763c00273ba43
193 | Discover Temperature
194 | DEPENDENT
195 | sensors.discovery.temp
196 | 0
197 |
198 |
199 |
200 | {#VALUE}
201 | ^-?\d+$
202 | A
203 |
204 |
205 |
206 | 7d
207 |
208 |
209 | b6f0377dd1a5484482811100d2d86a7c
210 | Temperature '{#DRIVER}' - '{#LABEL}'
211 | DEPENDENT
212 | sensors.temp['{#DRIVER}', '{#SENSOR}']
213 | 0
214 | 30d
215 | FLOAT
216 | C
217 |
218 |
219 | JSONPATH
220 |
221 | $.['{#DRIVER}']['{#SENSOR}'].input
222 |
223 |
224 |
225 | MULTIPLIER
226 |
227 | 0.001
228 |
229 |
230 |
231 |
232 | sensors
233 |
234 |
235 |
236 | Application
237 | Sensors - Temperature
238 |
239 |
240 |
241 |
242 | 58d103a9f84647149bec763f1a4eebe0
243 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)>{$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}
244 | RECOVERY_EXPRESSION
245 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)<={$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
246 | Temperature '{#DRIVER}' - '{#LABEL}' is critical ({ITEM.LASTVALUE})
247 | HIGH
248 |
249 |
250 | 8c9ae7e57a184a4daa9ec0a1cba8006b
251 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)>{$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}
252 | RECOVERY_EXPRESSION
253 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)<={$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
254 | Temperature '{#DRIVER}' - '{#LABEL}' is high ({ITEM.LASTVALUE})
255 | AVERAGE
256 |
257 |
258 |
259 |
260 |
261 | sensors
262 |
263 |
264 |
265 | JAVASCRIPT
266 |
267 | var inp = JSON.parse(value);
268 | var out = [];
269 |
270 | Object.keys(inp).forEach(function(drv) {
271 | var v = inp[drv];
272 |
273 | Object.keys(v).forEach(function(sens) {
274 | var v2 = v[sens];
275 | var label = sens;
276 | if (v2.label) {
277 | label = v2.label;
278 | }
279 | if (v2.sensor_type == "temp") {
280 | out.push({
281 | "{#DRIVER}": drv,
282 | "{#SENSOR}": sens,
283 | "{#LABEL}": label,
284 | "{#VALUE}": v2.input
285 | })
286 | }
287 | })
288 | })
289 |
290 | return JSON.stringify(out);
291 |
292 |
293 |
294 |
295 |
296 | d19dbbd218514acc9ae77c19cb1f9c44
297 | Discover Voltage
298 | DEPENDENT
299 | sensors.discovery.voltage
300 | 0
301 | 7d
302 |
303 |
304 | 24a45e2fea8f498bb1bb9b6be11670cb
305 | Voltage '{#DRIVER}' - '{#LABEL}'
306 | DEPENDENT
307 | sensors.voltage['{#DRIVER}', '{#SENSOR}']
308 | 0
309 | 30d
310 | FLOAT
311 | V
312 |
313 |
314 | JSONPATH
315 |
316 | $.['{#DRIVER}']['{#SENSOR}'].input
317 |
318 |
319 |
320 | MULTIPLIER
321 |
322 | 0.001
323 |
324 |
325 |
326 |
327 | sensors
328 |
329 |
330 |
331 | Application
332 | Sensors - Voltage
333 |
334 |
335 |
336 |
337 | d74a773d56f442f59efc3691c52a77dc
338 | min(/Template_Sensors/sensors.voltage['{#DRIVER}', '{#SENSOR}'],300s)>{$SENSORS_VOLTAGE_HIGH:"{#DRIVER}_{#SENSOR}"}
339 | Voltage '{#DRIVER}' - '{#LABEL}' is too high ({ITEM.LASTVALUE})
340 | AVERAGE
341 |
342 |
343 | 2a6fdd9075c544f2b77b32be36bb2819
344 | max(/Template_Sensors/sensors.voltage['{#DRIVER}', '{#SENSOR}'],300s)<{$SENSORS_VOLTAGE_LOW:"{#DRIVER}_{#SENSOR}"}
345 | Voltage '{#DRIVER}' - '{#LABEL}' is too low ({ITEM.LASTVALUE})
346 | AVERAGE
347 |
348 |
349 |
350 |
351 |
352 | sensors
353 |
354 |
355 |
356 | JAVASCRIPT
357 |
358 | var inp = JSON.parse(value);
359 | var out = [];
360 |
361 | Object.keys(inp).forEach(function(drv) {
362 | var v = inp[drv];
363 |
364 | Object.keys(v).forEach(function(sens) {
365 | var v2 = v[sens];
366 | var label = sens;
367 | if (v2.label) {
368 | label = v2.label;
369 | }
370 | if (v2.sensor_type == "in") {
371 | out.push({
372 | "{#DRIVER}": drv,
373 | "{#SENSOR}": sens,
374 | "{#LABEL}": label
375 | })
376 | }
377 | })
378 | })
379 |
380 | return JSON.stringify(out);
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 | {$SENSORS_FAN_LOW}
389 | 0
390 |
391 |
392 | {$SENSORS_TEMP_CRIT}
393 | 80
394 |
395 |
396 | {$SENSORS_TEMP_HIGH}
397 | 70
398 |
399 |
400 | {$SENSORS_TEMP_HYST}
401 | 5
402 |
403 |
404 | {$SENSORS_VOLTAGE_HIGH}
405 | 1000
406 |
407 |
408 | {$SENSORS_VOLTAGE_LOW}
409 | 0
410 |
411 |
412 |
413 |
414 |
415 |
--------------------------------------------------------------------------------
/template_sensors_6.4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 6.4
4 |
5 |
6 | 7df96b18c230490a9a0a9e2307226338
7 | Templates
8 |
9 |
10 |
11 |
12 | 92e2c226868147639dc11ff428f9609b
13 | Template_Sensors
14 | Template_Sensors
15 |
16 |
17 | Templates
18 |
19 |
20 |
21 | -
22 | 74dde517a2de4bb2b168291348b4fca9
23 | Sensors JSON
24 | sensors
25 | 0
26 | 0
27 | TEXT
28 |
29 |
30 | Application
31 | Sensors Raw
32 |
33 |
34 |
35 |
36 |
37 |
38 | 7b11738186104c5fab579069bfa70a77
39 | Discover Fans
40 | DEPENDENT
41 | sensors.discovery.fan
42 | 0
43 | 7d
44 |
45 |
46 | a04c66a84f894cb5a7c4080de4bca288
47 | Fan '{#DRIVER}' - '{#LABEL}'
48 | DEPENDENT
49 | sensors.fan['{#DRIVER}', '{#SENSOR}']
50 | 0
51 | 30d
52 | RPM
53 |
54 |
55 | JSONPATH
56 |
57 | $.['{#DRIVER}']['{#SENSOR}'].input
58 |
59 |
60 |
61 |
62 | sensors
63 |
64 |
65 |
66 | Application
67 | Sensors - Fan
68 |
69 |
70 |
71 |
72 | 14bff65404db4e7ea722a124d4ec42f6
73 | last(/Template_Sensors/sensors.fan['{#DRIVER}', '{#SENSOR}'])<{$SENSORS_FAN_LOW:"{#DRIVER}_{#SENSOR}"}
74 | Fan '{#DRIVER}' - '{#LABEL}' speed is too low ({ITEM.LASTVALUE})
75 | HIGH
76 |
77 |
78 |
79 |
80 |
81 | sensors
82 |
83 |
84 |
85 | JAVASCRIPT
86 |
87 | var inp = JSON.parse(value);
88 | var out = [];
89 |
90 | Object.keys(inp).forEach(function(drv) {
91 | var v = inp[drv];
92 |
93 | Object.keys(v).forEach(function(sens) {
94 | var v2 = v[sens];
95 | var label = sens;
96 | if (v2.label) {
97 | label = v2.label;
98 | }
99 | if (v2.sensor_type == "fan") {
100 | out.push({
101 | "{#DRIVER}": drv,
102 | "{#SENSOR}": sens,
103 | "{#LABEL}": label
104 | })
105 | }
106 | })
107 | })
108 |
109 | return JSON.stringify(out);
110 |
111 |
112 |
113 |
114 |
115 | acd8137d037a4ae390660a23374a56c9
116 | Discover Power
117 | DEPENDENT
118 | sensors.discovery.power
119 | 0
120 | 7d
121 |
122 |
123 | fbd5e4aaab9c4d85b24cbbaa6238804c
124 | Power '{#DRIVER}' - '{#LABEL}'
125 | DEPENDENT
126 | sensors.power['{#DRIVER}', '{#SENSOR}']
127 | 0
128 | 30d
129 | FLOAT
130 | W
131 |
132 |
133 | JSONPATH
134 |
135 | $.['{#DRIVER}']['{#SENSOR}'].average
136 |
137 |
138 |
139 | MULTIPLIER
140 |
141 | 0.000001
142 |
143 |
144 |
145 |
146 | sensors
147 |
148 |
149 |
150 | Application
151 | Sensors - Power
152 |
153 |
154 |
155 |
156 |
157 | sensors
158 |
159 |
160 |
161 | JAVASCRIPT
162 |
163 | var inp = JSON.parse(value);
164 | var out = [];
165 |
166 | Object.keys(inp).forEach(function(drv) {
167 | var v = inp[drv];
168 |
169 | Object.keys(v).forEach(function(sens) {
170 | var v2 = v[sens];
171 | var label = sens;
172 | if (v2.label) {
173 | label = v2.label;
174 | }
175 | if (v2.sensor_type == "power") {
176 | out.push({
177 | "{#DRIVER}": drv,
178 | "{#SENSOR}": sens,
179 | "{#LABEL}": label
180 | })
181 | }
182 | })
183 | })
184 |
185 | return JSON.stringify(out);
186 |
187 |
188 |
189 |
190 |
191 | 393379127d0f48f4bb3763c00273ba43
192 | Discover Temperature
193 | DEPENDENT
194 | sensors.discovery.temp
195 | 0
196 |
197 |
198 |
199 | {#VALUE}
200 | ^-?\d+$
201 | A
202 |
203 |
204 |
205 | 7d
206 |
207 |
208 | b6f0377dd1a5484482811100d2d86a7c
209 | Temperature '{#DRIVER}' - '{#LABEL}'
210 | DEPENDENT
211 | sensors.temp['{#DRIVER}', '{#SENSOR}']
212 | 0
213 | 30d
214 | FLOAT
215 | C
216 |
217 |
218 | JSONPATH
219 |
220 | $.['{#DRIVER}']['{#SENSOR}'].input
221 |
222 |
223 |
224 | MULTIPLIER
225 |
226 | 0.001
227 |
228 |
229 |
230 |
231 | sensors
232 |
233 |
234 |
235 | Application
236 | Sensors - Temperature
237 |
238 |
239 |
240 |
241 | 58d103a9f84647149bec763f1a4eebe0
242 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)>{$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}
243 | RECOVERY_EXPRESSION
244 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)<={$SENSORS_TEMP_CRIT:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
245 | Temperature '{#DRIVER}' - '{#LABEL}' is critical ({ITEM.LASTVALUE})
246 | HIGH
247 |
248 |
249 | 8c9ae7e57a184a4daa9ec0a1cba8006b
250 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)>{$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}
251 | RECOVERY_EXPRESSION
252 | min(/Template_Sensors/sensors.temp['{#DRIVER}', '{#SENSOR}'],600s)<={$SENSORS_TEMP_HIGH:"{#DRIVER}_{#SENSOR}"}-{$SENSORS_TEMP_HYST}
253 | Temperature '{#DRIVER}' - '{#LABEL}' is high ({ITEM.LASTVALUE})
254 | AVERAGE
255 |
256 |
257 |
258 |
259 |
260 | sensors
261 |
262 |
263 |
264 | JAVASCRIPT
265 |
266 | var inp = JSON.parse(value);
267 | var out = [];
268 |
269 | Object.keys(inp).forEach(function(drv) {
270 | var v = inp[drv];
271 |
272 | Object.keys(v).forEach(function(sens) {
273 | var v2 = v[sens];
274 | var label = sens;
275 | if (v2.label) {
276 | label = v2.label;
277 | }
278 | if (v2.sensor_type == "temp") {
279 | out.push({
280 | "{#DRIVER}": drv,
281 | "{#SENSOR}": sens,
282 | "{#LABEL}": label,
283 | "{#VALUE}": v2.input
284 | })
285 | }
286 | })
287 | })
288 |
289 | return JSON.stringify(out);
290 |
291 |
292 |
293 |
294 |
295 | d19dbbd218514acc9ae77c19cb1f9c44
296 | Discover Voltage
297 | DEPENDENT
298 | sensors.discovery.voltage
299 | 0
300 | 7d
301 |
302 |
303 | 24a45e2fea8f498bb1bb9b6be11670cb
304 | Voltage '{#DRIVER}' - '{#LABEL}'
305 | DEPENDENT
306 | sensors.voltage['{#DRIVER}', '{#SENSOR}']
307 | 0
308 | 30d
309 | FLOAT
310 | V
311 |
312 |
313 | JSONPATH
314 |
315 | $.['{#DRIVER}']['{#SENSOR}'].input
316 |
317 |
318 |
319 | MULTIPLIER
320 |
321 | 0.001
322 |
323 |
324 |
325 |
326 | sensors
327 |
328 |
329 |
330 | Application
331 | Sensors - Voltage
332 |
333 |
334 |
335 |
336 | d74a773d56f442f59efc3691c52a77dc
337 | min(/Template_Sensors/sensors.voltage['{#DRIVER}', '{#SENSOR}'],300s)>{$SENSORS_VOLTAGE_HIGH:"{#DRIVER}_{#SENSOR}"}
338 | Voltage '{#DRIVER}' - '{#LABEL}' is too high ({ITEM.LASTVALUE})
339 | AVERAGE
340 |
341 |
342 | 2a6fdd9075c544f2b77b32be36bb2819
343 | max(/Template_Sensors/sensors.voltage['{#DRIVER}', '{#SENSOR}'],300s)<{$SENSORS_VOLTAGE_LOW:"{#DRIVER}_{#SENSOR}"}
344 | Voltage '{#DRIVER}' - '{#LABEL}' is too low ({ITEM.LASTVALUE})
345 | AVERAGE
346 |
347 |
348 |
349 |
350 |
351 | sensors
352 |
353 |
354 |
355 | JAVASCRIPT
356 |
357 | var inp = JSON.parse(value);
358 | var out = [];
359 |
360 | Object.keys(inp).forEach(function(drv) {
361 | var v = inp[drv];
362 |
363 | Object.keys(v).forEach(function(sens) {
364 | var v2 = v[sens];
365 | var label = sens;
366 | if (v2.label) {
367 | label = v2.label;
368 | }
369 | if (v2.sensor_type == "in") {
370 | out.push({
371 | "{#DRIVER}": drv,
372 | "{#SENSOR}": sens,
373 | "{#LABEL}": label
374 | })
375 | }
376 | })
377 | })
378 |
379 | return JSON.stringify(out);
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 | {$SENSORS_FAN_LOW}
388 | 0
389 |
390 |
391 | {$SENSORS_TEMP_CRIT}
392 | 80
393 |
394 |
395 | {$SENSORS_TEMP_HIGH}
396 | 70
397 |
398 |
399 | {$SENSORS_TEMP_HYST}
400 | 5
401 |
402 |
403 | {$SENSORS_VOLTAGE_HIGH}
404 | 1000
405 |
406 |
407 | {$SENSORS_VOLTAGE_LOW}
408 | 0
409 |
410 |
411 |
412 |
413 |
414 |
--------------------------------------------------------------------------------