Recently, I have been trying to test out the quality of my node to gateway communication, as I know that occasionally messages from nodes don't make it through.
I could not find a simple test sketch that had examples of how to perform the different types of message delivery checks, so I have searched the forums and produced a simple sketch that may be of use to others.
The hardware is as simple as can be:

The sketch will send alternating 1 and 0 to simulate a switch. Each time it will check for :
Transportready
Radio Hardware ACK
Software Echo.
Results are displayed in the debug serial window.
It it interesting to note that the results so far are different from what I expected.
Transportready seems to report good even when lots of hardware NACKS occur.
I've also seen the echo come back as good even though the ack did not.
Here is the sketch
// Mysensors test sketch 1.3 by grumpazoid
#define MY_DEBUG // Enable debug prints
// #define MY_PARENT_NODE_ID 0 // use this to define next node on route e.g. a repeater
// #define MY_PARENT_NODE_IS_STATIC // dont allow node to search for other repeaters
// #define NODE_ID 200 // enable this if you want the node to have a specific ID
#define MY_RADIO_RF24 //Enable and select radio type attached
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95
#define MY_RF24_PA_LEVEL RF24_PA_MAX // Set Radio Power. Values can be MIN LOW HIGH MAX. FOR PA+LNA MODULE LOW CAN WORK BETTER!!
#include <MySensors.h>
#define CHILD_ID 1
int STATE = 0;
// Initialize motion message
MyMessage msg(CHILD_ID, V_TRIPPED);
void setup()
{
sendSketchInfo("Test sensor", "1.3");
present(CHILD_ID, S_DOOR);
}
void loop()
{
//TEST FOR TRANSPORT READY
if (isTransportReady())
{
Serial.println ();
Serial.println ("Tranport Ready");
}
// SEND MESSAGE
// send(msg.set(STATE),true);
//TEST FOR HARDWARE ACK
if (send(msg.set(STATE), true)) // This appears to also send the message
{
Serial.println("HARDWARE ACK----UPLINK AVAILABLE");
}
else {
Serial.println("HARDWARE ACK----UPLINK IS NOT AVAILABLE. NO HARDWARE ACK RECEIVED");
}
#ifdef MY_DEBUG
Serial.print("current vale of STATE = ");
Serial.println(STATE);
#endif;
// Change state ready for next time
if (STATE==0) {
(STATE=1);
}
else if (STATE==1){
(STATE=0) ;
}
#ifdef MY_DEBUG
Serial.println("Going to wait a few seconds for echo message");
#endif;
wait(3000); // Wait 3 seconds
// We shaould have WAITED long enough now for echo message so let's have a sleep.
#ifdef MY_DEBUG
Serial.println("Going to sleep for 10 seconds");
#endif;
sleep(10000); // Sleep 10 seconds
}
// END OF MAIN LOOP
//Listen for incoming messages
void receive(const MyMessage &message) {
if (message.isEcho())
{
Serial.println("SOFTWARE ECHO RECEIVED---- from gateway");
}
}