Skip to content

UPS HAT does not shut down #33

@tve

Description

@tve

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))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions