Latest UDP Protocol

Is there a link to the latest UDP protocol? I’m struggling with the vs 1.0.30 which I don’t think is the latest for the latest Core+K9


Here is the link to the WatchMon UDP Listener that we regularly update with the mapping of the messages:

Make sure to go directly to the Payload folder for the latest release:

Meanwhile, the up-to-date WatchMon Toolkit Software Releases are found on our Wiki:

Ah perfect thanks! I can use that git repo for what I need.

Best regards,


Hello @maxine,

Is the WatchMon UDP repository on GitHub still maintained? I notice that the latest commit is two years old and there are a few (one year+ old) issues that are not addressed.

Hello osaether,

Yes, this is maintained. But we have not updated any messages in the last two years and there are no new features other than the new CAN inverter options, which didn’t require any payload changes.

This is intentional as we’ve been limiting the payload changes. Because when we do so, it breaks a lot of people’s systems where they’ve written their own applications to listen to the data transmitted from the BMS.

Hope this has been helpful!

You said the UDP messages have not changed but the Msg_4733_TelemetryCtrLogicStatus data does not match up with the info on GitHub. I did some testing and mapped the Expansion relays and SSR’s as well as the SoC% data and have that working but not sure how much of the other data does not align. Also there are a number of messages that are not listed in the repository 3031, 5a32, 3033, 5b31, 5a31, 5932 & 5931… If you could please provide an update for Msg_4733 that would be great, this is what I have tested so far:

.bit1('hasSocLoTriggered2')         // boolean index 30 - bit2
.bit1('isSocOnState2')              // boolean index 30 - bit3
.bit1('hasSocHiTriggered2')         // boolean index 30 - bit4
.bit1('hasSocLoTriggered1')         // boolean index 30 - bit5
.bit1('isSocOnState1')              // boolean index 30 - bit6
.bit1('hasSocHiTriggered1')         // boolean index 30 - bit7
.bit1('reserved10')                 // boolean index 31 - bit0
.bit1('reserved11')                 // boolean index 31 - bit1
.bit1('hasSocLoTriggered4')         // boolean index 31 - bit2
.bit1('isSocOnState4')              // boolean index 31 - bit3
.bit1('hasSocHiTriggered4')         // boolean index 31 - bit4
.bit1('hasSocLoTriggered3')         // boolean index 31 - bit5
.bit1('isSocOnState3')              // boolean index 31 - bit6
.bit1('hasSocHiTriggered3')         // boolean index 31 - bit7
.bit1('ExpansionOutputRelay4')      // boolean index 32 - bit0
.bit1('ExpansionOutputRelay3')      // boolean index 32 - bit1
.bit1('ExpansionOutputRelay2')      // boolean index 32 - bit2
.bit1('ExpansionOutputRelay1')      // boolean index 32 - bit3
.bit1('ExpansionOutputSSR8')        // boolean index 32 - bit4
.bit1('ExpansionOutputSSR7')        // boolean index 32 - bit5
.bit1('ExpansionOutputSSR6')        // boolean index 32 - bit6
.bit1('ExpansionOutputSSR5')        // boolean index 32 - bit7
.bit1('reserved12')                 // boolean index 33 - bit0
.bit1('RelayA')                     // boolean index 33 - bit1