raspi - custom - sensors
[anomen-kernel-config.git] / raspi / customs / usr / local / bin / sensors
blob006ae389d539a704784b57e0583d606777771fb9
1 #!/usr/bin/python
3 import argparse
4 import os
5 import sys
6 import re
7 import getopt
8 import glob
9 import subprocess
10 import datetime
12 VERSION=0.2
14 ALTITUDE=0
16 def parseArguments():
18 parser = argparse.ArgumentParser(description='Raspberry Pi sensors reader.')
19 parser.add_argument('-l', '--log', dest='log', help='single line output for log',action='store_true')
20 parser.add_argument('-a', '--altitude', dest='altitude', help='altitude for computing relative pressure', default=300)
22 args = parser.parse_args()
24 return args;
27 def usage():
28 print "sensors", VERSION, "print Raspberry Pi sensor data"
29 print
30 print "Usage: sensors [-l] [-a alt]"
31 sys.exit(1)
33 def readfile(filename):
34 f = open(filename)
35 try:
36 data = f.read(1000)
37 finally:
38 f.close()
39 return data
41 def f2s(data):
42 return '{0:.1f}'.format(data);
44 def raspi():
45 cpudata = cpu_data(0)
46 rpidata = get_raspi_data()
47 print('temp=%s\'C volt=%sV freq=%sMHz %s' % (rpidata[0], rpidata[1], str(cpudata[1]), cpudata[2]))
49 def get_raspi_data():
50 vdata = subprocess.check_output(['/opt/vc/bin/vcgencmd','measure_volts'])
51 vm = re.search('volt=(\d+\.\d+()).*', vdata);
52 v = vm.group(1)
53 tdata = subprocess.check_output(['/opt/vc/bin/vcgencmd','measure_temp'])
54 tm = re.search('temp=(\d+\.\d+).*', tdata)
55 t = tm.group(1)
56 return [t, v, tdata, vdata]
58 def cpu_data(cpu):
59 data = readfile('/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')
60 freq = int(data) / 1000
61 gov = readfile('/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor').strip()
62 return ['cpu' + str(cpu), freq, gov, data]
64 def w1():
65 w1devices = glob.glob('/sys/bus/w1/devices/*/w1_slave')
66 for w1dev in w1devices:
67 t = get_w1_data(w1dev)
68 print('temp=%s\'C' % f2s(t[1]))
70 def get_w1_data(path):
71 data = readfile(path)
72 m = re.search(".*crc=\\w\\w YES\n.*t=(\\d+)", data)
73 if not m:
74 return [path, None, data];
76 t = float(m.group(1)) / 1000.0
77 return [path, t, data]
79 def bmp085():
80 bmpdevices = glob.glob('/sys/bus/i2c/drivers/bmp085/*-*')
81 for bmpdev in bmpdevices:
82 data = get_bmp085_data(bmpdev)
83 print('temp=%s\'C press=%shPa relPress=%shPa' % (f2s(data[1]),f2s(data[2]),f2s(data[3])))
86 def get_bmp085_data(path):
87 global ALTITUDE
88 tdata = readfile(path + "/temp0_input")
89 t = float(tdata) / 10.0
91 pdata = readfile(path + "/pressure0_input")
92 p_abs = float(pdata) / 100.0
93 p_rel = (p_abs*9.80665*ALTITUDE) / (287*(273+t+(ALTITUDE/400))) + p_abs
94 p_rel_2 = p_abs + ALTITUDE / 8.3
95 return [path, t, p_abs, p_rel, p_rel_2, tdata, pdata]
98 def get_date():
99 today = datetime.datetime.now()
100 return today.strftime('%Y-%m-%d %H:%M')
103 def log_line():
104 result = get_date();
106 rdata = get_raspi_data()
107 result += ' ' + rdata[0];
109 w1devices = glob.glob('/sys/bus/w1/devices/*/w1_slave')
110 for w1dev in w1devices:
111 t = get_w1_data(w1dev)
112 result += ' ' + f2s(t[1])
114 bmpdata = get_bmp085_data('/sys/bus/i2c/drivers/bmp085/1-0077')
115 result += ' ' + f2s(bmpdata[2])
116 return result
118 def main():
119 global ALTITUDE
121 args = parseArguments()
122 ALTITUDE = int(args.altitude)
124 if (args.log):
125 print log_line()
126 return
128 print "Internal: "
129 raspi()
130 bmp085()
131 print "External: "
132 w1()
134 if __name__ =='__main__':main()