@ajlisy Here are a couple of ideas: Do you ever see Got a message in your log? If not, what if you turn on acks in the send()? If you are receiving messages, you might want to add logging of the message.type. wait() will return true if it receives the message and command specified in the arguments and false if it doesn't (timer expired) so you could change your wait(2000, C_SET,V_STATUS); to the following to see what is happening at this point in the sketch: bool resp = wait( 2000, C_SET,V_STATUS ); Serial.print( "wait( 2000, C_SET, V_STATUS ) return = " ); Serial.println(resp ? "true" : "false"); If wait() returns true above, then that confirms that the node is receiving a V_STATUS back from the gateway so the basic request response is functioning. If that is the case, then what happens if you change the wait(2000,C_SET,V_STATUS); in loop() to wait( 1000 );? Perhaps wait()'ing on a specific message consumes that message from the queue preventing the receive() callback from being called? It is not clear that the second wait() is even needed... I would think this simplified version would work: void loop() { send( msg.set( flip = flip ? 0 : 1 ), false ); request( CHILD_ID, V_STATUS ); wait( 1000 ); } If you want to synchronize the node state with the Home Assistant controller, you can send the request message in setup() [NOTE: Requires development branch] void setup() { // Make sure relays are off when starting up digitalWrite(RELAY_PIN, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN, OUTPUT); //Synchronize relay state with gateway - this will result in receive() being called. request( CHILD_ID, V_STATUS ); }