Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CRC Errors with Holley DTZ541 via RS485 #22

Closed
webratz opened this issue Aug 21, 2024 · 15 comments
Closed

CRC Errors with Holley DTZ541 via RS485 #22

webratz opened this issue Aug 21, 2024 · 15 comments
Assignees
Labels
enhancement New feature or request

Comments

@webratz
Copy link

webratz commented Aug 21, 2024

Hey,

after having only used the optical interface so far, I tested today a new Meter (Holley DTZ541) and connected it via a RS485 to USB Serial Adapter.

Every single Frame shows an CRC Error, so I initially thought something is completely off. Out of curiousity I cloned the lib and removed the CRC check to see if there is any useful data at all, and it turns out: The values look actually pretty sane.

{
'1.8.0': 1234, // adjusted to not show real one, but matched actual values on display
'14.7.0': 49.9,
'16.7.0': 259,
'2.8.0': 5678, // adjusted to not show real one , but matched actual values on display
'31.7.0': 0.69,
'32.7.0': 234.6,
'51.7.0': 0.21,
'52.7.0': 233.8,
'71.7.0': 0.58,
'72.7.0': 233.9,
'81.7.1': 120,
'81.7.15': 296,
'81.7.2': 239,
'81.7.26': 317,
'81.7.4': 326 
}

Sample output of a CRC Error

(b'\x1b\x1b\x1b\x1b\x01\x01\x01\x01v\x04\x00\x00\x01b\x00b\x00re\x00\x00\x01\x01v\x01\x01\x07\x00\x00\nWXR\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01cT}\x00v\x04\x00\x00\x02b\x00b\x00re\x00\x00\x07\x01w\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01\xf1\x0ew\x07\x01\x00`2\x01\x01\x01\x01\x01\x01\x04HLY\x01w\x07\x01\x00`\x01\x00\xff\x01\x01\x01\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01w\x07\x01\x00\x01\x08\x00\xffe\x00\x1c\x01\x04e\nWXSb\x1eR\xffe\x06o\x04\xab\x01w\x07\x01\x00\x02\x08\x00\xffe\x00\x1c\x01\x04e\nWXSb\x1eR\xffe\x08\x1c\xb4T\x01w\x07\x01\x00\x10\x07\x00\xff\x01\x01b\x1bR\x00S\x00\xbc\x01w\x07\x01\x00 \x07\x00\xff\x01\x01b#R\xffc\t8\x01w\x07\x01\x004\x07\x00\xff\x01\x01b#R\xffc\t)\x01w\x07\x01\x00H\x07\x00\xff\x01\x01b#R\xffc\t$\x01w\x07\x01\x00\x1f\x07\x00\xff\x01\x01b!R\xfebE\x01w\x07\x01\x003\x07\x00\xff\x01\x01b!R\xfeb\x15\x01w\x07\x01\x00G\x07\x00\xff\x01\x01b!R\xfeb\x1a\x01w\x07\x01\x00Q\x07\x01\xff\x01\x01b\x08R\x00bx\x01w\x07\x01\x00Q\x07\x02\xff\x01\x01b\x08R\x00b\xf0\x01w\x07\x01\x00Q\x07\x04\xff\x01\x01b\x08R\x00c\x01F\x01w\x07\x01\x00Q\x07\x0f\xff\x01\x01b\x08R\x00c\x01)\x01w\x07\x01\x00Q\x07\x1a\xff\x01\x01b\x08R\x00c\x01(\x01w\x07\x01\x00\x0e\x07\x00\xff\x01\x01b,R\xffc\x01\xf4\x01w\x07\x01\x00\x01\x08\x00`\x01\x01b\x1eR\x02b)\x01w\x07\x01\x00\x01\x08\x00a\x01\x01b\x1eR\x02c\x01e\x01w\x07\x01\x00\x01\x08\x00b\x01\x01b\x1eR\x02c\x05\x05\x01w\x07\x01\x00\x01\x08\x00c\x01\x01b\x1eR\x02c`\r\x01w\x07\x01\x00\x01\x08\x00d\x01\x01b\x1eR\x02e\x00\x01\xa5\xa2\x01w\x07\x01\x00\x02\x08\x00`\x01\x01b\x1eR\x02b7\x01w\x07\x01\x00\x02\x08\x00a\x01\x01b\x1eR\x02c\x01X\x01w\x07\x01\x00\x02\x08\x00b\x01\x01b\x1eR\x02c\t\t\x01w\x07\x01\x00\x02\x08\x00c\x01\x01b\x1eR\x02cJ\xec\x01w\x07\x01\x00\x02\x08\x00d\x01\x01b\x1eR\x02e\x00\x02\x13\xa2\x01w\x07\x01\x00\x00\x02\x00\x00\x01\x01\x01\x01\t1.02.007\x01w\x07\x01\x00`Z\x02\x01\x01\x01\x01\x01\x05A01A\x01w\x07\x01\x00`\x05\x00\xff\x01\x01\x01\x01e\x00\x1c\x01\x04\x01\x01\x01c3a\x00v\x04\x00\x00\x03b\x00b\x00re\x00\x00\x02\x01q\x01c\xeb\xf4\x00\x00\x1b\x1b\x1b\x1b\x1a\x01u\x02', 29954, 42739)

I'm opening the serial port in exclusive mode, so I'm assuming that there is no other programs accessing it serial.Serial(self.serial_device, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=5, exclusive=True)

Do you have any hints about how I could go on figuring out the reason for the CRC errors? Might the manufacturer even calculate them different, or is maybe the RS485 Adapater changing something.

@spacemanspiff2007
Copy link
Owner

I think the Holley uses a slightly different CRC-Calculation:
volkszaehler/libsml#75 (comment)
CRC-16/KERMIT seems to be initialized differently to CRC-16/X-25.

So for now the easiest way would be to just ignore the CRC errors or monkeypatch the crc function call.

@webratz
Copy link
Author

webratz commented Aug 22, 2024

Would you be open for a MR that allows disabling the CRC check?
I might also be able to check if I could get the workaround that volkszaehler implemented ported to smllib

@spacemanspiff2007
Copy link
Owner

spacemanspiff2007 commented Aug 22, 2024

A quick search brought up this. Can you replace the crc function with this and see if it works as expected?

def crc16(data: bytes):
    table = [ 
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
        0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
        0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
        0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
        0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
        0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
        0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
        0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
        0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
        0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
        0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
        0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
        0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
        0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
        0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
        0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
    ]
    
    crc = 0xFFFF
    for byte in data:
        crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
        crc &= 0xFFFF
    return crc

I am not sure if disabling the crc check all together is a good idea. My meter sporadically issues corrupt frames which will then result in another runtime exception which can not be caught as easily as the CrcError.
However I think it makes sense to make that smllib supports additional algorithms so I'll think of something.
I'd like to do some additional cleanup, so I'd prefer to do it myself but it might take some time.
Is the manual edit something you could live with?

@webratz
Copy link
Author

webratz commented Aug 22, 2024

This does not seem to work right away. I'll probably need some time to check in detail

File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/reader.py", line 56, in get_frame
    crc_calc = crc16(msg[:-2])
               ^^^^^^^^^^^^^^^
  File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/crc.py", line 69, in crc16
    crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
                       ~~~~~^^^^^^^^^^^^^^^^^^^
IndexError: list index out of range

Also this error seems to hit me https://github.com/volkszaehler/libsml/pull/76/files#diff-c1f2ae13f8f0c53b6842f00718fd75d67895e04f1bc7aa66857096f1e6cab1bbR41 so I guess I'll need to add this also, even when skipping the CRC checks

@webratz
Copy link
Author

webratz commented Aug 22, 2024

It seems like there is error at times, when the CRC check is not there, catching issues

[2024-08-21 19:27:18,003] [sml.ttyUSB0       ] INFO     | get_obis failed - try parsing frame
[2024-08-21 19:27:18,008] [sml.ttyUSB0       ] INFO     | Received Frame
[2024-08-21 19:27:18,009] [sml.ttyUSB0       ] INFO     |  -> b'7604000001620062007265000001017601010700000a5808070b0a01484c5902000159bb01016397470076040000026200620072650000070177010b0a01484c5902000159bb0101f10e77070100603201010101010104484c590177070100600100ff010101010b0a01484c5902000159bb0177070100010800ff65001c1904650a580807621e52ff65066f5c380177070100020800ff65001c1904650a580807621e52ff65081cc5f30177070100100700ff0101621b520053fdda0177070100200700ff0101622352ff6309450177070100340700ff0101622352ff63093f0177070100480700ff0101622352ff63094201770701001f0700ff0101622152fe62f90177070100330700ff0101622152fe62120177070100470700ff0101622152fe621b0177070100510701ff01016208520062770177070100510702ff01016208520062ef0177070100510704ff01016208520062b2017707010051070fff01016208520063011f017707010051071aff01016208520063012801770701000e0700ff0101622c52ff6301f40177070100010800600101621e520262290177070100010800610101621e52026301650177070100010800620101621e52026305050177070100010800630101621e520263600d0177070100010800640101621e5202650001a5b90177070100020800600101621e520262370177070100020800610101621e52026301580177070100020800620101621e5202630909017707010002080063010162fe1b1b1b1b010101017604000001620062007265000001017601010700000a58080a0b0a01484c5902000159bb010163f5770076040000026200620072650000070177010b0a01484c5902000159bb0101f10e77070100603201010101010104484c590177070100600100ff010101010b0a01484c5902000159bb0177070100010800ff65001c1904650a58080a621e52ff65066f5c380177070100020800ff65001c1904650a58080a621e52ff65081cc5f80177070100100700ff0101621b520053fdd80177070100200700ff0101622352ff6309440177070100340700ff0101622352ff63093f0177070100480700ff0101622352ff63094201770701001f0700ff0101622152fe62fb0177070100330700ff0101622152fe62120177070100470700ff0101622152fe621b0177070100510701ff01016208520062770177070100510702ff01016208520062f00177070100510704ff01016208520062b8017707010051070fff010162085200630120017707010051071aff01016208520063012801770701000e0700ff0101622c52ff6301f40177070100010800600101621e520262290177070100010800610101621e52026301650177070100010800620101621e52026305050177070100010800630101621e520263600d0177070100010800640101621e5202650001a5b90177070100020800600101621e520262370177070100020800610101621e52026301580177070100020800620101621e52026309090177070100020800630101621e5202634aec0177070100020800640101621e520265000213a70177070100000200000101010109312e30322e3030370177070100605a02010101010105413031410177070100600500ff0101010165001c1904010101632b0700760400000362006200726500000201710163ebf400'
[2024-08-21 19:27:18,010] [sml.ttyUSB0       ] DEBUG    | Exception <class 'ValueError'>: "Unknown data type: 10!"
[2024-08-21 19:27:18,018] [sml.ttyUSB0       ] ERROR    | Traceback (most recent call last):
[2024-08-21 19:27:18,019] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/sml2mqtt/const/sml_helpers.py", line 40, in get_frame_values
[2024-08-21 19:27:18,020] [sml.ttyUSB0       ] ERROR    |     sml_objs = self.get_obis()  # type: list[SmlListEntry]
[2024-08-21 19:27:18,020] [sml.ttyUSB0       ] ERROR    |                ^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,021] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 127, in get_obis
[2024-08-21 19:27:18,021] [sml.ttyUSB0       ] ERROR    |     self._parse_msg(data)
[2024-08-21 19:27:18,021] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 112, in _parse_msg
[2024-08-21 19:27:18,022] [sml.ttyUSB0       ] ERROR    |     _lst[i] = v = self.get_value()
[2024-08-21 19:27:18,022] [sml.ttyUSB0       ] ERROR    |                   ^^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,022] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 89, in get_value
[2024-08-21 19:27:18,023] [sml.ttyUSB0       ] ERROR    |     raise ValueError(msg)
[2024-08-21 19:27:18,023] [sml.ttyUSB0       ] ERROR    | ValueError: Unknown data type: 10!
[2024-08-21 19:27:18,024] [sml.ttyUSB0       ] ERROR    | 
[2024-08-21 19:27:18,024] [sml.ttyUSB0       ] ERROR    | During handling of the above exception, another exception occurred:
[2024-08-21 19:27:18,024] [sml.ttyUSB0       ] ERROR    | 
[2024-08-21 19:27:18,025] [sml.ttyUSB0       ] ERROR    | Traceback (most recent call last):
[2024-08-21 19:27:18,025] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/sml2mqtt/sml_device/sml_device.py", line 115, in on_source_data
[2024-08-21 19:27:18,025] [sml.ttyUSB0       ] ERROR    |     self.frame_handler(frame)
[2024-08-21 19:27:18,025] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/sml2mqtt/sml_device/sml_device.py", line 150, in process_frame
[2024-08-21 19:27:18,026] [sml.ttyUSB0       ] ERROR    |     frame_values = frame.get_frame_values(self.log)
[2024-08-21 19:27:18,026] [sml.ttyUSB0       ] ERROR    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,026] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/sml2mqtt/const/sml_helpers.py", line 45, in get_frame_values
[2024-08-21 19:27:18,026] [sml.ttyUSB0       ] ERROR    |     for msg in self.parse_frame():
[2024-08-21 19:27:18,027] [sml.ttyUSB0       ] ERROR    |                ^^^^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,027] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 104, in parse_frame
[2024-08-21 19:27:18,027] [sml.ttyUSB0       ] ERROR    |     val = self._parse_msg(self.get_value())
[2024-08-21 19:27:18,028] [sml.ttyUSB0       ] ERROR    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,028] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 114, in _parse_msg
[2024-08-21 19:27:18,028] [sml.ttyUSB0       ] ERROR    |     self._parse_msg(v)
[2024-08-21 19:27:18,028] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 114, in _parse_msg
[2024-08-21 19:27:18,029] [sml.ttyUSB0       ] ERROR    |     self._parse_msg(v)
[2024-08-21 19:27:18,029] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 114, in _parse_msg
[2024-08-21 19:27:18,029] [sml.ttyUSB0       ] ERROR    |     self._parse_msg(v)
[2024-08-21 19:27:18,030] [sml.ttyUSB0       ] ERROR    |   [Previous line repeated 1 more time]
[2024-08-21 19:27:18,030] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 112, in _parse_msg
[2024-08-21 19:27:18,030] [sml.ttyUSB0       ] ERROR    |     _lst[i] = v = self.get_value()
[2024-08-21 19:27:18,030] [sml.ttyUSB0       ] ERROR    |                   ^^^^^^^^^^^^^^^^
[2024-08-21 19:27:18,031] [sml.ttyUSB0       ] ERROR    |   File "/opt/sml2mqtt/venv/lib/python3.11/site-packages/smllib/sml_frame.py", line 89, in get_value
[2024-08-21 19:27:18,031] [sml.ttyUSB0       ] ERROR    |     raise ValueError(msg)
[2024-08-21 19:27:18,031] [sml.ttyUSB0       ] ERROR    | ValueError: Unknown data type: 10!
[2024-08-21 19:27:18,032] [sml.ttyUSB0.status] INFO     | ERROR
[2024-08-21 19:27:18,034] [sml.shutdown      ] INFO     | Shutting down ...

@spacemanspiff2007
Copy link
Owner

spacemanspiff2007 commented Aug 22, 2024

The bitwise and of the crc belongs in the for loop:

    for byte in data:
        crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
        crc &= 0xFFFF
    return crc

Does crc work when you do it like this?
I think it makes sense to fix crc first because the meter will issue corrupt frames and then your program will crash.
Only when this is fixed it makes sense to try the workarounds.
It would be nice if you could provide the received frames which require the workaround so I can add them to the test cases.

@webratz
Copy link
Author

webratz commented Aug 22, 2024

Sadly that still does not work.

Not sure if its the right format, but an example frame looks like this

b'v\x04\x00\x00\x01b\x00b\x00re\x00\x00\x01\x01v\x01\x01\x07\x00\x00\nX;\x80\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01cV]\x00v\x04\x00\x00\x02b\x00b\x00re\x00\x00\x07\x01w\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01\x01\xf1\x0ew\x07\x01\x00`2\x01\x01\x01\x01\x01\x01\x04HLY\x01w\x07\x01\x00`\x01\x00\xff\x01\x01\x01\x01\x0b\n\x01HLY\x02\x00\x01Y\xbb\x01w\x07\x01\x00\x01\x08\x00\xffe\x00\x1c\x19\x04e\nX;\x80b\x1eR\xffe\x06o\\8\x01w\x07\x01\x00\x02\x08\x00\xffe\x00\x1c\x19\x04e\nX;\x80b\x1eR\xffe\x08\x1db\xff\x01w\x07\x01\x00\x10\x07\x00\xff\x01\x01b\x1bR\x00S\xf9\xbe\x01w\x07\x01\x00 \x07\x00\xff\x01\x01b#R\xffc\tv\x01w\x07\x01\x004\x07\x00\xff\x01\x01b#R\xffc\tO\x01w\x07\x01\x00H\x07\x00\xff\x01\x01b#R\xffc\tu\x01w\x07\x01\x00\x1f\x07\x00\xff\x01\x01b!R\xfec\x02\xd5\x01w\x07\x01\x003\x07\x00\xff\x01\x01b!R\xfeb"\x01w\x07\x01\x00G\x07\x00\xff\x01\x01b!R\xfeb2\x01w\x07\x01\x00Q\x07\x01\xff\x01\x01b\x08R\x00bx\x01w\x07\x01\x00Q\x07\x02\xff\x01\x01b\x08R\x00b\xf0\x01w\x07\x01\x00Q\x07\x04\xff\x01\x01b\x08R\x00b\xb4\x01w\x07\x01\x00Q\x07\x0f\xff\x01\x01b\x08R\x00b\x0c\x01w\x07\x01\x00Q\x07\x1a\xff\x01\x01b\x08R\x00c\x015\x01w\x07\x01\x00\x0e\x07\x00\xff\x01\x01b,R\xffc\x01\xf4\x01w\x07\x01\x00\x01\x08\x00`\x01\x01b\x1eR\x02b)\x01w\x07\x01\x00\x01\x08\x00a\x01\x01b\x1eR\x02c\x01e\x01w\x07\x01\x00\x01\x08\x00b\x01\x01b\x1eR\x02c\x05\x05\x01w\x07\x01\x00\x01\x08\x00c\x01\x01b\x1eR\x02c`\r\x01w\x07\x01\x00\x01\x08\x00d\x01\x01b\x1eR\x02e\x00\x01\xa5\xb9\x01w\x07\x01\x00\x02\x08\x00`\x01\x01b\x1eR\x02b7\x01w\x07\x01\x00\x02\x08\x00a\x01\x01b\x1eR\x02c\x01X\x01w\x07\x01\x00\x02\x08\x00b\x01\x01b\x1eR\x02c\t\t\x01w\x07\x01\x00\x02\x08\x00c\x01\x01b\x1eR\x02cJ\xec\x01w\x07\x01\x00\x02\x08\x00d\x01\x01b\x1eR\x02e\x00\x02\x13\xcf\x01w\x07\x01\x00\x00\x02\x00\x00\x01\x01\x01\x01\t1.02.007\x01w\x07\x01\x00`Z\x02\x01\x01\x01\x01\x01\x05A01A\x01w\x07\x01\x00`\x05\x00\xff\x01\x01\x01\x01e\x00\x1c\x19\x04\x01\x01\x01c\xb0l\x00v\x04\x00\x00\x03b\x00b\x00re\x00\x00\x02\x01q\x01c\xeb\xf4\x00'

@webratz
Copy link
Author

webratz commented Aug 22, 2024

CRC16 KERMIT using https://github.com/Nicoretti/crc/blob/master/src/crc/_crc.py#L529 for test purposes works fine

config = Configuration(
    width=16,
    polynomial=0x1021,
    init_value=0x0000,
    final_xor_value=0x0000 ,
    reverse_input=True,
    reverse_output=True,
)

@webratz
Copy link
Author

webratz commented Aug 22, 2024

def crc16_kermit(data: bytes):
    table = [
        0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
        0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
        0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
        0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
        0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
        0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
        0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
        0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
        0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
        0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
        0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
        0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
        0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
        0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
        0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
        0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
        0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
        0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
        0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
        0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
        0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
        0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
        0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
        0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
        0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
        0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
        0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
        0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
        0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
        0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
        0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
        0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
    ]
    
    crc = 0x0000  # Initial value for CRC16 KERMIT
    for byte in data:
        crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]
    return crc

this seems to work also, not sure if I trust it, asked the AI to generate it

@spacemanspiff2007
Copy link
Owner

Do you still get errors with the CRC check implemented?
Or is the complete frame invalid?

@webratz
Copy link
Author

webratz commented Aug 26, 2024

With the new CRC check implemented things work fine now. There is the occasional corrupt frame, but in general stable

@spacemanspiff2007
Copy link
Owner

So do I understand it correctly that no further workaround is needed for you? It's just the modified CRC check?

@webratz
Copy link
Author

webratz commented Aug 27, 2024

Exactly, all I implemented was the CRC16 Kermit, and so far only manually patched in.
So adding that to the lib and either allow it to be configured, or fall back to it like libsml does, would allow everyone with the Holley DTZ541 to use it.

@spacemanspiff2007 spacemanspiff2007 self-assigned this Aug 31, 2024
@spacemanspiff2007 spacemanspiff2007 added the enhancement New feature or request label Aug 31, 2024
spacemanspiff2007 added a commit that referenced this issue Oct 24, 2024
@spacemanspiff2007
Copy link
Owner

spacemanspiff2007 commented Oct 24, 2024

@webratz I've added it to the StreamReader. What do you think?

@spacemanspiff2007
Copy link
Owner

Published 1.5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants