update tici power monitor

old-commit-hash: 82fbd14144
taco
Comma Device 3 years ago
parent efbb570caa
commit 6ef3ae8918
  1. 71
      system/hardware/tici/power_monitor.py

@ -1,15 +1,16 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
import time import time
import numpy as np import datetime
from typing import List from typing import List
from common.realtime import Ratekeeper from common.realtime import Ratekeeper
from common.filter_simple import FirstOrderFilter
def average(avg, sample):
# Weighted avg between existing value and new sample
return ((avg[0] * avg[1] + sample) / (avg[1] + 1), avg[1] + 1)
def read_power():
with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f:
return int(f.read()) / 1e6
def sample_power(seconds=5) -> List[float]: def sample_power(seconds=5) -> List[float]:
rate = 123 rate = 123
@ -17,8 +18,7 @@ def sample_power(seconds=5) -> List[float]:
pwrs = [] pwrs = []
for _ in range(rate*seconds): for _ in range(rate*seconds):
with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f: pwrs.append(read_power())
pwrs.append(int(f.read()) / 1e6)
rk.keep_time() rk.keep_time()
return pwrs return pwrs
@ -27,47 +27,30 @@ def get_power(seconds=5):
return np.mean(pwrs) return np.mean(pwrs)
if __name__ == '__main__': if __name__ == "__main__":
duration = None
sample_time = None
if len(sys.argv) > 1: if len(sys.argv) > 1:
sample_time = int(sys.argv[1]) duration = int(sys.argv[1])
start_time = time.monotonic()
try:
voltage_average = (0, 0) # average, count
current_average = (0, 0)
power_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())
# SOM measurements are questionable rate = 23
#with open("/sys/class/power_supply/bms/voltage_now") as f: rk = Ratekeeper(rate, print_delay_threshold=None)
# voltage = int(f.read()) / 1e6 # volts fltr = FirstOrderFilter(0, 5, 1. / rate, initialized=False)
#with open("/sys/class/power_supply/bms/current_now") as f:
# current = int(f.read()) / 1e3 # ma
power_total = voltage_total*current_total
# compute averages measurements = []
voltage_average = average(voltage_average, voltage_total) start_time = time.monotonic()
current_average = average(current_average, current_total)
power_average = average(power_average, power_total)
print(f"now: {power_total:.2f} mW, avg: {power_average[0]:.2f} mW") try:
time.sleep(0.25) while duration is None or time.monotonic() - start_time < duration:
fltr.update(read_power())
if rk.frame % rate == 0:
measurements.append(fltr.x)
t = datetime.timedelta(seconds=time.monotonic() - start_time)
avg = sum(measurements) / len(measurements)
print(f"Now: {fltr.x:.2f} W, Avg: {avg:.2f} W over {t}")
rk.keep_time()
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
finally:
stop_time = time.monotonic() t = datetime.timedelta(seconds=time.monotonic() - start_time)
print("\n----------------------Average-----------------------------------") avg = sum(measurements) / len(measurements)
voltage = voltage_average[0] print(f"\nAverage power: {avg:.2f}W over {t}")
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("----------------------------------------------------------------")

Loading…
Cancel
Save