Skip to content

Commit fde9bd9

Browse files
authored
Replace openevse backend library (#160325)
1 parent e4db8ff commit fde9bd9

File tree

8 files changed

+55
-52
lines changed

8 files changed

+55
-52
lines changed

homeassistant/components/openevse/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22

33
from __future__ import annotations
44

5-
import openevsewifi
5+
from openevsehttp.__main__ import OpenEVSE
66

77
from homeassistant.config_entries import ConfigEntry
88
from homeassistant.const import CONF_HOST, Platform
99
from homeassistant.core import HomeAssistant
1010
from homeassistant.exceptions import ConfigEntryError
1111

12-
type OpenEVSEConfigEntry = ConfigEntry[openevsewifi.Charger]
12+
type OpenEVSEConfigEntry = ConfigEntry[OpenEVSE]
1313

1414

1515
async def async_setup_entry(hass: HomeAssistant, entry: OpenEVSEConfigEntry) -> bool:
1616
"""Set up openevse from a config entry."""
1717

18-
entry.runtime_data = openevsewifi.Charger(entry.data[CONF_HOST])
18+
entry.runtime_data = OpenEVSE(entry.data[CONF_HOST])
1919
try:
20-
await hass.async_add_executor_job(entry.runtime_data.getStatus)
21-
except AttributeError as ex:
20+
await entry.runtime_data.test_and_get()
21+
except TimeoutError as ex:
2222
raise ConfigEntryError("Unable to connect to charger") from ex
2323

2424
await hass.config_entries.async_forward_entry_setups(entry, [Platform.SENSOR])

homeassistant/components/openevse/config_flow.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Any
44

5-
import openevsewifi
5+
from openevsehttp.__main__ import OpenEVSE
66
import voluptuous as vol
77

88
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
@@ -20,13 +20,13 @@ class OpenEVSEConfigFlow(ConfigFlow, domain=DOMAIN):
2020
async def check_status(self, host: str) -> bool:
2121
"""Check if we can connect to the OpenEVSE charger."""
2222

23-
charger = openevsewifi.Charger(host)
23+
charger = OpenEVSE(host)
2424
try:
25-
result = await self.hass.async_add_executor_job(charger.getStatus)
26-
except AttributeError:
25+
await charger.test_and_get()
26+
except TimeoutError:
2727
return False
2828
else:
29-
return result is not None
29+
return True
3030

3131
async def async_step_user(
3232
self, user_input: dict[str, Any] | None = None

homeassistant/components/openevse/manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"documentation": "https://www.home-assistant.io/integrations/openevse",
77
"integration_type": "device",
88
"iot_class": "local_polling",
9-
"loggers": ["openevsewifi"],
9+
"loggers": ["openevsehttp"],
1010
"quality_scale": "legacy",
11-
"requirements": ["openevsewifi==1.1.2"]
11+
"requirements": ["python-openevse-http==0.2.1"]
1212
}

homeassistant/components/openevse/sensor.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
import logging
66

7-
import openevsewifi
8-
from requests import RequestException
7+
from openevsehttp.__main__ import OpenEVSE
98
import voluptuous as vol
109

1110
from homeassistant.components.sensor import (
@@ -175,33 +174,36 @@ class OpenEVSESensor(SensorEntity):
175174
def __init__(
176175
self,
177176
host: str,
178-
charger: openevsewifi.Charger,
177+
charger: OpenEVSE,
179178
description: SensorEntityDescription,
180179
) -> None:
181180
"""Initialize the sensor."""
182181
self.entity_description = description
183182
self.host = host
184183
self.charger = charger
185184

186-
def update(self) -> None:
185+
async def async_update(self) -> None:
187186
"""Get the monitored data from the charger."""
188187
try:
189-
sensor_type = self.entity_description.key
190-
if sensor_type == "status":
191-
self._attr_native_value = self.charger.getStatus()
192-
elif sensor_type == "charge_time":
193-
self._attr_native_value = self.charger.getChargeTimeElapsed() / 60
194-
elif sensor_type == "ambient_temp":
195-
self._attr_native_value = self.charger.getAmbientTemperature()
196-
elif sensor_type == "ir_temp":
197-
self._attr_native_value = self.charger.getIRTemperature()
198-
elif sensor_type == "rtc_temp":
199-
self._attr_native_value = self.charger.getRTCTemperature()
200-
elif sensor_type == "usage_session":
201-
self._attr_native_value = float(self.charger.getUsageSession()) / 1000
202-
elif sensor_type == "usage_total":
203-
self._attr_native_value = float(self.charger.getUsageTotal()) / 1000
204-
else:
205-
self._attr_native_value = "Unknown"
206-
except (RequestException, ValueError, KeyError):
188+
await self.charger.update()
189+
except TimeoutError:
207190
_LOGGER.warning("Could not update status for %s", self.name)
191+
return
192+
193+
sensor_type = self.entity_description.key
194+
if sensor_type == "status":
195+
self._attr_native_value = self.charger.status
196+
elif sensor_type == "charge_time":
197+
self._attr_native_value = self.charger.charge_time_elapsed / 60
198+
elif sensor_type == "ambient_temp":
199+
self._attr_native_value = self.charger.ambient_temperature
200+
elif sensor_type == "ir_temp":
201+
self._attr_native_value = self.charger.ir_temperature
202+
elif sensor_type == "rtc_temp":
203+
self._attr_native_value = self.charger.rtc_temperature
204+
elif sensor_type == "usage_session":
205+
self._attr_native_value = float(self.charger.usage_session) / 1000
206+
elif sensor_type == "usage_total":
207+
self._attr_native_value = float(self.charger.usage_total) / 1000
208+
else:
209+
self._attr_native_value = "Unknown"

requirements_all.txt

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

requirements_test_all.txt

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/components/openevse/conftest.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,23 @@ def mock_charger() -> Generator[MagicMock]:
1616
"""Create a mock OpenEVSE charger."""
1717
with (
1818
patch(
19-
"homeassistant.components.openevse.openevsewifi.Charger",
19+
"homeassistant.components.openevse.OpenEVSE",
2020
autospec=True,
2121
) as mock,
2222
patch(
23-
"homeassistant.components.openevse.config_flow.openevsewifi.Charger",
23+
"homeassistant.components.openevse.config_flow.OpenEVSE",
2424
new=mock,
2525
),
2626
):
2727
charger = mock.return_value
28-
charger.getStatus.return_value = "Charging"
29-
charger.getChargeTimeElapsed.return_value = 3600 # 60 minutes in seconds
30-
charger.getAmbientTemperature.return_value = 25.5
31-
charger.getIRTemperature.return_value = 30.2
32-
charger.getRTCTemperature.return_value = 28.7
33-
charger.getUsageSession.return_value = 15000 # 15 kWh in Wh
34-
charger.getUsageTotal.return_value = 500000 # 500 kWh in Wh
28+
charger.update = AsyncMock()
29+
charger.status = "Charging"
30+
charger.charge_time_elapsed = 3600 # 60 minutes in seconds
31+
charger.ambient_temperature = 25.5
32+
charger.ir_temperature = 30.2
33+
charger.rtc_temperature = 28.7
34+
charger.usage_session = 15000 # 15 kWh in Wh
35+
charger.usage_total = 500000 # 500 kWh in Wh
3536
charger.charging_current = 32.0
3637
yield charger
3738

tests/components/openevse/test_config_flow.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async def test_user_flow_flaky(
4545
)
4646
assert result["type"] is FlowResultType.FORM
4747
assert result["step_id"] == "user"
48-
mock_charger.getStatus.side_effect = AttributeError
48+
mock_charger.test_and_get.side_effect = TimeoutError
4949
result = await hass.config_entries.flow.async_configure(
5050
result["flow_id"],
5151
{CONF_HOST: "10.0.0.131"},
@@ -54,7 +54,7 @@ async def test_user_flow_flaky(
5454
assert result["step_id"] == "user"
5555
assert result["errors"] == {"host": "cannot_connect"}
5656

57-
mock_charger.getStatus.side_effect = "Charging"
57+
mock_charger.test_and_get.side_effect = None
5858
result = await hass.config_entries.flow.async_configure(
5959
result["flow_id"],
6060
{CONF_HOST: "10.0.0.131"},
@@ -112,7 +112,7 @@ async def test_import_flow_bad(
112112
mock_setup_entry: AsyncMock,
113113
) -> None:
114114
"""Test import flow with bad charger."""
115-
mock_charger.getStatus.side_effect = AttributeError
115+
mock_charger.test_and_get.side_effect = TimeoutError
116116

117117
result = await hass.config_entries.flow.async_init(
118118
DOMAIN, context={"source": SOURCE_IMPORT}, data={CONF_HOST: "10.0.0.131"}

0 commit comments

Comments
 (0)