MySensors ethernet 2.2.0 problem with control node switches

Hi
I am beginner… Yesterday i installed Haspbian on my RPI3 and start configuration…
I also connect radio RFM69HW to GPIO on raspberry and start compile and build MySensors Gateway based on ETHERNET. Finally i finished it and connect MySensors Gateway to Home Assistant by ethernet.

Configuration mysensors gatway looks like:
mysensors:
gateways:
- device: ‘127.0.0.1’
persistence_file: ‘/home/homeassistant/.homeassistant/mysensors.json’
tcp_port: 5003
optimistic: false
persistence: true

Then i connected node Mysenors based on Arduino MIni Pro with connected relay.
Sketch uploaded to node looks like:
/*
Relay with button sketch
modified to work with no uplink
to gateway and try to maintain sync to controller
*/

#define MY_DEBUG // Enable debug prints to serial monitor

#define MY_RADIO_RFM69
#define MY_IS_RFM69HW
#define RFM69_868MH
#define MY_RFM69_NEW_DRIVER

//#define MY_NODE_ID 203 // Node id defaults to AUTO (tries to fetch id from controller)

#define MY_TRANSPORT_WAIT_READY_MS 5000 //set how long to wait for transport ready in milliseconds

#define MY_REPEATER_FEATURE // Enabled repeater feature for this node

#include <MySensors.h>
#include <Bounce2.h>

#define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
#define BUTTON_PIN 3 // Arduino Digital I/O pin number for button
#define CHILD_ID 1 // Id of the sensor child
#define RELAY_ON 1
#define RELAY_OFF 0

Bounce debouncer = Bounce();
int oldValue = 0;
bool uplinkAvailable = true;
bool state = false;
bool requestState;
bool firstStart = true;
unsigned long uplinkCheckTime ; // holder for uplink checks
unsigned long uplinkCheckPeriod = 30*1000; // time between checks for uplink in milliseconds
unsigned long returnWait = 1000; // how long to wait for return from controller in milliseconds… adjust as needed
unsigned long oldTime = 0;
unsigned long newTime = 0;
MyMessage msg(CHILD_ID, V_STATUS);

void setup(){
pinMode(BUTTON_PIN, INPUT_PULLUP); // Setup the button pin, Activate internal pull-up

debouncer.attach(BUTTON_PIN); // After setting up the button, setup debouncer
debouncer.interval(5);

pinMode(RELAY_PIN, OUTPUT); // set relay pin in output mode
digitalWrite(RELAY_PIN, RELAY_OFF); // Make sure relay is off when starting up
}

void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(“1xRelay & Button”, “2.2.0”);

// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID, S_BINARY);
}

void loop(){
if (firstStart) { // this code is only run once at startup
Serial.println(“First run started”);
requestTime(); // get time from controller
wait (returnWait); // delay to allow time to return
if (oldTime == 0){ // check to see if there was a return from the time request
Serial.println(“uplink not available”);
uplinkAvailable = false; // no uplink established
uplinkCheckTime = millis();
}
else{
Serial.println(“uplink available”);
request( CHILD_ID, V_STATUS); // get status of switch on controller
wait (returnWait); //wait needed to allow request to return from controller
Serial.print("controller state — ");
Serial.println(requestState);
if (requestState != state) { // check that controller is corectly showing the current relay state
send(msg.set(state), false); // notify controller of current state
}
}
firstStart = false; // set firstStart flag false to prevent code from running again
}

debouncer.update();
int value = debouncer.read(); // Get the update value
if (value != oldValue && value == 0) { // check for new button push
state = !state; // Toggle the state
digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF); // switch the relay to the new state
requestTime();
wait (returnWait); // delay to allow time to return
if (oldTime != newTime){ // if times are different then uplink is available
send(msg.set(state), false);
oldTime = newTime;
}
else{ // if times are the same no uplink is available
Serial.println(“uplink not available”);
uplinkAvailable = false; // no uplink available, set flag false
uplinkCheckTime = millis(); // start the timer from now
}

}
oldValue = value;

if (!uplinkAvailable && (millis() - uplinkCheckTime > uplinkCheckPeriod) ) { // test to see if function should be called
uplinkCheck(); // call uplink checking function
}

}

/-------------------start of functions--------------------------/

void receive(const MyMessage &message) {
if (message.type == V_STATUS) { // check to see if incoming message is for a switch
switch (message.getCommand()) { // message.getCommand will give us the command type of the incomming message
case C_SET: //message is a set command from controller to update relay state
state = message.getBool(); // get the new state
digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF); // switch relay to new state
uplinkAvailable = true; // uplink established
/---- Write some debug info----/
Serial.print(“Incoming change for sensor:”);
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
break;
case C_REQ: // message is a returning request from controller
requestState = message.getBool(); // update requestState with returning state
break;
}
}
}

void uplinkCheck() {
requestTime();
wait (returnWait); // wait for time return… this may need to be varied for your system
if (oldTime != newTime){
Serial.println(“uplink re-established”);
request( CHILD_ID, V_STATUS);
wait (returnWait); //wait needed to allow request to return from controller
if (requestState != state) { // check that controller is corectly showing the current relay state
send(msg.set(state), false); // notify controller of current state no ack
uplinkAvailable = true; // uplink established
oldTime = newTime;
}
}
uplinkCheckTime = millis(); // reset the checktime
Serial.println(“uplinkchecktime reset”);
}

void receiveTime(unsigned long time)
{
if (firstStart){
oldTime = time;
newTime = time;
}
else{
newTime = time;
}
Serial.print("time received---- " );
Serial.println(time);
}

All based on library 2.2.0 MySensors.

After that i found in Home Assistant node and add friendly name and add to my one of group. But after boot Home Assistant i can by frontend only one change status relay… Example set ON, but when i try OFF it not working and button for one secund go to OFF and again go to ON.
When change by pin wire on Arduino Mini Pro status always change ok. But only not work by frontend. Only one i can change.

On my old Domoticz all works ok.

Next problem is also with test controller. When i change relay to ON , then ex reboot gateway MySensor and when gateway is rebooting i change by wire pin status relay , it is not refresh on frontend HA. Still show status ON before reboot gateway. But on domoticz works ok and status after reboot gateway was refreshed and show correct status OFF.

Please help me…

Mine is setup like this…but I don’t control a relay and it’s over wifi…

mysensors:
  gateways:
    - device: '192.168.178.xxx'
      persistence_file: 'C:\Users\MyPc\AppData\Roaming\.homeassistant\mysensors3.json'
      tcp_port: 5003
  optimistic: false
  persistence: true
  retain: true
  version: 2.0

I also try configure with retaine and version info and the same problem…

HA only supports the following…

version
(string)(Optional)Specifies the MySensors protocol version to use. Supports 1.4, 1.5 and 2.0.

Default value: 1.4

You have set the version to 2.2.0 in the code, I’m not sure if this is the reason but worth trying, I set mine to 1.0 (so mine is probably wrong as well :stuck_out_tongue: ) - btw please use code block formatting when posting code - you do this by pasting it leaving a blank line at the top and bottom of the code then select it and click the </> button at the top of the edit box.

My presentation function looks like this…

void presentation()
{
	// Present locally attached sensors here
  present(255, 18); //The number 18 signifies S_ARDUINO_REPEATER_NODE
  wait(1000);
  sendSketchInfo(SN, SV);

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_HALLTEMP, S_TEMP);
  present(CHILD_ID_HALLHUM,  S_HUM);  
  present(CHILD_ID_HALLLUX,  S_LIGHT_LEVEL);
  wait(1000);    
}

You appear to be presenting 1 relay but expect 2 to appear in HA?

I think when you do a send you should set the ack state to true otherwise there will be no acknowledgements and HA won’t be able to determine if the relay has changed state.

Ok i try test it on MySensors 2.0.0

I want in this sketch to use 1 relay but i need also help to convert my sketch to support 2 and more relay.

I also try set the ack to true and give you and info.
But tell me where correct this:
send(msg.set(state), false);

to
send(msg.set(state), true);

because this items is in three point in sketch ?

EDIT
Ok i change in thee point all to send(msg.set(state), true);
But nothing change still is problem.
Now i install MySensors 2.0.0 and test.