1 # -*- coding: utf-8 -*-
2 # Description: sensors netdata python.d plugin
3 # Author: Pawel Krupa (paulfantom)
5 from base import SimpleService
6 import lm_sensors as sensors
8 # default module values (can be overridden per job in `config`)
11 ORDER = ['temperature', 'fan', 'voltage', 'current', 'power', 'energy', 'humidity']
13 # This is a prototype of chart definition which is used to dynamically create self.definitions
16 'options': [None, ' temperature', 'Celsius', 'temperature', 'sensors.temperature', 'line'],
18 [None, None, 'absolute', 1, 1000]
21 'options': [None, ' voltage', 'Volts', 'voltage', 'sensors.voltage', 'line'],
23 [None, None, 'absolute', 1, 1000]
26 'options': [None, ' current', 'Ampere', 'current', 'sensors.current', 'line'],
28 [None, None, 'absolute', 1, 1000]
31 'options': [None, ' power', 'Watt', 'power', 'sensors.power', 'line'],
33 [None, None, 'absolute', 1, 1000000]
36 'options': [None, ' fans speed', 'Rotations/min', 'fans', 'sensors.fan', 'line'],
38 [None, None, 'absolute', 1, 1000]
41 'options': [None, ' energy', 'Joule', 'energy', 'sensors.energy', 'areastack'],
43 [None, None, 'incremental', 1, 1000000]
46 'options': [None, ' humidity', 'Percent', 'humidity', 'sensors.humidity', 'line'],
48 [None, None, 'absolute', 1, 1000]
53 'temperature': [-127, 1000],
54 'voltage': [-127, 127],
55 'current': [-127, 127],
75 class Service(SimpleService):
76 def __init__(self, configuration=None, name=None):
77 SimpleService.__init__(self, configuration=configuration, name=name)
80 self.celsius = ('Celsius', lambda x: x)
81 self.fahrenheit = ('Fahrenheit', lambda x: x * 9 / 5 + 32) if self.configuration.get('fahrenheit') else False
82 self.choice = (choice for choice in [self.fahrenheit, self.celsius] if choice)
88 for chip in sensors.ChipIterator():
89 prefix = sensors.chip_snprintf_name(chip)
90 for feature in sensors.FeatureIterator(chip):
91 sfi = sensors.SubFeatureIterator(chip, feature)
93 val = sensors.get_value(chip, sf.number)
95 typeName = TYPE_MAP[feature.type]
96 if typeName in LIMITS:
97 limit = LIMITS[typeName];
98 if val < limit[0] or val > limit[1]:
100 if 'temp' in str(feature.name.decode()):
101 data[prefix + "_" + str(feature.name.decode())] = int(self.calc(val) * 1000)
103 data[prefix + "_" + str(feature.name.decode())] = int(val * 1000)
104 except Exception as e:
112 def _create_definitions(self):
114 for chip in sensors.ChipIterator():
115 chip_name = sensors.chip_snprintf_name(chip)
116 if len(self.chips) != 0 and not any([chip_name.startswith(ex) for ex in self.chips]):
118 for feature in sensors.FeatureIterator(chip):
119 sfi = sensors.SubFeatureIterator(chip, feature)
120 vals = [sensors.get_value(chip, sf.number) for sf in sfi]
123 if TYPE_MAP[feature.type] == type:
125 name = chip_name + "_" + TYPE_MAP[feature.type]
126 if name not in self.order:
127 self.order.append(name)
128 chart_def = list(CHARTS[type]['options'])
129 chart_def[1] = chip_name + chart_def[1]
130 if chart_def[2] == 'Celsius':
131 chart_def[2] = self.choice[0]
132 self.definitions[name] = {'options': chart_def}
133 self.definitions[name]['lines'] = []
134 line = list(CHARTS[type]['lines'][0])
135 line[0] = chip_name + "_" + str(feature.name.decode())
136 line[1] = sensors.get_label(chip, feature)
137 self.definitions[name]['lines'].append(line)
142 except Exception as e:
147 self.choice = next(self.choice)
148 except StopIteration:
149 # That can not happen but..
150 self.choice = ('Celsius', lambda x: x)
151 self.calc = self.choice[1]
153 self.calc = self.choice[1]
156 self._create_definitions()
157 except Exception as e: