-
Notifications
You must be signed in to change notification settings - Fork 10
Description
I'm having difficulties getting the UPS HAT to shut down early enough.
Expected functionality: I want the device to shut down when the battery voltage is in the 3V-3.2V range.
Programming: set_safe_shutdown_battery_level(5)
Observed functionality: the device does not shut down.
Details:
- after dealing with issue bogus battery voltage? #32 I placed a fresh protected 2650mAh 18650 into the HAT
- I fully charged the battery in the HAT, then unplugged power and let the battery run down
- when I came back to check, the rPi was "dead", however, the rPi LEDs were flickering in about a 5-second cycle
- battery voltage (multimeter measure) was around 2.5V (basically where the battery protection cuts out)
- voltage on the rPi 40-pin header's 5V pins was fluctuating between 2.5V and 2.9V
- this is not good!!
- I took the battery out and charged it to see how much charge would go in, my charger reported 2520mAh
- I placed the battery back into the rPi and used
set_safe_shutdown_battery_level(5) - I then ran the rPi back down on battery, but was connected (SSH) printing the battery stats
- the result is that the power API clearly shows "safe shutdown battery level" being set at 5% yet "level" drops below 5% and the rPi doesn't shut down
- I ran this over night, in the morning the battery voltage (mutimeter measure) was 2.5V
Here's the log starting with 3 iterations at the beginning (the rPi had been running for a few minutes already, that's why level starts at 95%):
$ while true; do date; ./ups_test.py; sleep 300; done
Mon Oct 3 02:23:42 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 28.37, "voltage": 0.0, "current": 0.0, "power": 0
.0}, "system": {"temp": 40.2, "voltage": 5.176, "current": 0.318, "power": 1.632}, "battery": {"temp
": 28.5, "voltage": 4.07, "current": -0.478, "power": -1.945, "level": 96, "health": 90, "max_charge
_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6855, "health": 1}}
Mon Oct 3 02:28:42 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 28.5, "voltage": 0.0, "current": 0.0, "power": 0.
0}, "system": {"temp": 40.8, "voltage": 5.176, "current": 0.309, "power": 1.632}, "battery": {"temp"
: 28.87, "voltage": 4.05, "current": -0.48, "power": -1.944, "level": 95, "health": 90, "max_charge_
level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6870, "health": 1}}
Mon Oct 3 02:33:43 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 28.37, "voltage": 0.0, "current": 0.0, "power": 0
.0}, "system": {"temp": 40.2, "voltage": 5.176, "current": 0.318, "power": 1.664}, "battery": {"temp
": 29.25, "voltage": 4.03, "current": -0.485, "power": -1.955, "level": 93, "health": 90, "max_charg
e_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6870, "health": 1}}
and then later:
Mon Oct 3 06:09:17 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.172, "current": 0.315, "power": 1.64}, "battery": {"temp": 29.12, "voltage": 3.447, "current": -0.567, "power": -1.954, "level": 12, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6780, "health": 1}}
Mon Oct 3 06:14:18 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.2, "voltage": 5.172, "current": 0.316, "power": 1.64}, "battery": {"temp": 29.12, "voltage": 3.43, "current": -0.572, "power": -1.962, "level": 10, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6780, "health": 1}}
Mon Oct 3 06:19:19 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.164, "current": 0.327, "power": 1.784}, "battery": {"temp": 29.12, "voltage": 3.409, "current": -0.573, "power": -1.953, "level": 7, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6765, "health": 1}}
Mon Oct 3 06:24:20 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.172, "current": 0.315, "power": 1.652}, "battery": {"temp": 29.12, "voltage": 3.385, "current": -0.581, "power": -1.967, "level": 4, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6750, "health": 1}}
Mon Oct 3 06:29:20 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.172, "current": 0.316, "power": 1.632}, "battery": {"temp": 29.12, "voltage": 3.371, "current": -0.582, "power": -1.962, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6765, "health": 1}}
Mon Oct 3 06:34:21 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.2, "voltage": 5.172, "current": 0.315, "power": 1.62}, "battery": {"temp": 29.0, "voltage": 3.359, "current": -0.582, "power": -1.955, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6765, "health": 1}}
Mon Oct 3 06:39:22 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.37, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.168, "current": 0.317, "power": 1.624}, "battery": {"temp": 29.12, "voltage": 3.344, "current": -0.588, "power": -1.966, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6750, "health": 1}}
Mon Oct 3 06:44:23 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.5, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.2, "voltage": 5.172, "current": 0.424, "power": 2.056}, "battery": {"temp": 29.12, "voltage": 3.322, "current": -0.591, "power": -1.963, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6765, "health": 1}}
Mon Oct 3 06:49:23 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.37, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.168, "current": 0.318, "power": 1.644}, "battery": {"temp": 29.12, "voltage": 3.267, "current": -0.602, "power": -1.967, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6780, "health": 1}}
Mon Oct 3 06:54:24 EDT 2022
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 27.37, "voltage": 0.0, "current": 0.0, "power": 0.0}, "system": {"temp": 39.7, "voltage": 5.172, "current": 0.316, "power": 1.632}, "battery": {"temp": 29.25, "voltage": 3.111, "current": -0.629, "power": -1.957, "level": 1, "health": 90, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6765, "health": 1}}
client_loop: send disconnect: Broken pipe
Notice how at 06:24:20 EDT the power API reports "level": 4 yet it doesn't shut the rPi down! Also notice "shutdown_level": 5, which is the result of get_safe_shutdown_battery_level().
After turning power back on, I logged into the rPi as quickly as possible and ran ups_test.py:
gnome@SG-D011RPI31F2B:/opt/sensorgnome/ups-hat $ ./ups_test.py
{"firmware": {"ver": "v0.3.22"}, "input": {"temp": 23.62, "voltage": 11.264, "current": 0.25, "power": 2.816}, "system": {"temp": 34.3, "voltage": 5.172, "current": 0.312, "power": 1.64}, "battery": {"temp": 23.75, "voltage": 2.825, "current": 0.385, "power": 1.088, "level": 1, "health": 89, "max_charge_level": 95, "design_capacity": 2500, "shutdown_level": 5}, "fan": {"speed": 6135, "health": 1}}
Notice how the power API reports a reasonable voltage (a bit higher than the 2.5V before charging current was applied), and a battery level of 1%.
For completeness, here's ups_test.py:
$ cat ./ups_test.py
#! /usr/bin/python
import json
import sys
from power_api import SixfabPower
pwr = SixfabPower()
try:
v = pwr.get_firmware_ver().rstrip("\x00")
#print("Firmware:", v)
pwr.set_battery_max_charge_level(95)
except Exception as e:
print("Error:", e, file=sys.stderr)
print("Assuming no Sixfab UPS HAT present", file=sys.stderr)
sys.exit(1)
data = {"firmware": {"ver": v}}
for subsys in ["input", "system", "battery"]:
data[subsys] = {}
for key in ["temp", "voltage", "current", "power"]:
f = f"get_{subsys}_{key}"
data[subsys][key] = getattr(pwr, f)()
for key in ["level", "health", "max_charge_level", "design_capacity"]:
f = f"get_battery_{key}"
data["battery"][key] = getattr(pwr, f)()
data["battery"]["shutdown_level"] = pwr.get_safe_shutdown_battery_level()
data["fan"] = {}
data["fan"]["speed"] = pwr.get_fan_speed()
data["fan"]["health"] = pwr.get_fan_health()
print(json.dumps(data))