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 argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
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():
|
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 serial_asyncio import create_serial_connection
|
||||||
|
|
||||||
from . import telegram_specifications
|
from dsmr_parser import telegram_specifications
|
||||||
from .exceptions import ParseError
|
from dsmr_parser.clients.telegram_buffer import TelegramBuffer
|
||||||
from .parsers import TelegramParserV2_2, TelegramParserV4
|
from dsmr_parser.exceptions import ParseError
|
||||||
from .serial import (SERIAL_SETTINGS_V2_2, SERIAL_SETTINGS_V4, TelegramBuffer)
|
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):
|
def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None):
|
@ -1,37 +1,19 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
import re
|
|
||||||
import serial
|
import serial
|
||||||
import serial_asyncio
|
import serial_asyncio
|
||||||
|
|
||||||
|
from dsmr_parser.clients.telegram_buffer import TelegramBuffer
|
||||||
from dsmr_parser.exceptions import ParseError
|
from dsmr_parser.exceptions import ParseError
|
||||||
from dsmr_parser.parsers import TelegramParser, TelegramParserV2_2, \
|
from dsmr_parser.parsers import TelegramParser, TelegramParserV2_2, \
|
||||||
TelegramParserV4
|
TelegramParserV4
|
||||||
|
from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \
|
||||||
|
SERIAL_SETTINGS_V4
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
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):
|
class SerialReader(object):
|
||||||
PORT_KEY = 'port'
|
PORT_KEY = 'port'
|
||||||
|
|
||||||
@ -104,57 +86,4 @@ class AsyncSerialReader(SerialReader):
|
|||||||
logger.warning('Failed to parse telegram: %s', e)
|
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 PyCRC.CRC16 import CRC16
|
||||||
|
|
||||||
from .objects import MBusObject, MBusObjectV2_2, CosemObject
|
from dsmr_parser.objects import MBusObject, MBusObjectV2_2, CosemObject
|
||||||
from .exceptions import ParseError, InvalidChecksumError
|
from dsmr_parser.exceptions import ParseError, InvalidChecksumError
|
||||||
from .obis_references import GAS_METER_READING
|
from dsmr_parser.obis_references import GAS_METER_READING
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from . import obis_references as obis
|
from dsmr_parser import obis_references as obis
|
||||||
from .parsers import CosemParser, ValueParser, MBusParser
|
from dsmr_parser.parsers import CosemParser, ValueParser, MBusParser
|
||||||
from .value_types import timestamp
|
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 obis_references as obis
|
||||||
from dsmr_parser import telegram_specifications
|
from dsmr_parser import telegram_specifications
|
||||||
from dsmr_parser.parsers import TelegramParserV2_2
|
from dsmr_parser.parsers import TelegramParserV2_2
|
||||||
from dsmr_parser.protocol import DSMRProtocol
|
from dsmr_parser.clients.protocol import DSMRProtocol
|
||||||
|
|
||||||
|
|
||||||
TELEGRAM_V2_2 = (
|
TELEGRAM_V2_2 = (
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import unittest
|
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
|
from test.example_telegrams import TELEGRAM_V2_2, TELEGRAM_V4_2
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user