diff --git a/openevsehttp/__init__.py b/openevsehttp/__init__.py index 1b6b720..2045213 100644 --- a/openevsehttp/__init__.py +++ b/openevsehttp/__init__.py @@ -7,6 +7,7 @@ from typing import Any, Callable, Optional import aiohttp # type: ignore +from awesomeversion import AwesomeVersion from .const import MAX_AMPS, MIN_AMPS from .exceptions import ( @@ -346,6 +347,29 @@ async def set_charge_mode(self, mode: str = "fast") -> None: _LOGGER.error("Problem issuing command: %s", response["msg"]) raise UnknownError + async def divert_mode(self, mode: str = "Normal") -> None: + """Set the divert mode to either Normal or Eco modes.""" + url = f"{self.url}divertmode" + + if mode != "Normal" or mode != "Eco": + _LOGGER.error("Invalid value for divertmode: %s", mode) + raise ValueError + + if mode == "Normal": + value = 1 + else: + value = 2 + + data = {"divertmode": value} + + _LOGGER.debug("Setting charge mode to %s", mode) + response = await self.process_request( + url=url, method="post", data=data + ) # noqa: E501 + if response["msg"] != "done": + _LOGGER.error("Problem issuing command: %s", response["msg"]) + raise UnknownError + async def get_override(self) -> None: """Get the manual override status.""" url = f"{self.url}override" @@ -386,11 +410,25 @@ async def set_override( async def toggle_override(self) -> None: """Toggle the manual override status.""" - url = f"{self.url}override" + # TODO: Add version check (self._config["version"]) + # 3.x: use RAPI commands $FE (enable) and $FS (sleep) + # 4.x: use HTTP API call - _LOGGER.debug("Toggling manual override %s", url) - response = await self.process_request(url=url, method="patch") - _LOGGER.debug("Toggle response: %s", response["msg"]) + cutoff = AwesomeVersion("4.0.0") + current = AwesomeVersion(self._config["version"]) + + if cutoff < current: + url = f"{self.url}override" + + _LOGGER.debug("Toggling manual override %s", url) + response = await self.process_request(url=url, method="patch") + _LOGGER.debug("Toggle response: %s", response["msg"]) + else: + # Older firmware use RAPI commands + _LOGGER.debug("Toggling manual override via RAPI") + command = "$FE" if self._config["state"] == "sleeping" else "$FS" + response = await self.send_command(command) + _LOGGER.debug("Toggle response: %s", response[1]) async def clear_override(self) -> None: """Clear the manual override status.""" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c0152f4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +awesomeversion \ No newline at end of file diff --git a/requirements_lint.txt b/requirements_lint.txt index 3bfa91a..89852cd 100644 --- a/requirements_lint.txt +++ b/requirements_lint.txt @@ -1,3 +1,4 @@ +-r requirements.txt black==21.7b0 flake8==3.9.2 mypy==0.910 diff --git a/requirements_test.txt b/requirements_test.txt index 1a08932..5c8fdc5 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,3 +1,4 @@ +-r requirements.txt pytest==6.2.4 pytest-cov==2.12.1 pytest-timeout==1.4.2 diff --git a/tests/conftest.py b/tests/conftest.py index 9c08faa..1657270 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,12 +1,12 @@ """Provide common pytest fixtures.""" -import pytest import json +import pytest +from aioresponses import aioresponses + import openevsehttp from tests.common import load_fixture -from aioresponses import aioresponses - TEST_URL_STATUS = "http://openevse.test.tld/status" TEST_URL_CONFIG = "http://openevse.test.tld/config" TEST_URL_RAPI = "http://openevse.test.tld/r" diff --git a/tests/test_init.py b/tests/test_init.py index 3a303a0..6df057e 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,6 +1,8 @@ import asyncio import json + import pytest + import openevsehttp pytestmark = pytest.mark.asyncio