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
22 changes: 22 additions & 0 deletions openevsehttp/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -696,3 +696,25 @@ async def set_mqtt_vehicle_range_miles(self, enable: bool = True) -> None:
if msg not in SUCCESS_ANSWERS:
_LOGGER.error("Problem issuing command: %s", response)
raise CommandFailedError(f"Problem issuing command: {response}")

async def set_rfid_enabled(self, enable: bool = True) -> None:
"""Enable or disable RFID access."""
if not self._version_check("4.1.4"):
_LOGGER.debug("Feature not supported for older firmware.")
raise UnsupportedFeature

if not isinstance(enable, bool):
raise TypeError("Value must be a boolean.")

url = f"{self.url}config"
data = {"rfid_enabled": enable}

_LOGGER.debug("Setting rfid_enabled to %s", enable)
response = await self.process_request(url=url, method="post", data=data)
response = self._normalize_response(response)
msg = response.get("msg") if isinstance(response, Mapping) else None
if msg not in SUCCESS_ANSWERS:
_LOGGER.error("Problem issuing command: %s", response)
raise CommandFailedError(f"Problem issuing command: {response}")

self._config["rfid_enabled"] = enable
8 changes: 8 additions & 0 deletions openevsehttp/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,3 +568,11 @@ def current_power(self) -> int:
_LOGGER.debug("Feature not supported for older firmware.")
raise UnsupportedFeature
return int(self._status.get("power", 0))

@property
def rfid_enabled(self) -> bool | None:
"""Return charger RFID enabled state."""
if not self._version_check("4.1.4"):
_LOGGER.debug("Feature not supported for older firmware.")
raise UnsupportedFeature
return self._config.get("rfid_enabled")
40 changes: 40 additions & 0 deletions tests/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -1375,3 +1375,43 @@ async def test_set_mqtt_vehicle_range_miles(test_charger_new, mock_aioclient, ca
)
with pytest.raises(CommandFailedError):
await test_charger_new.set_mqtt_vehicle_range_miles(True)


async def test_set_rfid_enabled(test_charger, test_charger_new, mock_aioclient, caplog):
"""Test set_rfid_enabled command."""
# Version gate check on older firmware
await test_charger.update()
with pytest.raises(UnsupportedFeature):
await test_charger.set_rfid_enabled(True)

await test_charger_new.update()
mock_aioclient.post(
TEST_URL_CONFIG,
status=200,
body='{"msg": "OK"}',
)
with caplog.at_level(logging.DEBUG):
await test_charger_new.set_rfid_enabled(True)
assert "Setting rfid_enabled to True" in caplog.text
assert test_charger_new._config["rfid_enabled"] is True

mock_aioclient.post(
TEST_URL_CONFIG,
status=200,
body='{"msg": "OK"}',
)
with caplog.at_level(logging.DEBUG):
await test_charger_new.set_rfid_enabled(False)
assert "Setting rfid_enabled to False" in caplog.text
assert test_charger_new._config["rfid_enabled"] is False

with pytest.raises(TypeError, match=r"Value must be a boolean\."):
await test_charger_new.set_rfid_enabled("invalid") # type: ignore[arg-type]

mock_aioclient.post(
TEST_URL_CONFIG,
status=200,
body='{"msg": "error"}',
)
with pytest.raises(CommandFailedError):
await test_charger_new.set_rfid_enabled(True)
23 changes: 23 additions & 0 deletions tests/test_properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@
("test_charger_v2", "current_power", UnsupportedFeature),
("test_charger_broken", "current_power", UnsupportedFeature),
("test_charger_new", "current_power", 4500),
# RFID
("test_charger", "rfid_enabled", UnsupportedFeature),
("test_charger_v2", "rfid_enabled", UnsupportedFeature),
("test_charger_new", "rfid_enabled", False),
],
)
async def test_simple_properties(fixture, prop, expected, request):
Expand Down Expand Up @@ -516,3 +520,22 @@ async def test_mqtt_vehicle_range_miles():
with pytest.deprecated_call():
assert charger.vehicle_range == 150
assert charger.vehicle_range_with_unit == (150, "km")


async def test_rfid_enabled_property():
"""Test rfid_enabled property."""
charger = OpenEVSE(SERVER_URL)
# Older firmware raises UnsupportedFeature
charger._config = {"version": "4.1.2", "rfid_enabled": True}
with pytest.raises(UnsupportedFeature):
_ = charger.rfid_enabled

# Supported firmware >= 4.1.4
charger._config = {"version": "4.1.4", "rfid_enabled": True}
assert charger.rfid_enabled is True

charger._config = {"version": "4.1.4", "rfid_enabled": False}
assert charger.rfid_enabled is False

charger._config = {"version": "4.1.4"}
assert charger.rfid_enabled is None
Loading