moved serial clients to own package
This commit is contained in:
parent
e97ab7c7ea
commit
fadf206715
@ -1,9 +1,9 @@
|
||||
from functools import partial
|
||||
import argparse
|
||||
import asyncio
|
||||
import logging
|
||||
from functools import partial
|
||||
|
||||
from .protocol import create_dsmr_reader, create_tcp_dsmr_reader
|
||||
from dsmr_parser.clients import create_dsmr_reader, create_tcp_dsmr_reader
|
||||
|
||||
|
||||
def console():
|
||||
|
5
dsmr_parser/clients/__init__.py
Normal file
5
dsmr_parser/clients/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \
|
||||
SERIAL_SETTINGS_V4
|
||||
from dsmr_parser.clients.serial import SerialReader, AsyncSerialReader
|
||||
from dsmr_parser.clients.protocol import create_dsmr_protocol, \
|
||||
create_dsmr_reader, create_tcp_dsmr_reader
|
@ -6,10 +6,12 @@ from functools import partial
|
||||
|
||||
from serial_asyncio import create_serial_connection
|
||||
|
||||
from . import telegram_specifications
|
||||
from .exceptions import ParseError
|
||||
from .parsers import TelegramParserV2_2, TelegramParserV4
|
||||
from .serial import (SERIAL_SETTINGS_V2_2, SERIAL_SETTINGS_V4, TelegramBuffer)
|
||||
from dsmr_parser import telegram_specifications
|
||||
from dsmr_parser.clients.telegram_buffer import TelegramBuffer
|
||||
from dsmr_parser.exceptions import ParseError
|
||||
from dsmr_parser.parsers import TelegramParserV2_2, TelegramParserV4
|
||||
from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \
|
||||
SERIAL_SETTINGS_V4
|
||||
|
||||
|
||||
def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None):
|
@ -1,37 +1,19 @@
|
||||
import asyncio
|
||||
import logging
|
||||
import re
|
||||
import serial
|
||||
import serial_asyncio
|
||||
|
||||
from dsmr_parser.clients.telegram_buffer import TelegramBuffer
|
||||
from dsmr_parser.exceptions import ParseError
|
||||
from dsmr_parser.parsers import TelegramParser, TelegramParserV2_2, \
|
||||
TelegramParserV4
|
||||
from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \
|
||||
SERIAL_SETTINGS_V4
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
SERIAL_SETTINGS_V2_2 = {
|
||||
'baudrate': 9600,
|
||||
'bytesize': serial.SEVENBITS,
|
||||
'parity': serial.PARITY_EVEN,
|
||||
'stopbits': serial.STOPBITS_ONE,
|
||||
'xonxoff': 0,
|
||||
'rtscts': 0,
|
||||
'timeout': 20
|
||||
}
|
||||
|
||||
SERIAL_SETTINGS_V4 = {
|
||||
'baudrate': 115200,
|
||||
'bytesize': serial.SEVENBITS,
|
||||
'parity': serial.PARITY_EVEN,
|
||||
'stopbits': serial.STOPBITS_ONE,
|
||||
'xonxoff': 0,
|
||||
'rtscts': 0,
|
||||
'timeout': 20
|
||||
}
|
||||
|
||||
|
||||
class SerialReader(object):
|
||||
PORT_KEY = 'port'
|
||||
|
||||
@ -104,57 +86,4 @@ class AsyncSerialReader(SerialReader):
|
||||
logger.warning('Failed to parse telegram: %s', e)
|
||||
|
||||
|
||||
class TelegramBuffer(object):
|
||||
"""
|
||||
Used as a buffer for a stream of telegram data. Constructs full telegram
|
||||
strings from the buffered data and returns it.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self._buffer = ''
|
||||
|
||||
def get_all(self):
|
||||
"""
|
||||
Remove complete telegrams from buffer and yield them.
|
||||
:rtype generator:
|
||||
"""
|
||||
for telegram in self._find_telegrams():
|
||||
self._remove(telegram)
|
||||
yield telegram
|
||||
|
||||
def append(self, data):
|
||||
"""
|
||||
Add telegram data to buffer.
|
||||
:param str data: chars, lines or full telegram strings of telegram data
|
||||
"""
|
||||
self._buffer += data
|
||||
|
||||
def _remove(self, telegram):
|
||||
"""
|
||||
Remove telegram from buffer and incomplete data preceding it. This
|
||||
is easier than validating the data before adding it to the buffer.
|
||||
:param str telegram:
|
||||
:return:
|
||||
"""
|
||||
# Remove data leading up to the telegram and the telegram itself.
|
||||
index = self._buffer.index(telegram) + len(telegram)
|
||||
|
||||
self._buffer = self._buffer[index:]
|
||||
|
||||
def _find_telegrams(self):
|
||||
"""
|
||||
Find complete telegrams in buffer from start ('/') till ending
|
||||
checksum ('!AB12\r\n').
|
||||
:rtype: list
|
||||
"""
|
||||
# - Match all characters after start of telegram except for the start
|
||||
# itself again '^\/]+', which eliminates incomplete preceding telegrams.
|
||||
# - Do non greedy match using '?' so start is matched up to the first
|
||||
# checksum that's found.
|
||||
# - The checksum is optional '{0,4}' because not all telegram versions
|
||||
# support it.
|
||||
return re.findall(
|
||||
r'\/[^\/]+?\![A-F0-9]{0,4}\r\n',
|
||||
self._buffer,
|
||||
re.DOTALL
|
||||
)
|
22
dsmr_parser/clients/settings.py
Normal file
22
dsmr_parser/clients/settings.py
Normal file
@ -0,0 +1,22 @@
|
||||
import serial
|
||||
|
||||
|
||||
SERIAL_SETTINGS_V2_2 = {
|
||||
'baudrate': 9600,
|
||||
'bytesize': serial.SEVENBITS,
|
||||
'parity': serial.PARITY_EVEN,
|
||||
'stopbits': serial.STOPBITS_ONE,
|
||||
'xonxoff': 0,
|
||||
'rtscts': 0,
|
||||
'timeout': 20
|
||||
}
|
||||
|
||||
SERIAL_SETTINGS_V4 = {
|
||||
'baudrate': 115200,
|
||||
'bytesize': serial.SEVENBITS,
|
||||
'parity': serial.PARITY_EVEN,
|
||||
'stopbits': serial.STOPBITS_ONE,
|
||||
'xonxoff': 0,
|
||||
'rtscts': 0,
|
||||
'timeout': 20
|
||||
}
|
57
dsmr_parser/clients/telegram_buffer.py
Normal file
57
dsmr_parser/clients/telegram_buffer.py
Normal file
@ -0,0 +1,57 @@
|
||||
import re
|
||||
|
||||
|
||||
class TelegramBuffer(object):
|
||||
"""
|
||||
Used as a buffer for a stream of telegram data. Constructs full telegram
|
||||
strings from the buffered data and returns it.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self._buffer = ''
|
||||
|
||||
def get_all(self):
|
||||
"""
|
||||
Remove complete telegrams from buffer and yield them.
|
||||
:rtype generator:
|
||||
"""
|
||||
for telegram in self._find_telegrams():
|
||||
self._remove(telegram)
|
||||
yield telegram
|
||||
|
||||
def append(self, data):
|
||||
"""
|
||||
Add telegram data to buffer.
|
||||
:param str data: chars, lines or full telegram strings of telegram data
|
||||
"""
|
||||
self._buffer += data
|
||||
|
||||
def _remove(self, telegram):
|
||||
"""
|
||||
Remove telegram from buffer and incomplete data preceding it. This
|
||||
is easier than validating the data before adding it to the buffer.
|
||||
:param str telegram:
|
||||
:return:
|
||||
"""
|
||||
# Remove data leading up to the telegram and the telegram itself.
|
||||
index = self._buffer.index(telegram) + len(telegram)
|
||||
|
||||
self._buffer = self._buffer[index:]
|
||||
|
||||
def _find_telegrams(self):
|
||||
"""
|
||||
Find complete telegrams in buffer from start ('/') till ending
|
||||
checksum ('!AB12\r\n').
|
||||
:rtype: list
|
||||
"""
|
||||
# - Match all characters after start of telegram except for the start
|
||||
# itself again '^\/]+', which eliminates incomplete preceding telegrams.
|
||||
# - Do non greedy match using '?' so start is matched up to the first
|
||||
# checksum that's found.
|
||||
# - The checksum is optional '{0,4}' because not all telegram versions
|
||||
# support it.
|
||||
return re.findall(
|
||||
r'\/[^\/]+?\![A-F0-9]{0,4}\r\n',
|
||||
self._buffer,
|
||||
re.DOTALL
|
||||
)
|
@ -3,9 +3,9 @@ import re
|
||||
|
||||
from PyCRC.CRC16 import CRC16
|
||||
|
||||
from .objects import MBusObject, MBusObjectV2_2, CosemObject
|
||||
from .exceptions import ParseError, InvalidChecksumError
|
||||
from .obis_references import GAS_METER_READING
|
||||
from dsmr_parser.objects import MBusObject, MBusObjectV2_2, CosemObject
|
||||
from dsmr_parser.exceptions import ParseError, InvalidChecksumError
|
||||
from dsmr_parser.obis_references import GAS_METER_READING
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from . import obis_references as obis
|
||||
from .parsers import CosemParser, ValueParser, MBusParser
|
||||
from .value_types import timestamp
|
||||
from dsmr_parser import obis_references as obis
|
||||
from dsmr_parser.parsers import CosemParser, ValueParser, MBusParser
|
||||
from dsmr_parser.value_types import timestamp
|
||||
|
||||
|
||||
"""
|
||||
|
@ -5,7 +5,7 @@ import unittest
|
||||
from dsmr_parser import obis_references as obis
|
||||
from dsmr_parser import telegram_specifications
|
||||
from dsmr_parser.parsers import TelegramParserV2_2
|
||||
from dsmr_parser.protocol import DSMRProtocol
|
||||
from dsmr_parser.clients.protocol import DSMRProtocol
|
||||
|
||||
|
||||
TELEGRAM_V2_2 = (
|
||||
|
@ -1,6 +1,6 @@
|
||||
import unittest
|
||||
|
||||
from dsmr_parser.serial import TelegramBuffer
|
||||
from dsmr_parser.clients.telegram_buffer import TelegramBuffer
|
||||
from test.example_telegrams import TELEGRAM_V2_2, TELEGRAM_V4_2
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user