Merge branch 'master' of github.com:ndokter/dsmr_parser
This commit is contained in:
commit
47c20e763f
@ -1,7 +1,7 @@
|
||||
import logging
|
||||
import re
|
||||
|
||||
from PyCRC.CRC16 import CRC16
|
||||
from ctypes import c_ushort
|
||||
|
||||
from dsmr_parser.objects import MBusObject, CosemObject, Telegram
|
||||
from dsmr_parser.exceptions import ParseError, InvalidChecksumError
|
||||
@ -79,7 +79,7 @@ class TelegramParser(object):
|
||||
'incomplete. The checksum and/or content values are missing.'
|
||||
)
|
||||
|
||||
calculated_crc = CRC16().calculate(checksum_contents.group(0))
|
||||
calculated_crc = TelegramParser.crc16(checksum_contents.group(0))
|
||||
expected_crc = int(checksum_hex.group(0), base=16)
|
||||
|
||||
if calculated_crc != expected_crc:
|
||||
@ -91,6 +91,29 @@ class TelegramParser(object):
|
||||
)
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def crc16(telegram):
|
||||
crc16_tab = []
|
||||
|
||||
for i in range(0, 256):
|
||||
crc = c_ushort(i).value
|
||||
for j in range(0, 8):
|
||||
if (crc & 0x0001):
|
||||
crc = c_ushort(crc >> 1).value ^ 0xA001
|
||||
else:
|
||||
crc = c_ushort(crc >> 1).value
|
||||
crc16_tab.append(hex(crc))
|
||||
|
||||
crcValue = 0x0000
|
||||
|
||||
for c in telegram:
|
||||
d = ord(c)
|
||||
tmp = crcValue ^ d
|
||||
rotated = c_ushort(crcValue >> 8).value
|
||||
crcValue = rotated ^ int(crc16_tab[(tmp & 0x00ff)], 0)
|
||||
|
||||
return crcValue
|
||||
|
||||
|
||||
class DSMRObjectParser(object):
|
||||
"""
|
||||
|
1
setup.py
1
setup.py
@ -12,7 +12,6 @@ setup(
|
||||
'pyserial>=3,<4',
|
||||
'pyserial-asyncio<1',
|
||||
'pytz',
|
||||
'PyCRC>=1.2,<2'
|
||||
],
|
||||
entry_points={
|
||||
'console_scripts': ['dsmr_console=dsmr_parser.__main__:console']
|
||||
|
Loading…
Reference in New Issue
Block a user