Merge branch 'main' of https://github.com/s-allius/tsun-gen3-proxy into main
This commit is contained in:
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- add OTA start message counter
|
||||||
- add message handler for over the air updates
|
- add message handler for over the air updates
|
||||||
- add unit tests for ota messages
|
- add unit tests for ota messages
|
||||||
- add unit test for int64 data type
|
- add unit test for int64 data type
|
||||||
|
|||||||
@@ -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
|
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
|
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
|
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
|
# 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
|
# events
|
||||||
@@ -262,7 +263,7 @@ class Infos:
|
|||||||
f"{via}")
|
f"{via}")
|
||||||
|
|
||||||
for key in ('mdl', 'mf', 'sw', 'hw'): # add optional
|
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'
|
# 'hw version'
|
||||||
if key in device:
|
if key in device:
|
||||||
data = self.dev_value(device[key])
|
data = self.dev_value(device[key])
|
||||||
|
|||||||
@@ -394,7 +394,7 @@ class Message(metaclass=IterRegistry):
|
|||||||
|
|
||||||
def msg_ota_update(self):
|
def msg_ota_update(self):
|
||||||
if self.ctrl.is_req():
|
if self.ctrl.is_req():
|
||||||
pass
|
self.inc_counter('OTA_Start_Msg')
|
||||||
elif self.ctrl.is_ind():
|
elif self.ctrl.is_ind():
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -408,13 +408,13 @@ def test_statistic_counter():
|
|||||||
assert val == None or val == 0
|
assert val == None or val == 0
|
||||||
|
|
||||||
i.static_init() # initialize counter
|
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
|
val = i.dev_value(0xffffff00) # valid and initiliazed addr
|
||||||
assert val == 0
|
assert val == 0
|
||||||
|
|
||||||
i.inc_counter('Inverter_Cnt')
|
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)
|
val = i.dev_value(0xffffff00)
|
||||||
assert val == 1
|
assert val == 1
|
||||||
|
|
||||||
|
|||||||
@@ -572,6 +572,7 @@ def test_msg_ota_req(ConfigTsunInv1, MsgOtaReq):
|
|||||||
ConfigTsunInv1
|
ConfigTsunInv1
|
||||||
m = MemoryStream(MsgOtaReq, (0,), False)
|
m = MemoryStream(MsgOtaReq, (0,), False)
|
||||||
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
||||||
|
m.db.stat['proxy']['OTA_Start_Msg'] = 0
|
||||||
m.read() # read complete msg, and dispatch msg
|
m.read() # read complete msg, and dispatch msg
|
||||||
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
||||||
assert m.msg_count == 1
|
assert m.msg_count == 1
|
||||||
@@ -584,6 +585,7 @@ def test_msg_ota_req(ConfigTsunInv1, MsgOtaReq):
|
|||||||
assert m._forward_buffer==MsgOtaReq
|
assert m._forward_buffer==MsgOtaReq
|
||||||
assert m._send_buffer==b''
|
assert m._send_buffer==b''
|
||||||
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
|
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
|
||||||
|
assert m.db.stat['proxy']['OTA_Start_Msg'] == 1
|
||||||
m.close()
|
m.close()
|
||||||
|
|
||||||
def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck):
|
def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck):
|
||||||
@@ -592,6 +594,7 @@ def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck):
|
|||||||
|
|
||||||
m = MemoryStream(MsgOtaAck, (0,), False)
|
m = MemoryStream(MsgOtaAck, (0,), False)
|
||||||
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
||||||
|
m.db.stat['proxy']['OTA_Start_Msg'] = 0
|
||||||
m.read() # read complete msg, and dispatch msg
|
m.read() # read complete msg, and dispatch msg
|
||||||
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
||||||
assert m.msg_count == 1
|
assert m.msg_count == 1
|
||||||
@@ -604,12 +607,14 @@ def test_msg_ota_ack(ConfigTsunInv1, MsgOtaAck):
|
|||||||
assert m._forward_buffer==MsgOtaAck
|
assert m._forward_buffer==MsgOtaAck
|
||||||
assert m._send_buffer==b''
|
assert m._send_buffer==b''
|
||||||
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
|
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
|
||||||
|
assert m.db.stat['proxy']['OTA_Start_Msg'] == 0
|
||||||
m.close()
|
m.close()
|
||||||
|
|
||||||
def test_msg_ota_invalid(ConfigTsunInv1, MsgOtaInvalid):
|
def test_msg_ota_invalid(ConfigTsunInv1, MsgOtaInvalid):
|
||||||
ConfigTsunInv1
|
ConfigTsunInv1
|
||||||
m = MemoryStream(MsgOtaInvalid, (0,), False)
|
m = MemoryStream(MsgOtaInvalid, (0,), False)
|
||||||
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
||||||
|
m.db.stat['proxy']['OTA_Start_Msg'] = 0
|
||||||
m.read() # read complete msg, and dispatch msg
|
m.read() # read complete msg, and dispatch msg
|
||||||
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
||||||
assert m.msg_count == 1
|
assert m.msg_count == 1
|
||||||
@@ -622,6 +627,7 @@ def test_msg_ota_invalid(ConfigTsunInv1, MsgOtaInvalid):
|
|||||||
assert m._forward_buffer==MsgOtaInvalid
|
assert m._forward_buffer==MsgOtaInvalid
|
||||||
assert m._send_buffer==b''
|
assert m._send_buffer==b''
|
||||||
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
|
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
|
||||||
|
assert m.db.stat['proxy']['OTA_Start_Msg'] == 0
|
||||||
m.close()
|
m.close()
|
||||||
|
|
||||||
def test_msg_unknown(ConfigTsunInv1, MsgUnknown):
|
def test_msg_unknown(ConfigTsunInv1, MsgUnknown):
|
||||||
|
|||||||
Reference in New Issue
Block a user