]> arthur.barton.de Git - netdata.git/blob - charts.d/sensors.chart.sh
added all possible sensors (temperature, voltage, current, energy, power, humidity...
[netdata.git] / charts.d / sensors.chart.sh
1 #!/bin/sh
2
3 # if this chart is called X.chart.sh, then all functions and global variables
4 # must start with X_
5
6 sensors_sys_dir="/sys/devices"
7 sensors_sys_depth=10
8
9 # _update_every is a special variable - it holds the number of seconds
10 # between the calls of the _update() function
11 sensors_update_every=
12
13 sensors_find_all_files() {
14         find $1 -maxdepth $sensors_sys_depth -name \*_input -o -name temp 2>/dev/null
15 }
16
17 sensors_find_all_dirs() {
18         sensors_find_all_files $1 | while read
19         do
20                 dirname $REPLY
21         done | sort -u
22 }
23
24 # _check is called once, to find out if this chart should be enabled or not
25 sensors_check() {
26
27         # this should return:
28         #  - 0 to enable the chart
29         #  - 1 to disable the chart
30
31         [ ! -z "$( sensors_find_all_files $sensors_sys_dir )" ] && return 0
32         return 1
33 }
34
35 sensors_check_files() {
36         local f= v=
37         for f in $*
38         do
39                 echo >&2 "checking $f"
40                 v="$( cat $f )"
41                 v=$(( v + 1 - 1 ))
42                 [ $v -ne 0 ] && echo "$f"
43         done
44 }
45
46 # _create is called once, to create the charts
47 sensors_create() {
48         local path= dir= name= x= file= lfile= labelname= labelid= device= subsystem= id= type= mode= files= multiplier= divisor=
49
50         echo >$TMP_DIR/temp.sh "sensors_update() {"
51
52         for path in $( sensors_find_all_dirs $sensors_sys_dir | sort -u )
53         do
54                 dir=$( basename $path )
55                 device=
56                 subsystem=
57                 id=
58                 type=
59                 name=
60
61                 [ -h $path/device ] && device=$( readlink -f $path/device )
62                 [ ! -z "$device" ] && device=$( basename $device )
63                 [ -z "$device" ] && device="$dir"
64
65                 [ -h $path/subsystem ] && subsystem=$( readlink -f $path/subsystem )
66                 [ ! -z "$subsystem" ] && subsystem=$( basename $subsystem )
67                 [ -z "$subsystem" ] && subsystem="$dir"
68
69                 [ -f $path/name ] && name=$( cat $path/name )
70                 [ -z "$name" ] && name="$dir"
71
72                 [ -f $path/type ] && type=$( cat $path/type )
73                 [ -z "$type" ] && type="$dir"
74
75                 id="$( fixid "$device.$subsystem.$dir" )"
76
77                 echo >&2 "charts.d: sensors on path='$path', dir='$dir', device='$device', subsystem='$subsystem', id='$id', name='$name'"
78
79                 for mode in temperature voltage fans power current energy humidity
80                 do
81                         files=
82                         multiplier=1
83                         divisor=1
84                         algorithm="absolute"
85
86                         case $mode in
87                                 temperature)
88                                         files="$( ls $path/temp*_input 2>/dev/null; ls $path/temp 2>/dev/null )"
89                                         files="$( sensors_check_files $files )"
90                                         [ -z "$files" ] && continue
91                                         echo "CHART sensors.temp_${id} '' '${name} Temperature' 'Celcius' '${device}' '' line 6000 $sensors_update_every"
92                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.temp_${id} \$1\""
93                                         divisor=1000
94                                         ;;
95
96                                 voltage)
97                                         files="$( ls $path/in*_input 2>/dev/null )"
98                                         files="$( sensors_check_files $files )"
99                                         [ -z "$files" ] && continue
100                                         echo "CHART sensors.volt_${id} '' '${name} Voltage' 'Volts' '${device}' '' line 6001 $sensors_update_every"
101                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.volt_${id} \$1\""
102                                         divisor=1000
103                                         ;;
104
105                                 current)
106                                         files="$( ls $path/curr*_input 2>/dev/null )"
107                                         files="$( sensors_check_files $files )"
108                                         [ -z "$files" ] && continue
109                                         echo "CHART sensors.curr_${id} '' '${name} Current' 'Ampere' '${device}' '' line 6002 $sensors_update_every"
110                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.curr_${id} \$1\""
111                                         divisor=1000
112                                         ;;
113
114                                 power)
115                                         files="$( ls $path/power*_input 2>/dev/null )"
116                                         files="$( sensors_check_files $files )"
117                                         [ -z "$files" ] && continue
118                                         echo "CHART sensors.power_${id} '' '${name} Power' 'Watt' '${device}' '' line 6003 $sensors_update_every"
119                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.power_${id} \$1\""
120                                         divisor=1000000
121                                         ;;
122
123                                 fans)
124                                         files="$( ls $path/fan*_input 2>/dev/null )"
125                                         files="$( sensors_check_files $files )"
126                                         [ -z "$files" ] && continue
127                                         echo "CHART sensors.fan_${id} '' '${name} Fans Speed' 'Rotations / Minute' '${device}' '' line 6004 $sensors_update_every"
128                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.fan_${id} \$1\""
129                                         ;;
130
131                                 emergy)
132                                         files="$( ls $path/energy*_input 2>/dev/null )"
133                                         files="$( sensors_check_files $files )"
134                                         [ -z "$files" ] && continue
135                                         echo "CHART sensors.energy_${id} '' '${name} Energy' 'Joule' '${device}' '' areastack 6005 $sensors_update_every"
136                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.energy_${id} \$1\""
137                                         algorithm="incremental"
138                                         divisor=1000000
139                                         ;;
140
141                                 humidity)
142                                         files="$( ls $path/humidity*_input 2>/dev/null )"
143                                         files="$( sensors_check_files $files )"
144                                         [ -z "$files" ] && continue
145                                         echo "CHART sensors.humidity_${id} '' '${name} Humidity' 'Percent' '${device}' '' line 6006 $sensors_update_every"
146                                         echo >>$TMP_DIR/temp.sh "echo \"BEGIN sensors.humidity_${id} \$1\""
147                                         divisor=1000
148                                         ;;
149
150                                 *)
151                                         continue
152                                         ;;
153                         esac
154
155                         for x in $files
156                         do
157                                 file="$x"
158                                 fid="$( fixid "$file" )"
159                                 lfile="$( basename $file | sed "s|_input$|_label|g" )"
160                                 labelname="$( basename $file | sed "s|_input$||g" )"
161
162                                 if [ ! "$path/$lfile" = "$file" -a -f "$path/$lfile" ]
163                                         then
164                                         labelname="$( cat "$path/$lfile" )"
165                                 fi
166
167                                 echo "DIMENSION $fid '$labelname' $algorithm $multiplier $divisor"
168                                 echo >>$TMP_DIR/temp.sh "printf \"SET $fid = \"; cat $file "
169                         done
170
171                         echo >>$TMP_DIR/temp.sh "echo END"
172                 done
173         done
174
175         echo >>$TMP_DIR/temp.sh "}"
176         cat >&2 $TMP_DIR/temp.sh
177         . $TMP_DIR/temp.sh
178
179         return 0
180 }
181
182 # _update is called continiously, to collect the values
183 sensors_update() {
184         # the first argument to this function is the microseconds since last update
185         # pass this parameter to the BEGIN statement (see bellow).
186
187         # do all the work to collect / calculate the values
188         # for each dimension
189         # remember: KEEP IT SIMPLE AND SHORT
190
191 #       . $TMP_DIR/temp.sh $1
192
193         return 0
194 }
195