Add test and exceptions for V2_2 implementation.

This commit is contained in:
Johan Bloemberg
2016-11-07 20:00:10 +01:00
parent 4a82066144
commit 447f2a24fb
5 changed files with 92 additions and 7 deletions

View File

@@ -19,6 +19,21 @@ class MBusObject(DSMRObject):
return self.values[1]['unit']
class MBusObjectV2_2(DSMRObject):
@property
def datetime(self):
return self.values[0]['value']
@property
def value(self):
return self.values[5]['value']
@property
def unit(self):
return self.values[4]['unit']
class CosemObject(DSMRObject):
@property

View File

@@ -1,9 +1,9 @@
import logging
import re
from .objects import MBusObject, CosemObject
from .objects import MBusObject, MBusObjectV2_2, CosemObject
from .exceptions import ParseError
from .obis_references import GAS_METER_READING
logger = logging.getLogger(__name__)
@@ -29,7 +29,7 @@ class TelegramParser(object):
telegram = {}
for line_value in line_values:
obis_reference, dsmr_object = self.parse_line(line_value)
obis_reference, dsmr_object = self.parse_line(line_value.strip())
telegram[obis_reference] = dsmr_object
@@ -47,6 +47,26 @@ class TelegramParser(object):
return obis_reference, parser.parse(line_value)
class TelegramParserV2_2(TelegramParser):
def parse(self, line_values):
"""Join lines for gas meter."""
def join_lines(line_values):
join_next = re.compile(GAS_METER_READING)
join = None
for line_value in line_values:
if join:
yield join.strip() + line_value
join = None
elif join_next.match(line_value):
join = line_value
else:
yield line_value
return super().parse(join_lines(line_values))
class DSMRObjectParser(object):
def __init__(self, *value_formats):
@@ -85,7 +105,11 @@ class MBusParser(DSMRObjectParser):
"""
def parse(self, line):
return MBusObject(self._parse(line))
values = self._parse(line)
if len(values) == 2:
return MBusObject(values)
else:
return MBusObjectV2_2(values)
class CosemParser(DSMRObjectParser):

View File

@@ -1,6 +1,6 @@
import serial
from dsmr_parser.parsers import TelegramParser
from dsmr_parser.parsers import TelegramParser, V3TelegramParser
SERIAL_SETTINGS_V2_2 = {
'baudrate': 9600,
@@ -36,7 +36,12 @@ class SerialReader(object):
def __init__(self, device, serial_settings, telegram_specification):
self.serial_settings = serial_settings
self.serial_settings['port'] = device
self.telegram_parser = TelegramParser(telegram_specification)
if serial_settings is SERIAL_SETTINGS_V2_2:
telegram_parser = V3TelegramParser
else:
telegram_parser = TelegramParser
self.telegram_parser = telegram_parser(telegram_specification)
def read(self):
"""

View File

@@ -6,7 +6,10 @@ import pytz
def timestamp(value):
naive_datetime = datetime.datetime.strptime(value[:-1], '%y%m%d%H%M%S')
is_dst = value[12] == 'S' # assume format 160322150000W
if len(value) == 13:
is_dst = value[12] == 'S' # assume format 160322150000W
else:
is_dst = False
local_tz = pytz.timezone('Europe/Amsterdam')
localized_datetime = local_tz.localize(naive_datetime, is_dst=is_dst)