#!/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 ( f " { power : 12.2f } mW { power_total : 12.2f } mW { power_total - power : 12.2f } mW " )
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 ( f " { voltage : .2f } volts { current : 12.2f } ma { power : 12.2f } mW { power_total : 12.2f } mW " )
print ( f " { stop_time - start_time : .2f } Seconds { voltage_average [ 1 ] } samples " )
print ( " ---------------------------------------------------------------- " )