๐ฌ Relay
-
Hi to all!
I would edit the secure relay sketch so in loop the node sends to the gateway, let's say every hours, his state (on or off).- I avoid delay otherwise Arduino cannot receive the comands from gateway, so I will use the millis sketch, modified from the official Arduino website.
My doubt is... How can I get the current state of the relay?
Relevant part of sketch is in loop and before setup()
/* TIME variables */ unsigned long previousMillis = 0; // will store last time state is sent // constants won't change: const long interval = 10000; // interval at which to send state (milliseconds === seconds x 1000). For test we try every 10 secondsAnd the main loop
void loop() { // check to see if it's time to send state; that is, if the difference // between the current time and last time you sent state is bigger than // the interval at which you want to send the state. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // send the state here! // test Serial.println("This is the moment where I need to send state"); //send(?????????); // Send current state. Probabily will update also the log? }The base sketch is >>> https://github.com/mysensors/MySensors/blob/master/examples/SecureActuator/SecureActuator.ino
And the millis example is >>> https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Thank you to all!
-
Hi to all!
I would edit the secure relay sketch so in loop the node sends to the gateway, let's say every hours, his state (on or off).- I avoid delay otherwise Arduino cannot receive the comands from gateway, so I will use the millis sketch, modified from the official Arduino website.
My doubt is... How can I get the current state of the relay?
Relevant part of sketch is in loop and before setup()
/* TIME variables */ unsigned long previousMillis = 0; // will store last time state is sent // constants won't change: const long interval = 10000; // interval at which to send state (milliseconds === seconds x 1000). For test we try every 10 secondsAnd the main loop
void loop() { // check to see if it's time to send state; that is, if the difference // between the current time and last time you sent state is bigger than // the interval at which you want to send the state. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // send the state here! // test Serial.println("This is the moment where I need to send state"); //send(?????????); // Send current state. Probabily will update also the log? }The base sketch is >>> https://github.com/mysensors/MySensors/blob/master/examples/SecureActuator/SecureActuator.ino
And the millis example is >>> https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Thank you to all!
@sineverba
Edit:
I did edit the pre-setup configurationint val = 0; // the value of digital pin #define CHILD_ID 1 // Id of the sensor child MyMessage msg(CHILD_ID,V_LIGHT);And I did edit the loop:
if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // send the state here! // test Serial.println("This is the moment where I need to send state"); val = digitalRead(LOCK_1); Serial.print("Il valore del relay รจ "); Serial.println(val); send(msg.set(val),true); // Send new state and request ack back. }I got the update in Domoticz in Hardware > Configuration > Children of nodes

And I did test also every 3 seconds, all ok.
But I don't have the refresh in "main page":

I did test removing current to Arduino when Relay was ON. With Arduino off, I did change the state in domoticz to OFF.
Because Arduino save previous state in EEPROM, after full start the relay did go ON, in Domoticz got "1" in children (all right, because digitalRead was 1) but main panel shows OFF.
I did expect a graphical change...
Thank you (and hope that all is clear) :)
-
Hi to all!
To achieve my goal (node that sends relay state after power failure to sync with domoticz), I'm editing the button script.I have added this line
state = digitalRead(RELAY_PIN); send(msg.set(state?false:true), true); // Send new state and request ack backin setup, so I thought it send only one time at startup the current state after power failure.
But..... the relay shutdown/shuton (or viceversa) twice, in fast sequence....
Thank you very much!
-
Hi to all!
To achieve my goal (node that sends relay state after power failure to sync with domoticz), I'm editing the button script.I have added this line
state = digitalRead(RELAY_PIN); send(msg.set(state?false:true), true); // Send new state and request ack backin setup, so I thought it send only one time at startup the current state after power failure.
But..... the relay shutdown/shuton (or viceversa) twice, in fast sequence....
Thank you very much!
Bingo!
If I did understand well, the actuator sketch DOESN'T directly acts the relay, but sends to the gateway and expect from the gw itself the "new state" (in effect, you short GND & PIN 4, arduino sends new state to the gateway and gateway resend the new state).
So, 'cause I would to update the state on controller, I did this simple edit on setup:
// Set relay to last known state (using eeprom storage) state = loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); Serial.print("Lo stato ultimo era "); Serial.println(state); if ( state == 1) { state = 0; } else { state = 1; } send(msg.set(state?false:true), true); // Send new state and request ack backBasically, If relay was OFF on a power failure, and someone on Domoticz try to start the relay, the state in Domoticz will be "on".
When power returns, the arduino read the state (in my example OFF == 0), convert in 1 and send to the gateway the 1. The gateway // Domoticz will be answer with 0.
So, relay doesn't nothing and Domoticz state is update.
But.... why I need to invert the logic? :D
-
Hi to all!
To achieve my goal (node that sends relay state after power failure to sync with domoticz), I'm editing the button script.I have added this line
state = digitalRead(RELAY_PIN); send(msg.set(state?false:true), true); // Send new state and request ack backin setup, so I thought it send only one time at startup the current state after power failure.
But..... the relay shutdown/shuton (or viceversa) twice, in fast sequence....
Thank you very much!
@sineverba said in ๐ฌ Relay:
To achieve my goal (node that sends relay state after power failure to sync with domoticz)
Have a look at the sketch I used for my Synchronising Light switch you may be able to use some of that code perhaps.
-
@sineverba said in ๐ฌ Relay:
To achieve my goal (node that sends relay state after power failure to sync with domoticz)
Have a look at the sketch I used for my Synchronising Light switch you may be able to use some of that code perhaps.
-
Never seen the request function.
You are hero-member for a reason...
Thank you very much! :) :)@sineverba said in ๐ฌ Relay:
Never seen the request function.
You can find request and other useful info on the API page.
Hope you are enjoying your MySensors journey :) -
Hello,
since the relay has leds and is therefore power consuming, i was wondering if someone has written a sketch for a low power usage of the relay (as for the sensors) allowing the arduino (and the relay) to sleep all the time and wake up every 5 minutes for instance just to check if the controller has changed the desired state of the switch.
Of course then the relay could be as late as 5minute, but this is not an issue for my application ...
thanks for any suggestion
-
Hello,
since the relay has leds and is therefore power consuming, i was wondering if someone has written a sketch for a low power usage of the relay (as for the sensors) allowing the arduino (and the relay) to sleep all the time and wake up every 5 minutes for instance just to check if the controller has changed the desired state of the switch.
Of course then the relay could be as late as 5minute, but this is not an issue for my application ...
thanks for any suggestion
-
thanks , indeed it's because the relay is controlling a 12V battery power to solenoid valve , that low power consumption is needed. BTW the 12V is obtained from a 4S lipo (16.5V max voltage) and a 12 regulator and i dont know if its better to feed the arduino from a 5V regulator fed by the same Lipo , or use an additional set of AA batteries ... i remember that it's better to have an as low as possible drop in voltage to save power...
-
thanks , indeed it's because the relay is controlling a 12V battery power to solenoid valve , that low power consumption is needed. BTW the 12V is obtained from a 4S lipo (16.5V max voltage) and a 12 regulator and i dont know if its better to feed the arduino from a 5V regulator fed by the same Lipo , or use an additional set of AA batteries ... i remember that it's better to have an as low as possible drop in voltage to save power...
-
@fhenryco can't the relay node use power from whatever it is controlling?
For sleeping nodes, the smartsleep feature can be useful. Search for that keyword in the forum and look at https://www.mysensors.org/download/sensor_api_20#sleeping
@mfalkvidd smartsleep was not supported by domoticz at the begining of the year ... but there was a domoticz upgrade in july ... do you know if it's now supported ?
-
@fhenryco If you are trying to keep your power use down then you could also consider using either a Latching Relay or even a MOSFET.
@Boots33 said in ๐ฌ Relay:
@fhenryco If you are trying to keep your power use down then you could also consider using either a Latching Relay or even a MOSFET.
Agreed, if you want to save power you need to use a latching relay. Also another regulator would be fine to power the arduino.
-
@Boots33 said in ๐ฌ Relay:
@fhenryco If you are trying to keep your power use down then you could also consider using either a Latching Relay or even a MOSFET.
Agreed, if you want to save power you need to use a latching relay. Also another regulator would be fine to power the arduino.
@gohan can you explain the benefit (for a low power app) of a relay switching on electrical pulse rather something else ?
i mean, even the regular relay has both an open by default circuit output and close by default circuit ouput so it could remain on the desired state even when not powered up ... -
I am referring that when relay is on it is drawing power to stay on, while a latching relay it only draws power during the switch on and only during the switch off.
-
Hi Everyone,
maybe the below will help people facing random incorrect behaviors.
In sample from december 2016 /mysensors/MySensors/examples/RelayActuator/RelayActuator.ino, there is something which could be seen as a bug.In my case, I have used that sample to control a lot of relais. I noticed some rare but really annoying errors. From time to time a relay got switched incorrectly.
Annoying and strange as coding was pretty straightforward. All relais are coded to act in pulse mode.digitalWrite(message.sensor-1+RELAY_1, RELAY_OFF); wait(1000); digitalWrite(message.sensor-1+RELAY_1, RELAY_ON);And this is the reason of the bug.
Explanation.
During that second of wait, a lot of things may occurs. Due to the 'message' declaration, it is possible that the 'message' is getting changed.
Typically a ping may come and as result the 'message' is not anymore the same.For that reason I would suggest the code to be changed a little bit.
void receive(const MyMessage &message_orig) { MyMessage message; message = message_orig;This way, the function works with a local copy and you are sure nothing can change during the processing.
Anyway, thanks for the sample it was nevertheless very helpful
-
Hi Everyone,
maybe the below will help people facing random incorrect behaviors.
In sample from december 2016 /mysensors/MySensors/examples/RelayActuator/RelayActuator.ino, there is something which could be seen as a bug.In my case, I have used that sample to control a lot of relais. I noticed some rare but really annoying errors. From time to time a relay got switched incorrectly.
Annoying and strange as coding was pretty straightforward. All relais are coded to act in pulse mode.digitalWrite(message.sensor-1+RELAY_1, RELAY_OFF); wait(1000); digitalWrite(message.sensor-1+RELAY_1, RELAY_ON);And this is the reason of the bug.
Explanation.
During that second of wait, a lot of things may occurs. Due to the 'message' declaration, it is possible that the 'message' is getting changed.
Typically a ping may come and as result the 'message' is not anymore the same.For that reason I would suggest the code to be changed a little bit.
void receive(const MyMessage &message_orig) { MyMessage message; message = message_orig;This way, the function works with a local copy and you are sure nothing can change during the processing.
Anyway, thanks for the sample it was nevertheless very helpful
void receive(const MyMessage &message)Because of the const keyword this is a const reference or said another way, a reference to a constant. The const keyword guarantees that the function may not change the object.
So, I wonder what your real issue is....
-
void receive(const MyMessage &message)Because of the const keyword this is a const reference or said another way, a reference to a constant. The const keyword guarantees that the function may not change the object.
So, I wonder what your real issue is....
@BulldogLowell No This is not the coding of the function which changes it. It is most likely the event which triggers it which may changes it.
I can show the coding with trace and trace result.void receive(const MyMessage &message) //void receive(const MyMessage &message_orig) { // MyMessage message; // message = message_orig; Serial.println("receive_in:"); Serial.print("1st read:Sensor=");Serial.print(message.sensor);Serial.print(", getBool=");Serial.println(message.getBool()); // We only expect one type of message from controller. But we better check anyway. if (message.type==V_STATUS) { // Change relay state if (message.getBool() == RELAY_ON){ digitalWrite(message.sensor-1+RELAY_1, RELAY_OFF); Serial.print("2nd read:Sensor=");Serial.print(message.sensor);Serial.print(", getBool=");Serial.println(message.getBool()); wait(1000); digitalWrite(message.sensor-1+RELAY_1, RELAY_ON); Serial.print("3rd read:Sensor=");Serial.print(message.sensor);Serial.print(", getBool=");Serial.println(message.getBool()); } Serial.println("receive_out:"); }Below is a normal trace
0;255;3;0;9;Eth: 0;0;3;0;18;PING 0;255;3;0;9;Eth: 0;1;1;0;2;1 receive_in: 1st read:Sensor=1, getBool=1 2nd read:Sensor=1, getBool=1 3rd read:Sensor=1, getBool=1 receive_outSo you see the ping which occured before the message I'm interested in
Now, because of the wait in the middle of the code, it may occurs the ping arrive in that period. Then the issue occurs.
See the trace with error.0;255;3;0;9;Eth: 0;1;1;0;2;1 receive_in: 1st read:Sensor=1, getBool=1 2nd read:Sensor=1, getBool=1 0;255;3;0;9;Eth: 0;0;3;0;18;PING 3rd read:Sensor=0, getBool=0 receive_outIn the 3rd read, sensor value has changed and getBool returns also a different value.
Removing the wait or ensuring the function modules performs faster could reduce the risk. Still it will never be reliable.
Better is to have either a local copy of the message like I wrote in the original post. Or make immediately copies of the information from the message I'm interested in.