diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc4795..ddb5eca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- add OTA start message counter - add message handler for over the air updates - add unit tests for ota messages - add unit test for int64 data type diff --git a/app/src/infos.py b/app/src/infos.py index 16a429f..ee7cae6 100644 --- a/app/src/infos.py +++ b/app/src/infos.py @@ -61,6 +61,7 @@ class Infos: 0xffffff03: {'name': ['proxy', 'Invalid_Data_Type'], 'singleton': True, 'ha': {'dev': 'proxy', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'inv_data_type_', 'fmt': '| int', 'name': 'Invalid Data Type', 'icon': 'mdi:counter', 'ent_cat': 'diagnostic'}}, # noqa: E501 0xffffff04: {'name': ['proxy', 'Internal_Error'], 'singleton': True, 'ha': {'dev': 'proxy', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'intern_err_', 'fmt': '| int', 'name': 'Internal Error', 'icon': 'mdi:counter', 'ent_cat': 'diagnostic', 'en': False}}, # noqa: E501 0xffffff05: {'name': ['proxy', 'Unknown_Ctrl'], 'singleton': True, 'ha': {'dev': 'proxy', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'unknown_ctrl_', 'fmt': '| int', 'name': 'Unknown Control Type', 'icon': 'mdi:counter', 'ent_cat': 'diagnostic'}}, # noqa: E501 + 0xffffff06: {'name': ['proxy', 'OTA_Start_Msg'], 'singleton': True, 'ha': {'dev': 'proxy', 'comp': 'sensor', 'dev_cla': None, 'stat_cla': None, 'id': 'ota_start_cmd_', 'fmt': '| int', 'name': 'OTA Start Cmd', 'icon': 'mdi:counter', 'ent_cat': 'diagnostic'}}, # noqa: E501 # 0xffffff03: {'name':['proxy', 'Voltage'], 'level': logging.DEBUG, 'unit': 'V', 'ha':{'dev':'proxy', 'dev_cla': 'voltage', 'stat_cla': 'measurement', 'id':'proxy_volt_', 'fmt':'| float','name': 'Grid Voltage'}}, # noqa: E501 # events @@ -262,7 +263,7 @@ class Infos: f"{via}") for key in ('mdl', 'mf', 'sw', 'hw'): # add optional - # values fpr 'modell', 'manufaturer', 'sw version' and + # values fpr 'modell', 'manufacturer', 'sw version' and # 'hw version' if key in device: data = self.dev_value(device[key]) diff --git a/app/src/messages.py b/app/src/messages.py index f369505..477d461 100644 --- a/app/src/messages.py +++ b/app/src/messages.py @@ -394,7 +394,7 @@ class Message(metaclass=IterRegistry): def msg_ota_update(self): if self.ctrl.is_req(): - pass + self.inc_counter('OTA_Start_Msg') elif self.ctrl.is_ind(): pass else: diff --git a/app/tests/test_infos.py b/app/tests/test_infos.py index 10809d3..d8c272e 100644 --- a/app/tests/test_infos.py +++ b/app/tests/test_infos.py @@ -408,13 +408,13 @@ def test_statistic_counter(): assert val == None or val == 0 i.static_init() # initialize counter - assert json.dumps(i.stat) == json.dumps({"proxy": {"Inverter_Cnt": 0, "Unknown_SNR": 0, "Unknown_Msg": 0, "Invalid_Data_Type": 0, "Internal_Error": 0,"Unknown_Ctrl": 0}}) + assert json.dumps(i.stat) == json.dumps({"proxy": {"Inverter_Cnt": 0, "Unknown_SNR": 0, "Unknown_Msg": 0, "Invalid_Data_Type": 0, "Internal_Error": 0,"Unknown_Ctrl": 0, "OTA_Start_Msg": 0}}) val = i.dev_value(0xffffff00) # valid and initiliazed addr assert val == 0 i.inc_counter('Inverter_Cnt') - assert json.dumps(i.stat) == json.dumps({"proxy": {"Inverter_Cnt": 1, "Unknown_SNR": 0, "Unknown_Msg": 0, "Invalid_Data_Type": 0, "Internal_Error": 0,"Unknown_Ctrl": 0}}) + assert json.dumps(i.stat) == json.dumps({"proxy": {"Inverter_Cnt": 1, "Unknown_SNR": 0, "Unknown_Msg": 0, "Invalid_Data_Type": 0, "Internal_Error": 0,"Unknown_Ctrl": 0, "OTA_Start_Msg": 0}}) val = i.dev_value(0xffffff00) assert val == 1 diff --git a/app/tests/test_messages.py b/app/tests/test_messages.py index 89c158c..2968a3d 100644 --- a/app/tests/test_messages.py +++ b/app/tests/test_messages.py @@ -572,6 +572,7 @@ def test_msg_ota_req(ConfigTsunInv1, MsgOtaReq): ConfigTsunInv1 m = MemoryStream(MsgOtaReq, (0,), False) m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.db.stat['proxy']['OTA_Start_Msg'] = 0 m.read() # read complete msg, and dispatch msg assert not m.header_valid # must be invalid, since msg was handled and buffer flushed assert m.msg_count == 1 @@ -584,6 +585,7 @@ def test_msg_ota_req(ConfigTsunInv1, MsgOtaReq): assert m._forward_buffer==MsgOtaReq assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 + assert m.db.stat['proxy']['OTA_Start_Msg'] == 1 m.close() def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck): @@ -592,6 +594,7 @@ def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck): m = MemoryStream(MsgOtaAck, (0,), False) m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.db.stat['proxy']['OTA_Start_Msg'] = 0 m.read() # read complete msg, and dispatch msg assert not m.header_valid # must be invalid, since msg was handled and buffer flushed assert m.msg_count == 1 @@ -604,12 +607,14 @@ def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck): assert m._forward_buffer==MsgOtaAck assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 + assert m.db.stat['proxy']['OTA_Start_Msg'] == 0 m.close() def test_msg_ota_invalid(ConfigTsunInv1, MsgOtaInvalid): ConfigTsunInv1 m = MemoryStream(MsgOtaInvalid, (0,), False) m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.db.stat['proxy']['OTA_Start_Msg'] = 0 m.read() # read complete msg, and dispatch msg assert not m.header_valid # must be invalid, since msg was handled and buffer flushed assert m.msg_count == 1 @@ -622,6 +627,7 @@ def test_msg_ota_invalid(ConfigTsunInv1, MsgOtaInvalid): assert m._forward_buffer==MsgOtaInvalid assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 1 + assert m.db.stat['proxy']['OTA_Start_Msg'] == 0 m.close() def test_msg_unknown(ConfigTsunInv1, MsgUnknown):