Hi
Can you help me convert this skecth for MySensors 2.2.0 because it was released. I upload to my Arduino MIni Pro this sketch but in Gateway Domoticz not show child to switch relay. Only show repeater child on ID 255.
And also if you can please share me ready skecth for 2x releay.
/*
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);
}