Skip to content

Commit 12cce62

Browse files
authored
feat: support more api features
2 parents 24b2f10 + c09df5c commit 12cce62

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

openevsehttp/__init__.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@ def _update_status(self, msgtype, data, error):
360360
_LOGGER.debug("ws_data: %s", data)
361361
if "wh" in data.keys():
362362
data["watthour"] = data.pop("wh")
363+
elif "config_version" in data.keys():
364+
self.update()
363365
self._status.update(data)
364366

365367
if self.callback is not None:
@@ -922,6 +924,57 @@ def charging_power(self) -> float | None:
922924
return round(self._status["voltage"] * self._status["amp"], 2)
923925
return None
924926

927+
@property
928+
def shaper_active(self) -> bool | None:
929+
"""Return if shper is active."""
930+
if self._status is not None and "shaper" in self._status:
931+
return bool(self._status["shaper"])
932+
return None
933+
934+
@property
935+
def shaper_live_power(self) -> int | None:
936+
"""Return shaper live power reading."""
937+
if self._status is not None and "shaper_live_pwr" in self._status:
938+
return self._status["shaper_live_pwr"]
939+
return None
940+
941+
@property
942+
def shaper_current_power(self) -> int | None:
943+
"""Return shaper live power reading."""
944+
if self._status is not None and "shaper_cur" in self._status:
945+
if self._status["shaper_cur"] == 255:
946+
return self._status["pilot"]
947+
return self._status["shaper_cur"]
948+
return None
949+
950+
@property
951+
def shaper_max_power(self) -> int | None:
952+
"""Return shaper live power reading."""
953+
if self._status is not None and "shaper_max_pwr" in self._status:
954+
return self._status["shaper_max_pwr"]
955+
return None
956+
957+
@property
958+
def vehicle_soc(self) -> int | None:
959+
"""Return battery level."""
960+
if self._status is not None and "vehicle_soc" in self._status:
961+
return self._status["vehicle_soc"]
962+
return None
963+
964+
@property
965+
def vehicle_range(self) -> int | None:
966+
"""Return battery range."""
967+
if self._status is not None and "vehicle_range" in self._status:
968+
return self._status["vehicle_range"]
969+
return None
970+
971+
@property
972+
def vehicle_eta(self) -> int | None:
973+
"""Return tiem to full charge."""
974+
if self._status is not None and "vehicle_eta" in self._status:
975+
return self._status["vehicle_eta"]
976+
return None
977+
925978
# There is currently no min/max amps JSON data
926979
# available via HTTP API methods
927980
@property

tests/fixtures/v4_json/status.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,12 @@
4141
"divert_update": 11,
4242
"ota_update": 0,
4343
"time": "2021-08-10T23:00:11Z",
44-
"offset": "-0700"
44+
"offset": "-0700",
45+
"shaper": 1,
46+
"shaper_live_pwr": 2299,
47+
"shaper_max_pwr": 4000,
48+
"shaper_cur": 21,
49+
"vehicle_soc": "75%",
50+
"vehicle_range": "468KM",
51+
"vehicle_eta": 18000
4552
}

tests/test_init.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,3 +823,80 @@ async def test_evse_restart(test_charger_v2, mock_aioclient, caplog):
823823
with caplog.at_level(logging.DEBUG):
824824
await test_charger_v2.restart_evse()
825825
assert "EVSE Restart response: $OK^20" in caplog.text
826+
827+
828+
@pytest.mark.parametrize(
829+
"fixture, expected", [("test_charger", True), ("test_charger_v2", None)]
830+
)
831+
async def test_shaper_active(fixture, expected, request):
832+
"""Test shaper_active reply."""
833+
charger = request.getfixturevalue(fixture)
834+
await charger.update()
835+
status = charger.shaper_active
836+
assert status == expected
837+
838+
839+
@pytest.mark.parametrize(
840+
"fixture, expected", [("test_charger", 2299), ("test_charger_v2", None)]
841+
)
842+
async def test_shaper_live_power(fixture, expected, request):
843+
"""Test shaper_live_power reply."""
844+
charger = request.getfixturevalue(fixture)
845+
await charger.update()
846+
status = charger.shaper_live_power
847+
assert status == expected
848+
849+
850+
@pytest.mark.parametrize(
851+
"fixture, expected", [("test_charger", 21), ("test_charger_v2", None)]
852+
)
853+
async def test_shaper_current_power(fixture, expected, request):
854+
"""Test shaper_current_power reply."""
855+
charger = request.getfixturevalue(fixture)
856+
await charger.update()
857+
status = charger.shaper_current_power
858+
assert status == expected
859+
860+
861+
@pytest.mark.parametrize(
862+
"fixture, expected", [("test_charger", 4000), ("test_charger_v2", None)]
863+
)
864+
async def test_shaper_max_power(fixture, expected, request):
865+
"""Test shaper_max_power reply."""
866+
charger = request.getfixturevalue(fixture)
867+
await charger.update()
868+
status = charger.shaper_max_power
869+
assert status == expected
870+
871+
872+
@pytest.mark.parametrize(
873+
"fixture, expected", [("test_charger", "75%"), ("test_charger_v2", None)]
874+
)
875+
async def test_vehicle_soc(fixture, expected, request):
876+
"""Test vehicle_soc reply."""
877+
charger = request.getfixturevalue(fixture)
878+
await charger.update()
879+
status = charger.vehicle_soc
880+
assert status == expected
881+
882+
883+
@pytest.mark.parametrize(
884+
"fixture, expected", [("test_charger", "468KM"), ("test_charger_v2", None)]
885+
)
886+
async def test_vehicle_range(fixture, expected, request):
887+
"""Test vehicle_range reply."""
888+
charger = request.getfixturevalue(fixture)
889+
await charger.update()
890+
status = charger.vehicle_range
891+
assert status == expected
892+
893+
894+
@pytest.mark.parametrize(
895+
"fixture, expected", [("test_charger", 18000), ("test_charger_v2", None)]
896+
)
897+
async def test_vehicle_eta(fixture, expected, request):
898+
"""Test vehicle_eta reply."""
899+
charger = request.getfixturevalue(fixture)
900+
await charger.update()
901+
status = charger.vehicle_eta
902+
assert status == expected

0 commit comments

Comments
 (0)