make all objects able to print their own values

This commit is contained in:
Hans Erik van Elburg 2020-05-12 23:45:16 +02:00
parent 9610fbc3c1
commit a0ce89054a
5 changed files with 51 additions and 4 deletions

View File

@ -1,5 +1,10 @@
Change Log Change Log
---------- ----------
**0.20** (2020-05-12)
- All objects can now print their values
- Add parser + object for generic profile
**0.19** (2020-05-03) **0.19** (2020-05-03)
- Add following missing elements to telegram specification v4: - Add following missing elements to telegram specification v4:
@ -45,7 +50,7 @@ Change Log
**0.10** (2017-06-05) **0.10** (2017-06-05)
- bugix: don't force full telegram signatures (`pull request #25 <https://github.com/ndokter/dsmr_parser/pull/25>`_) - bugfix: don't force full telegram signatures (`pull request #25 <https://github.com/ndokter/dsmr_parser/pull/25>`_)
- removed unused code for automatic telegram detection as this needs reworking after the fix mentioned above - removed unused code for automatic telegram detection as this needs reworking after the fix mentioned above
- InvalidChecksumError's are logged as warning instead of error - InvalidChecksumError's are logged as warning instead of error

View File

@ -1,4 +1,5 @@
import dsmr_parser.obis_name_mapping import dsmr_parser.obis_name_mapping
import datetime
class Telegram(object): class Telegram(object):
@ -48,7 +49,7 @@ class Telegram(object):
def __str__(self): def __str__(self):
output = "" output = ""
for attr, value in self: for attr, value in self:
output += "{}: \t {} \t[{}]\n".format(attr, str(value.value), str(value.unit)) output += "{}: \t {}\n".format(attr, str(value))
return output return output
@ -87,6 +88,10 @@ class MBusObject(DSMRObject):
else: else:
return self.values[1]['unit'] return self.values[1]['unit']
def __str__(self):
output = "{}\t[{}] at {}".format(str(self.value), str(self.unit), str(self.datetime.astimezone().isoformat()))
return output
class CosemObject(DSMRObject): class CosemObject(DSMRObject):
@ -98,6 +103,13 @@ class CosemObject(DSMRObject):
def unit(self): def unit(self):
return self.values[0]['unit'] return self.values[0]['unit']
def __str__(self):
print_value = self.value
if isinstance(self.value, datetime.datetime):
print_value = self.value.astimezone().isoformat()
output = "{}\t[{}]".format(str(print_value), str(self.unit))
return output
class ProfileGeneric(DSMRObject): class ProfileGeneric(DSMRObject):
pass # TODO implement pass # TODO implement

View File

@ -183,7 +183,7 @@ class CosemParser(DSMRObjectParser):
return CosemObject(self._parse(line)) return CosemObject(self._parse(line))
class ProfileGenericParser(DSMRObjectParser): class ProfileGenericParser(object):
""" """
Power failure log parser. Power failure log parser.
@ -205,6 +205,22 @@ class ProfileGenericParser(DSMRObjectParser):
9) Unit of buffer values (Unit of capture objects attribute) 9) Unit of buffer values (Unit of capture objects attribute)
""" """
def _parse(self, line):
# Match value groups, but exclude the parentheses. Adapted to also match OBIS code in 3rd position.
pattern = re.compile(r'((?<=\()[0-9a-zA-Z\.\*\-\:]{0,}(?=\)))')
values = re.findall(pattern, line)
# Convert empty value groups to None for clarity.
values = [None if value == '' else value for value in values]
buffer_length = int(values[0])
if (not values) or (len(values) != (buffer_length * 2 + 2)):
raise ParseError("Invalid '%s' line for '%s'", line, self)
return [self.value_formats[i].parse(value)
for i, value in enumerate(values)]
def parse(self, line): def parse(self, line):
raise NotImplementedError() raise NotImplementedError()

View File

@ -0,0 +1,14 @@
from dsmr_parser.parsers import ValueParser, MBusParser
from dsmr_parser.value_types import timestamp
FAILURE_EVENT = r'0-0\:96\.7\.19'
V4 = {
'objects': {
FAILURE_EVENT: MBusParser(
ValueParser(timestamp),
ValueParser(int)
)
}
}

View File

@ -6,7 +6,7 @@ setup(
author='Nigel Dokter', author='Nigel Dokter',
author_email='nigel@nldr.net', author_email='nigel@nldr.net',
url='https://github.com/ndokter/dsmr_parser', url='https://github.com/ndokter/dsmr_parser',
version='0.19', version='0.20',
packages=find_packages(), packages=find_packages(),
install_requires=[ install_requires=[
'pyserial>=3,<4', 'pyserial>=3,<4',