ProfileGeneric parser working, ProfileGenericObject implemented and Test for V4 telegram completed.
This commit is contained in:
parent
b6278a8991
commit
789871899c
@ -112,6 +112,41 @@ class CosemObject(DSMRObject):
|
|||||||
|
|
||||||
|
|
||||||
class ProfileGenericObject(DSMRObject):
|
class ProfileGenericObject(DSMRObject):
|
||||||
|
"""
|
||||||
|
Represents all data in a GenericProfile value.
|
||||||
|
All buffer values are returned as a list of MBusObjects,
|
||||||
|
containing the datetime (timestamp) and the value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, values):
|
||||||
|
super().__init__(values)
|
||||||
|
self._buffer_list = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def buffer_length(self):
|
||||||
|
return self.values[0]['value']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def buffer_type(self):
|
||||||
|
return self.values[1]['value']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def buffer(self):
|
||||||
|
if self._buffer_list is None:
|
||||||
|
self._buffer_list = []
|
||||||
|
values_offset = 2
|
||||||
|
for i in range(self.buffer_length):
|
||||||
|
offset = values_offset + i*2
|
||||||
|
self._buffer_list.append(MBusObject([self.values[offset], self.values[offset + 1]]))
|
||||||
|
return self._buffer_list
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
output = "{}".format(self.values)
|
output = "\t buffer length: {}\n".format(self.buffer_length)
|
||||||
|
output += "\t buffer type: {}".format(self.buffer_type)
|
||||||
|
for buffer_value in self.buffer:
|
||||||
|
timestamp = buffer_value.datetime
|
||||||
|
if isinstance(timestamp, datetime.datetime):
|
||||||
|
timestamp = str(timestamp.astimezone().isoformat())
|
||||||
|
output += "\n\t event occured at: {}".format(timestamp)
|
||||||
|
output += "\t for: {} [{}]".format(buffer_value.value, buffer_value.unit)
|
||||||
return output
|
return output
|
||||||
|
@ -107,7 +107,10 @@ V5 = {
|
|||||||
obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)),
|
obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)),
|
||||||
obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)),
|
obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)),
|
||||||
obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)),
|
obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)),
|
||||||
# POWER_EVENT_FAILURE_LOG: ProfileGenericParser(), TODO
|
obis.POWER_EVENT_FAILURE_LOG:
|
||||||
|
ProfileGenericParser(BUFFER_TYPES,
|
||||||
|
PG_HEAD_PARSERS,
|
||||||
|
PG_UNIDENTIFIED_BUFFERTYPE_PARSERS),
|
||||||
obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)),
|
obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)),
|
||||||
obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)),
|
obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)),
|
||||||
obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)),
|
obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)),
|
||||||
|
@ -287,14 +287,30 @@ class TelegramTest(unittest.TestCase):
|
|||||||
unit_val='m3',
|
unit_val='m3',
|
||||||
value_type=Decimal,
|
value_type=Decimal,
|
||||||
value_val=Decimal('981.443'))
|
value_val=Decimal('981.443'))
|
||||||
|
|
||||||
# POWER_EVENT_FAILURE_LOG (1-0:99.97.0)
|
# POWER_EVENT_FAILURE_LOG (1-0:99.97.0)
|
||||||
testitem_name = 'POWER_EVENT_FAILURE_LOG'
|
testitem_name = 'POWER_EVENT_FAILURE_LOG'
|
||||||
object_type = ProfileGenericObject
|
object_type = ProfileGenericObject
|
||||||
testitem = eval("telegram.{}".format(testitem_name))
|
testitem = eval("telegram.{}".format(testitem_name))
|
||||||
assert isinstance(testitem, object_type)
|
assert isinstance(testitem, object_type)
|
||||||
# assert testitem.unit == unit_val
|
assert testitem.buffer_length == 3
|
||||||
# assert isinstance(testitem.value, value_type)
|
assert testitem.buffer_type == '0-0:96.7.19'
|
||||||
# assert testitem.value == value_val
|
buffer = testitem.buffer
|
||||||
|
assert isinstance(testitem.buffer, list)
|
||||||
|
assert len(buffer) == 3
|
||||||
|
assert all([isinstance(item, MBusObject) for item in buffer])
|
||||||
|
date0 = datetime.datetime(2000, 1, 4, 17, 3, 20, tzinfo=datetime.timezone.utc)
|
||||||
|
date1 = datetime.datetime(1999, 12, 31, 23, 0, 1, tzinfo=datetime.timezone.utc)
|
||||||
|
date2 = datetime.datetime(2000, 1, 1, 23, 0, 3, tzinfo=datetime.timezone.utc)
|
||||||
|
assert buffer[0].datetime == date0
|
||||||
|
assert buffer[1].datetime == date1
|
||||||
|
assert buffer[2].datetime == date2
|
||||||
|
assert buffer[0].value == 237126
|
||||||
|
assert buffer[1].value == 2147583646
|
||||||
|
assert buffer[2].value == 2317482647
|
||||||
|
assert all([isinstance(item.value, int) for item in buffer])
|
||||||
|
assert all([isinstance(item.unit, str) for item in buffer])
|
||||||
|
assert all([(item.unit == 's') for item in buffer])
|
||||||
self.item_names_tested.append(testitem_name)
|
self.item_names_tested.append(testitem_name)
|
||||||
|
|
||||||
# check if all items in telegram V4 specification are covered
|
# check if all items in telegram V4 specification are covered
|
||||||
|
Loading…
Reference in New Issue
Block a user