Strange value being sent from controller using mixed temp/relay node
-
the combining of the extensible sketches make it harder than needs to be.
How many sensors are you connecting of each type?
-
I tried to modify the temp child presentation like this..... but it seemed to have no effect
int offsetforrelays=5; //(at start of sketch) // and this further down in the presentation for temp sensors for (int i=0; i<(numSensors+offsetforrelays) && i<(MAX_ATTACHED_DS18B20+offsetforrelays) && i>offsetforrelays; i++) { gw.present(i, V_TEMP); }but so far it hasn't assigned any different id's to the temp sensors. Anyone got any pointers?
-
I tried to modify the temp child presentation like this..... but it seemed to have no effect
int offsetforrelays=5; //(at start of sketch) // and this further down in the presentation for temp sensors for (int i=0; i<(numSensors+offsetforrelays) && i<(MAX_ATTACHED_DS18B20+offsetforrelays) && i>offsetforrelays; i++) { gw.present(i, V_TEMP); }but so far it hasn't assigned any different id's to the temp sensors. Anyone got any pointers?
@Gambituk said:
#include <OneWire.h>presen
#include <OneWire.h>presendo you still have this typo in your code?
-
try something like this:
#define NUMBER_OF_TEMP_SENSORS 3void setup() { sensors.begin(); gw.begin(incomingMessage, AUTO, true); gw.sendSketchInfo("Temp and Relays", "1.0"); for (int i=0; i < NUMBER_OF_TEMP_SENSORS ; i++) { gw.present(i, V_TEMP); // creates 0, 1 and 2 } for (int sensor=1, pin=RELAY_1 ; sensor <= NUMBER_OF_RELAYS ; sensor++ , pin++) { gw.present(NUMBER_OF_TEMP_SENSORS + sensor, S_LIGHT); // should create 3 and 4 pinMode(pin, OUTPUT); digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF); } }you will also have to sort out the sensor numbers in the callback
-
0;0;3;0;9;read: 25-25-0 s=0,c=0,t=0,pt=0,l=5:1.4.1
0;0;3;0;9;read: 25-25-0 s=1,c=0,t=0,pt=0,l=5:1.4.1
0;0;3;0;9;read: 25-25-0 s=2,c=0,t=0,pt=0,l=5:1.4.1
0;0;3;0;9;read: 25-25-0 s=4,c=0,t=3,pt=0,l=5:1.4.1
0;0;3;0;9;read: 25-25-0 s=5,c=0,t=3,pt=0,l=5:1.4.1So far it seems to create 0,1,2,4,5 but i think that's not going to be a problem, just working my way through to figure what else i need to change for the callback? (and what a callback is :D )
Thanks for the help so far!
-
@Gambituk said:
what else i need to change for the callback?
the call back function:
incomingMessage()look to get this right:
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);so that the command matches the sensor numbers...
-
@Gambituk said:
what else i need to change for the callback?
the call back function:
incomingMessage()look to get this right:
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);so that the command matches the sensor numbers...
for (int sensor=1, pin=RELAY_1 ; sensor <= NUMBER_OF_RELAYS ; sensor++ , pin++)
{
gw.present(NUMBER_OF_TEMP_SENSORS + sensor, S_LIGHT); // should create 3 and 4For the earlier part, should this be "for (int sensor=0" to get 3 and 4?
I get 4 and 5 ... But either way, i dont suppose it matters that there is a gap of 1 in the sensor child id's.
-
I change the callback to this:
digitalWrite(message.sensor - 4 + RELAY_1, message.getBool() ? RELAY_ON : RELAY_OFF);
and that works.... i can send a message and it activates the relay.. :D
-
BUT.... :(
repeater started, id 25 send: 25-25-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0 read: 0-0-25 s=255,c=3,t=6,pt=0,l=1:M send: 25-25-0-0 s=255,c=3,t=11,pt=0,l=15,st=ok:Temp and Relays send: 25-25-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 25-25-0-0 s=0,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=1,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=2,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=4,c=0,t=3,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=5,c=0,t=3,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=0,c=1,t=0,pt=7,l=5,st=ok:19.1
Here i am sending a message with 1 and then 0 to relay id4 and then the same to relay id5 -It works, but i still have the 1.3 and 0.3 values
read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:1.3r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:0.3r Incoming change for sensor:5 Incoming change for sensor:5, New status: 0And then it starts going even crazier, only seeing the status as 1 and received command is nothing like boolean so it see's 0's and 1's as only 1's
read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:1.3r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:0.3r Incoming change for sensor:4 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:003r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:003r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:013r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:113r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:013r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1- So i am thinking it is still a problem with what is sent from gateway somehow... :(
Any ideas
-
-
for (int sensor=1, pin=RELAY_1 ; sensor <= NUMBER_OF_RELAYS ; sensor++ , pin++)
{
gw.present(NUMBER_OF_TEMP_SENSORS + sensor, S_LIGHT); // should create 3 and 4For the earlier part, should this be "for (int sensor=0" to get 3 and 4?
I get 4 and 5 ... But either way, i dont suppose it matters that there is a gap of 1 in the sensor child id's.
-
I change the callback to this:
digitalWrite(message.sensor - 4 + RELAY_1, message.getBool() ? RELAY_ON : RELAY_OFF);
and that works.... i can send a message and it activates the relay.. :D
-
BUT.... :(
repeater started, id 25 send: 25-25-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0 read: 0-0-25 s=255,c=3,t=6,pt=0,l=1:M send: 25-25-0-0 s=255,c=3,t=11,pt=0,l=15,st=ok:Temp and Relays send: 25-25-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 25-25-0-0 s=0,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=1,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=2,c=0,t=0,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=4,c=0,t=3,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=5,c=0,t=3,pt=0,l=5,st=ok:1.4.1 send: 25-25-0-0 s=0,c=1,t=0,pt=7,l=5,st=ok:19.1
Here i am sending a message with 1 and then 0 to relay id4 and then the same to relay id5 -It works, but i still have the 1.3 and 0.3 values
read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:1.3r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:0.3r Incoming change for sensor:5 Incoming change for sensor:5, New status: 0And then it starts going even crazier, only seeing the status as 1 and received command is nothing like boolean so it see's 0's and 1's as only 1's
read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:1.3r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:0.3r Incoming change for sensor:4 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:003r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:003r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=5,c=1,t=2,pt=0,l=4:013r Incoming change for sensor:5 Incoming change for sensor:5, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:113r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1 read: 0-0-25 s=4,c=1,t=2,pt=0,l=4:013r Incoming change for sensor:4 Incoming change for sensor:4, New status: 1- So i am thinking it is still a problem with what is sent from gateway somehow... :(
Any ideas
would you mind posting your latest (sorta working) code?
-
-
// Running DS temperature sensor(s) and relay(s) on one mysensor arduino node
// Combines Onewire and Relay code
// 2014-10-14 Pego: Tested and Running on Uno/Clone and MQTT gateway// Example sketch showing how to send in OneWire temperature readings // Example sketch showing how to control physical relays. // This example will remember relay state even after power failure. #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #define ONE_WIRE_BUS 3 // Pin where dallas sensor is connected #define MAX_ATTACHED_DS18B20 16 #define RELAY_1 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 2 // Total number of attached relays #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 #define NUMBER_OF_TEMP_SENSORS 3 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) 30000 orig OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); MySensor gw; float lastTemperature[MAX_ATTACHED_DS18B20]; //int numSensors = 0; boolean receivedConfig = false; boolean metric = true; // Initialize temperature message MyMessage msg(0, V_TEMP); //int offsetforrelays = 5; void setup() { // Startup OneWire sensors.begin(); gw.begin(incomingMessage, AUTO, true); // Startup and initialize MySensors library. Set callback for incoming messages. gw.sendSketchInfo("Temp and Relays", "1.0"); // Send the sketch version information to the gateway and Controller for (int i = 0; i < NUMBER_OF_TEMP_SENSORS ; i++) { gw.present(i, V_TEMP); // creates 0, 1 and 2 } for (int sensor = 1, pin = RELAY_1 ; sensor <= NUMBER_OF_RELAYS ; sensor++ , pin++) // loop from sensor1/pin4 to sensor2/pin5 (numofrelays=2) { gw.present(NUMBER_OF_TEMP_SENSORS + sensor, S_LIGHT); // should create 3 and 4 pinMode(pin, OUTPUT); digitalWrite(pin, gw.loadState(sensor) ? RELAY_ON : RELAY_OFF); } } void loop() { // Process incoming messages (like config from server) gw.process(); // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // Read temperatures and send them to controller for (int i = 0; i < NUMBER_OF_TEMP_SENSORS && i < MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric ? sensors.getTempCByIndex(i) : sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed more then 1 degC and no error if (int(lastTemperature[i]) != int(temperature) && temperature != -127.00) { //added integer // Send in the new temperature gw.send(msg.setSensor(i).set(temperature, 1)); lastTemperature[i] = temperature; } } //gw.sleep(SLEEP_TIME); //no sleep for relays!!!! } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_LIGHT) { // Change relay state Serial.print("Incoming change for sensor:"); Serial.println(message.sensor); digitalWrite(message.sensor - 4 + RELAY_1, message.getBool() ? RELAY_ON : RELAY_OFF); // Store state in eeprom gw.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()); } } -
@BulldogLowell I just tried uploading a standard vanilla relay node, and i get the same garbled data instead of 1 and 0 (should have tried this at the start, but i am happy with what i have learned in the last 12 hours.) So it seems almost certain that it is an issue with the @gadu version of the mqtt gateway.. which is unaltered from the above post. #2 above
-
Interesting findings, if you find any solution for this in the MQTT gateway I would really appreciate if you post it. I'm about to start implementing relays as well.
(it's actually not my version, I think @ntruchsess is the one who created it) ;)
-
@gadu if you have a setup running, could you publish a message on your mosquitto server just like this?
MyMQTT/25/1/V_LIGHT 1 MyMQTT/25/1/V_LIGHT 0I don't think it matters if you have any relays connected or defined, it's just to see what value it tries to send to the node... (assuming you have your gateway connected to a pc to be able to see the serial output)?
No problems if this is not possible.
-
I cannot see where the issue is coming from, the mqttgateway seems very straightforward, i think the answer might be in the libraries or some kind of conflict with the datatypes? it's a little over my head, but i would really love to get this working. :/
-
// NOTE above : Beware to check if there is any length on payload in your incommingMessage code:
// Example: if (msg.type==V_LIGHT && strlen(msg.getString())>0) otherwise the code might do strange things.I have a question regarding this line in MyMQTTClient.h that perhaps @hek or @ntruchsess might be able to comment on, Is the above issue that i am seeing linked to this warning? it is beyond my weak coding to grasp the implications... Or anyone who may have a comment, i would really love to get this to work!!!