Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion SolixBLE/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
Generic,
PrimeCharger160w,
PrimeCharger250w,
PrimePowerBank20k,
Solarbank2,
Solarbank3,
)
Expand All @@ -25,9 +26,9 @@
ChargingStatusF3800,
DisplayTimeout,
LightStatus,
PortOverload,
PortStatus,
TemperatureUnit,
PortOverload,
)
from .utilities import discover_devices

Expand All @@ -45,6 +46,7 @@
"Solarbank3",
"PrimeCharger160w",
"PrimeCharger250w",
"PrimePowerBank20k",
"Generic",
"ChargingStatus",
"ChargingStatusF3800",
Expand Down
2 changes: 2 additions & 0 deletions SolixBLE/devices/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from .generic import Generic
from .prime_charger_160w import PrimeCharger160w
from .prime_charger_250w import PrimeCharger250w
from .prime_power_bank_20k import PrimePowerBank20k
from .solarbank2 import Solarbank2
from .solarbank3 import Solarbank3

Expand All @@ -29,5 +30,6 @@
"Solarbank3",
"PrimeCharger160w",
"PrimeCharger250w",
"PrimePowerBank20k",
"Generic",
]
173 changes: 173 additions & 0 deletions SolixBLE/devices/prime_power_bank_20k.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
"""Anker Prime Power Bank 20k (220w) model.

.. moduleauthor:: Harvey Lelliott (flip-dots) <harveylelliott@duck.com>

"""

from ..const import DEFAULT_METADATA_FLOAT
from ..prime_device import PrimeDevice
from ..states import PortStatus


class PrimePowerBank20k(PrimeDevice):
"""
Anker Prime Power Bank 20k (220w) model.

Use this class to connect and monitor the 220w power bank.
This model is also known as the A110B.
"""

@property
def battery_percentage(self) -> int:
"""Battery Percentage.

:returns: Percentage charge of battery or default int value.
"""
return self._parse_int("a2", begin=1, end=2)

@property
def power_out(self) -> int:
"""Total Power Out.

:returns: Total power out or default int value.
"""
return self._parse_int("a6", begin=2, end=4) / 10.0

@property
def temperature(self) -> int:
"""Temperature of the unit (C).

:returns: Temperature of the unit in degrees C.
"""
return self._parse_int("af", begin=1, signed=True)

@property
def usb_port_c1(self) -> PortStatus:
"""USB C1 Port Status.

:returns: Status of the USB C1 port.
"""
return PortStatus(self._parse_int("a8", begin=1, end=2))

@property
def usb_c1_voltage(self) -> float:
"""USB C1 Port voltage (V).

:returns: Voltage of the USB C1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a8", begin=2, end=4) / 10.0

@property
def usb_c1_current(self) -> float:
"""USB C1 Port current (A).

:returns: Current of the USB C1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a8", begin=4, end=6) / 10.0

@property
def usb_c1_power(self) -> float:
"""USB C1 Port power (W).

.. important::

There appears to be a firmware bug in the power bank which
causes the value of USB C1 power to latch to whatever its
last value was when unplugged, this does not happen with
USB C2 power for some reason. This has been observed on
version v1.6.0.5.

:returns: Power of the USB C1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a8", begin=6, end=8) / 10.0

@property
def usb_port_c2(self) -> PortStatus:
"""USB C2 Port Status.

:returns: Status of the USB C2 port.
"""
return PortStatus(self._parse_int("a9", begin=1, end=2))

@property
def usb_c2_voltage(self) -> float:
"""USB C2 Port voltage (V).

:returns: Voltage of the USB C2 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a9", begin=2, end=4) / 10.0

@property
def usb_c2_current(self) -> float:
"""USB C2 Port current (A).

:returns: Current of the USB C2 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a9", begin=4, end=6) / 10.0

@property
def usb_c2_power(self) -> float:
"""USB C2 Port power (W).

:returns: Power of the USB C2 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("a9", begin=6, end=8) / 10.0

@property
def usb_port_a1(self) -> PortStatus:
"""USB A1 Port Status.

:returns: Status of the USB A1 port.
"""
return PortStatus(self._parse_int("ac", begin=1, end=2))

@property
def usb_a1_voltage(self) -> float:
"""USB A1 Port voltage (V).

:returns: Voltage of the USB A1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("ac", begin=2, end=4) / 10.0

@property
def usb_a1_current(self) -> float:
"""USB A1 Port current (A).

:returns: Current of the USB A1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("ac", begin=4, end=6) / 10.0

@property
def usb_a1_power(self) -> float:
"""USB A1 Port power (W).

:returns: Power of the USB A1 port or default float value.
"""
if self._data is None:
return DEFAULT_METADATA_FLOAT

return self._parse_int("ac", begin=6, end=8) / 10.0
1 change: 1 addition & 0 deletions docs/source/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ the list of properties for that class.
solarbank3
prime_charger_160w
prime_charger_250w
prime_power_bank_20k
generic
enums
helpers
21 changes: 21 additions & 0 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ Parameter 250w (A2345) 160w (A2687)
Display status ❌ ❌
Total power out ❌ ❌
Port on/off control ❌ ✅
Port protocol control ❌ ❌
Timer control ❌ ✅
Individual port status ✅ ✅
Individual port voltage ✅ ✅
Expand All @@ -148,6 +149,26 @@ Serial number ❌ ❌
======================= ============= =============


Prime power bank support
------------------------

======================= =================
Parameter 20k/220w (A110B)
======================= =================
Battery percentage ✅
Display status ❌
Total power out ✅
Port on/off control ❌
Port protocol control ❌
Individual port status ✅
Individual port voltage ✅
Individual port current ✅
Individual port power ✅
Temperature ✅
Firmware version ❌
Serial number ❌
======================= =================


Contents
--------
Expand Down
9 changes: 9 additions & 0 deletions docs/source/prime_power_bank_20k.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Prime Power Bank 20k 220w
=========================

.. autoclass:: SolixBLE.PrimePowerBank20k
:members:
:inherited-members: connect, disconnect, add_callback, remove_callback, connected, available, address, name, supports_telemetry, last_update
:special-members: __init__
:member-order: groupwise
:no-index:
2 changes: 2 additions & 0 deletions examples/demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
Generic,
PrimeCharger160w,
PrimeCharger250w,
PrimePowerBank20k,
Solarbank2,
Solarbank3,
SolixBLEDevice,
Expand All @@ -42,6 +43,7 @@
"Solarbank 3": Solarbank3,
"PrimeCharger160w": PrimeCharger160w,
"PrimeCharger250w": PrimeCharger250w,
"Prime Power Bank 20k/220w": PrimePowerBank20k,
"Unknown": Generic,
}

Expand Down
Loading
Loading