💬 Relay
-
Arduino: 1.8.1 (Windows 7), Board: "Arduino Pro or Pro Mini, ATmega168 (5V, 16 MHz)"
In file included from c:\users\mitja\appdata\local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2\avr\include\avr\io.h:99:0,
from c:\users\mitja\appdata\local\arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2\avr\include\avr\pgmspace.h:90, from C:\Users\mitja\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/Arduino.h:28, from sketch\button_relay.ino.cpp:1:C:\Users\mitja\Documents\Arduino\libraries\MySensors/hal/architecture/AVR/MyHwAVR.cpp: In function 'bool hwUniqueID(uint8_t (*)[16])':
C:\Users\mitja\Documents\Arduino\libraries\MySensors/hal/architecture/AVR/MyHwAVR.cpp:246:26: error: 'SIGRD' was not declared in this scope
((uint8_t)uniqueID) = boot_signature_byte_get(0x00);
^C:\Users\mitja\Documents\Arduino\libraries\MySensors/hal/architecture/AVR/MyHwAVR.cpp:247:30: error: 'SIGRD' was not declared in this scope
((uint8_t)uniqueID + 1) = boot_signature_byte_get(0x02);
^C:\Users\mitja\Documents\Arduino\libraries\MySensors/hal/architecture/AVR/MyHwAVR.cpp:248:30: error: 'SIGRD' was not declared in this scope
((uint8_t)uniqueID + 2) = boot_signature_byte_get(0x04);
^C:\Users\mitja\Documents\Arduino\libraries\MySensors/hal/architecture/AVR/MyHwAVR.cpp:249:30: error: 'SIGRD' was not declared in this scope
((uint8_t)uniqueID + 3) = boot_signature_byte_get(0x01); //OSCCAL
^Multiple libraries were found for "Bounce2.h"
Used: C:\Users\mitja\Documents\Arduino\libraries\Bounce2
Not used: C:\Users\mitja\Documents\Arduino\libraries\Bounce2-master
exit status 1
Error compiling for board Arduino Pro or Pro Mini.This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences. -
OK it's probaly because ia have mini with 168 chip i have to buys 328 :( again wait 1month to arive from china
-
hello.
I am building a node with several kind of sensors and two relays.
My sensors use CHILD ID from 0 to 3. I would like to start child ID of relay from 4.
How I can't do that with this sketch?
I guess I have to change this part of sketch :
"for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
present(sensor, S_BINARY);"correct?
thanks
-
hello.
I am building a node with several kind of sensors and two relays.
My sensors use CHILD ID from 0 to 3. I would like to start child ID of relay from 4.
How I can't do that with this sketch?
I guess I have to change this part of sketch :
"for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
present(sensor, S_BINARY);"correct?
thanks
@lekeb
You may do something like this:
In Header:uint8_t DS_First_Child_ID = 7; //First Child-ID to be used by Dallas Busan then in presentation():
for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) { present(i + DS_First_Child_ID, S_TEMP); }But afaik, it's not recommended to shift the ChildID's for relays but always start with 1. Imo it's better to change the ChildID's of the other attached sensors. You may also take care (in case of shifting ID's) about a consistent mapping from ID to the PINs where the relays are attached.
-
Sur,
my node controls two relays, one water pressure sensor and three DS18b20
/** code pour controle cave a vin, temp et pression */ // Enable debug prints to serial monitor //#define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 // Enable repeater functionality for this node #define MY_REPEATER_FEATURE #define MY_NODE_ID 15 #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #define BARO_CHILD 0 //Child ID for pressure sensor #define BAR_SENSOR_ANALOG_PIN 0 // pin for pressure sensor #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 5 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 #define RELAY_PIN 3 //pin for first relay #define NUMBER_OF_RELAYS 2 #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; bool receivedConfig = false; bool metric = true; float lastpression; uint8_t DS_First_Child_ID = 4; //First Child-ID to be used by Dallas Bus MyMessage pressureMsg(BARO_CHILD, V_PRESSURE); MyMessage msg(0,V_TEMP); void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } // Startup up the OneWire library sensors.begin(); } void setup() { // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Buanderie node", "1.0"); //present pressure sensor present(BARO_CHILD, S_BARO); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { present(i + DS_First_Child_ID, S_TEMP); } } void loop() { //read water pressure int lecture_adc = analogRead(BAR_SENSOR_ANALOG_PIN); float pression = ((lecture_adc*5/1024.0)-0.50)/1.7; if(pression != lastpression) { send(pressureMsg.set(pression, 2)); lastpression = pression; } // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution()); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) sleep(conversionTime); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature send(msg.setSensor(i + DS_First_Child_ID).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_STATUS) { // Change relay state digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
Sur,
my node controls two relays, one water pressure sensor and three DS18b20
/** code pour controle cave a vin, temp et pression */ // Enable debug prints to serial monitor //#define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 // Enable repeater functionality for this node #define MY_REPEATER_FEATURE #define MY_NODE_ID 15 #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #define BARO_CHILD 0 //Child ID for pressure sensor #define BAR_SENSOR_ANALOG_PIN 0 // pin for pressure sensor #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 5 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 #define RELAY_PIN 3 //pin for first relay #define NUMBER_OF_RELAYS 2 #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; bool receivedConfig = false; bool metric = true; float lastpression; uint8_t DS_First_Child_ID = 4; //First Child-ID to be used by Dallas Bus MyMessage pressureMsg(BARO_CHILD, V_PRESSURE); MyMessage msg(0,V_TEMP); void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } // Startup up the OneWire library sensors.begin(); } void setup() { // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Buanderie node", "1.0"); //present pressure sensor present(BARO_CHILD, S_BARO); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { present(i + DS_First_Child_ID, S_TEMP); } } void loop() { //read water pressure int lecture_adc = analogRead(BAR_SENSOR_ANALOG_PIN); float pression = ((lecture_adc*5/1024.0)-0.50)/1.7; if(pression != lastpression) { send(pressureMsg.set(pression, 2)); lastpression = pression; } // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution()); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) sleep(conversionTime); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature send(msg.setSensor(i + DS_First_Child_ID).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_STATUS) { // Change relay state digitalWrite(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
@lekeb said in 💬 Relay:
MyMessage pressureMsg(BARO_CHILD, V_PRESSURE);
MyMessage msg(0,V_TEMP);Why are you using the same child ID (since you set #define BARO_CHILD 0)?
@gohan Effectively, he will never report any temp reading under ChildID 0. Within presentation() and the send() commands, the "0" is replaced by "i + DS_First_Child_ID".
But you are partly right, to avoid any misunderstandings wrt. that the statement could also be written as follows:MyMessage msg(DS_First_Child_ID,V_TEMP); -
Hello everybody !
I would like to creat a sensor with two relays and two buttons to command this relay direct from the sensor (with actualisation of their stat in domoticz)
Someone know the code to do this ? I'm a complete newbie on mysensor !Thank's a lot !
-
Hello everybody !
I would like to creat a sensor with two relays and two buttons to command this relay direct from the sensor (with actualisation of their stat in domoticz)
Someone know the code to do this ? I'm a complete newbie on mysensor !Thank's a lot !
-
Excellent ! It's perfect, thank's a lot rejoe2 !
-
Hi
Using Home assistant, and Optimistic set to false in the mysensors config, the switch in homeassistant would turn the relay on, but in the view in homeassistant the flip switch jumped off straight after switching on. It was solved by adding the following line to the sketch, ensuring that hassio knows that the actuator actually have received the command. Not sure if this is a good way of doing it, but it seems to work for me.
send(msg.set(state)); // Send new state and request ack back
in:
void receive(const MyMessage &message) {
// We only expect one type of message from controller. But we better check anyway.
if (message.isAck()) {
Serial.println("This is an ack from gateway");
}if (message.type == V_LIGHT) {
// Change relay state
state = message.getBool();
digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
// Store state in eeprom
saveState(CHILD_ID, state);// Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); send(msg.set(state)); // Send new state and request ack back}
}Thanks
-
Hi!
I would like to control some 230VAC equipment (for now roller shutters), based on inputs from my mysensors sensors (temperature and light). For controller I use domoticz.
I would like a safe, robust and preferably authorized/lawful solution (I'm in EU/Denmark).
I came across the following solutions:
https://aeotec.com/z-wave-plug-in-switch
https://sonoff.itead.cc/en/products/sonoff/sonoff-basic
https://dlidirect.com/products/iot-power-relayI think the first one and maybe the second one will be authorized/lawful...? However, I have experience only with mysensors and neither z wave nor sonoff...
Anyone has some experience/thoughts/suggestions to share?
Thanks.
-
There are also roller shutters nodes running via zwave if you are looking at a retail solution
Thank you @gohan! Retail solution is not the keyword here. What I am searching for is an authorized/lawful (safe) solution.
I decided to do my own node (mysensors) with a cheap relay module for the arduino. Once I achieve the desired functionality I will change to some more robust hardware. Following your suggestion this could be a z wave roller shutter (e.g. fibaro or qubino).