CANbus module communication guidance

I am developing an IO module for an application and I am trying to make it J1939 complaint. The data required to control this module doesn't fit in with any of the pre defined messages so I'll be using proprietary messages.

The modules can provide a Heatbeat, Input status, output status, device temperature, current feedback per output channel.

Control of the module deals with output state per channel, PWM duty per channel.

For the heartbeat status, I planned on using the request message EA0100 requesting FF0100. The heartbeat would respond with FF0001 and i would add the module type and firmware revision to the 8 bytes of data in the response message

The other status information will be done the same way.

For the input status, I planned on using the request message EA0100 requesting FF0200. The 8 bytes of data would represent a binary signal for each input
I also planned on broadcasting the input state message anytime an input changed states.

does this look correct?

Also, when I want to control the specific outputs, I planned on using EF0100 as the message and the 8 bytes of data would specify the channel, output state and PWM signals

Am I on the right track? I'd love some guidance.

When diagnosing a system with a CAN bus sniffer it's handy to see things like heartbeats and status messages being broadcast all the time from all the nodes so that you know what is alive and healthy without the need for a working ECU sending out polled requests.

Putting the number of seconds since the module was last reset into your heartbeat messages will allow you to detect when there has been an uncommanded reset due to a power dropout etc.

As long as the bus isn't saturated there's no harm in the ECU repeatedly broadcasting commands even if they are repeating what has already been sent. This allows a listening node that just recovered from an unscheduled reset to rapidly get back into a working state.

I will make it an option to enable broadcasting of status and heartbeat along with broadcast timing. That way the user can easily enable/disable the broadcast function and use a request if desired.