|  |  |  | #!/usr/bin/env python3
 | 
					
						
							|  |  |  | import sys
 | 
					
						
							|  |  |  | import time
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def average(avg, sample):
 | 
					
						
							|  |  |  |   # Weighted avg between existing value and new sample
 | 
					
						
							|  |  |  |   return ((avg[0] * avg[1] + sample) / (avg[1] + 1), avg[1] + 1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__':
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sample_time = None
 | 
					
						
							|  |  |  |   if len(sys.argv) > 1:
 | 
					
						
							|  |  |  |     sample_time = int(sys.argv[1])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   start_time = time.monotonic()
 | 
					
						
							|  |  |  |   try:
 | 
					
						
							|  |  |  |     voltage_average = (0, 0)  # average, count
 | 
					
						
							|  |  |  |     current_average = (0, 0)
 | 
					
						
							|  |  |  |     power_average = (0, 0)
 | 
					
						
							|  |  |  |     power_total_average = (0, 0)
 | 
					
						
							|  |  |  |     while sample_time is None or time.monotonic() - start_time < sample_time:
 | 
					
						
							|  |  |  |       with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/in1_input") as f:
 | 
					
						
							|  |  |  |         voltage_total = int(f.read()) / 1000.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/curr1_input") as f:
 | 
					
						
							|  |  |  |         current_total = int(f.read())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       with open("/sys/class/power_supply/bms/voltage_now") as f:
 | 
					
						
							|  |  |  |         voltage = int(f.read()) / 1e6   # volts
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       with open("/sys/class/power_supply/bms/current_now") as f:
 | 
					
						
							|  |  |  |         current = int(f.read()) / 1e3   # ma
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       power = voltage*current
 | 
					
						
							|  |  |  |       power_total = voltage_total*current_total
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # compute averages
 | 
					
						
							|  |  |  |       voltage_average = average(voltage_average, voltage)
 | 
					
						
							|  |  |  |       current_average = average(current_average, current)
 | 
					
						
							|  |  |  |       power_average = average(power_average, power)
 | 
					
						
							|  |  |  |       power_total_average = average(power_total_average, power_total)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       print("%12.2f mW %12.2f mW %12.2f mW" % (power, power_total, power_total-power))
 | 
					
						
							|  |  |  |       time.sleep(0.25)
 | 
					
						
							|  |  |  |   finally:
 | 
					
						
							|  |  |  |     stop_time = time.monotonic()
 | 
					
						
							|  |  |  |     print("\n----------------------Average-----------------------------------")
 | 
					
						
							|  |  |  |     voltage = voltage_average[0]
 | 
					
						
							|  |  |  |     current = current_average[0]
 | 
					
						
							|  |  |  |     power = power_average[0]
 | 
					
						
							|  |  |  |     print("%.2f volts %12.2f ma %12.2f mW %12.2f mW" % (voltage, current, power, power_total))
 | 
					
						
							|  |  |  |     print("  {:.2f} Seconds     {} samples".format(stop_time - start_time, voltage_average[1]))
 | 
					
						
							|  |  |  |     print("----------------------------------------------------------------")
 |