Skip to content

Commit af1055e

Browse files
authored
fix: filter firmware strings (#298)
* fix: filter firmware strings * missing index * linting * define variable for use * more linting * update tests * formatting
1 parent 50df652 commit af1055e

File tree

4 files changed

+127
-28
lines changed

4 files changed

+127
-28
lines changed

openevsehttp/__main__.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import datetime
66
import json
77
import logging
8+
import re
89
from typing import Any, Callable, Dict, Union
910

1011
import aiohttp # type: ignore
@@ -120,7 +121,11 @@ async def process_request(
120121
_LOGGER.warning("Non JSON response: %s", message)
121122

122123
if resp.status == 400:
123-
_LOGGER.error("Error 400: %s", message["msg"])
124+
if "msg" in message.keys():
125+
index = "msg"
126+
elif "error" in message.keys():
127+
index = "error"
128+
_LOGGER.error("Error 400: %s", message[index])
124129
raise ParseJSONError
125130
if resp.status == 401:
126131
_LOGGER.error("Authentication error: %s", message)
@@ -552,7 +557,16 @@ def _version_check(self, min_version: str, max_version: str = "") -> bool:
552557
if max_version != "":
553558
limit = AwesomeVersion(max_version)
554559

560+
firmware_filtered = None
561+
562+
try:
563+
firmware_search = re.search("\\d\\.\\d\\.\\d", self._config["version"])
564+
if firmware_search is not None:
565+
firmware_filtered = firmware_search[0]
566+
except Exception: # pylint: disable=broad-exception-caught
567+
_LOGGER.warning("Non-standard versioning string.")
555568
_LOGGER.debug("Detected firmware: %s", self._config["version"])
569+
_LOGGER.debug("Filtered firmware: %s", firmware_filtered)
556570

557571
if "dev" in self._config["version"]:
558572
value = self._config["version"]
@@ -562,7 +576,7 @@ def _version_check(self, min_version: str, max_version: str = "") -> bool:
562576
elif "master" in self._config["version"]:
563577
value = "dev"
564578
else:
565-
value = self._config["version"]
579+
value = firmware_filtered
566580

567581
current = AwesomeVersion(value)
568582

tests/conftest.py

+16
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,22 @@ def test_charger_unknown_semver(mock_aioclient):
139139
return main.OpenEVSE(TEST_TLD)
140140

141141

142+
@pytest.fixture(name="test_charger_modified_ver")
143+
def test_charger_modified_ver(mock_aioclient):
144+
"""Load the charger data."""
145+
mock_aioclient.get(
146+
TEST_URL_STATUS,
147+
status=200,
148+
body=load_fixture("v4_json/status.json"),
149+
)
150+
mock_aioclient.get(
151+
TEST_URL_CONFIG,
152+
status=200,
153+
body=load_fixture("v4_json/config-extra-version.json"),
154+
)
155+
return main.OpenEVSE(TEST_TLD)
156+
157+
142158
@pytest.fixture(name="test_charger_v2")
143159
def test_charger_v2(mock_aioclient):
144160
"""Load the charger data."""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
{
2+
"firmware": "7.1.3",
3+
"protocol": "-",
4+
"espflash": 4194304,
5+
"wifi_serial": "1234567890AB",
6+
"version": "v5.0.1_modified",
7+
"diodet": 0,
8+
"gfcit": 0,
9+
"groundt": 0,
10+
"relayt": 0,
11+
"ventt": 0,
12+
"tempt": 0,
13+
"service": 2,
14+
"scale": 220,
15+
"offset": 0,
16+
"max_current_soft": 48,
17+
"min_current_hard": 6,
18+
"max_current_hard": 48,
19+
"mqtt_supported_protocols": [
20+
"mqtt",
21+
"mqtts"
22+
],
23+
"http_supported_protocols": [
24+
"http",
25+
"https"
26+
],
27+
"ssid": "Datanode-IoT",
28+
"pass": "_DUMMY_PASSWORD",
29+
"www_username": "",
30+
"www_password": "",
31+
"hostname": "openevse-7b2c",
32+
"sntp_hostname": "0.us.pool.ntp.org",
33+
"time_zone": "America/Phoenix|MST7",
34+
"emoncms_server": "https://emoncms.collective.lan/",
35+
"emoncms_node": "openevse",
36+
"emoncms_apikey": "_DUMMY_PASSWORD",
37+
"emoncms_fingerprint": "",
38+
"mqtt_server": "192.168.1.198",
39+
"mqtt_port": 1883,
40+
"mqtt_topic": "openevse",
41+
"mqtt_user": "devices",
42+
"mqtt_pass": "_DUMMY_PASSWORD",
43+
"mqtt_solar": "",
44+
"mqtt_grid_ie": "home-assistant/power/watts",
45+
"mqtt_vrms": "home-assistant/solar/watts",
46+
"mqtt_announce_topic": "openevse/announce/7b2c",
47+
"ohm": "",
48+
"divert_PV_ratio": 1.1,
49+
"divert_attack_smoothing_factor": 0.4,
50+
"divert_decay_smoothing_factor": 0.05,
51+
"divert_min_charge_time": 600,
52+
"tesla_username": "",
53+
"tesla_password": "",
54+
"tesla_vehidx": -1,
55+
"led_brightness": 128,
56+
"flags": 522,
57+
"emoncms_enabled": false,
58+
"mqtt_enabled": true,
59+
"mqtt_reject_unauthorized": true,
60+
"ohm_enabled": false,
61+
"sntp_enabled": true,
62+
"tesla_enabled": false,
63+
"pause_uses_disabled": false,
64+
"mqtt_protocol": "mqtt",
65+
"charge_mode": "fast"
66+
}

tests/test_main.py

+29-26
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ async def test_toggle_override(
647647
test_charger,
648648
test_charger_dev,
649649
test_charger_new,
650-
test_charger_unknown_semver,
650+
test_charger_modified_ver,
651651
mock_aioclient,
652652
caplog,
653653
):
@@ -657,17 +657,19 @@ async def test_toggle_override(
657657
TEST_URL_OVERRIDE,
658658
status=200,
659659
body="OK",
660+
repeat=True,
661+
)
662+
mock_aioclient.post(
663+
TEST_URL_OVERRIDE,
664+
status=200,
665+
body='{"msg": "OK"}',
666+
repeat=True,
660667
)
661668
with caplog.at_level(logging.DEBUG):
662669
await test_charger.toggle_override()
663670
assert "Toggling manual override http" in caplog.text
664671

665672
await test_charger_dev.update()
666-
mock_aioclient.patch(
667-
TEST_URL_OVERRIDE,
668-
status=200,
669-
body="OK",
670-
)
671673
with caplog.at_level(logging.DEBUG):
672674
await test_charger_dev.toggle_override()
673675
assert "Stripping 'dev' from version." in caplog.text
@@ -687,18 +689,7 @@ async def test_toggle_override(
687689
body=json.dumps(value),
688690
)
689691

690-
mock_aioclient.post(
691-
TEST_URL_OVERRIDE,
692-
status=200,
693-
body='{"msg": "OK"}',
694-
)
695-
696692
await test_charger_new.update()
697-
mock_aioclient.patch(
698-
TEST_URL_OVERRIDE,
699-
status=200,
700-
body="OK",
701-
)
702693
with caplog.at_level(logging.DEBUG):
703694
await test_charger_new.toggle_override()
704695
assert "Toggling manual override http" in caplog.text
@@ -716,19 +707,31 @@ async def test_toggle_override(
716707
status=200,
717708
body=json.dumps(value),
718709
)
719-
mock_aioclient.post(
720-
TEST_URL_OVERRIDE,
721-
status=200,
722-
body='{"msg": "OK"}',
723-
)
724-
mock_aioclient.patch(
710+
711+
with caplog.at_level(logging.DEBUG):
712+
await test_charger_new.toggle_override()
713+
assert "Toggling manual override http" in caplog.text
714+
715+
await test_charger_modified_ver.update()
716+
717+
value = {
718+
"state": "disabled",
719+
"charge_current": 0,
720+
"max_current": 0,
721+
"energy_limit": 0,
722+
"time_limit": 0,
723+
"auto_release": True,
724+
}
725+
mock_aioclient.get(
725726
TEST_URL_OVERRIDE,
726727
status=200,
727-
body="OK",
728+
body=json.dumps(value),
728729
)
730+
729731
with caplog.at_level(logging.DEBUG):
730-
await test_charger_new.toggle_override()
731-
assert "Toggling manual override http" in caplog.text
732+
await test_charger_modified_ver.toggle_override()
733+
assert "Detected firmware: v5.0.1_modified" in caplog.text
734+
assert "Filtered firmware: 5.0.1" in caplog.text
732735

733736

734737
async def test_toggle_override_v2(test_charger_v2, mock_aioclient, caplog):

0 commit comments

Comments
 (0)