Strange value being sent from controller using mixed temp/relay node



  • Hello, I am getting strange values being sent from this controller sketch from @gadu (many thanks again) and this node sketch from @pgo

    It almost works.. i am going via mosquitto install on the same raspberry as openhab, and it does turn on and off the relay while sending temp values from the same node. The problem i am having is that it is not reliable, it doesn't always turn on and off, and i have found that the following is being sent from the mqtt gateway sketch:

    0;0;3;0;9;send: 0-0-21-21 s=0,c=1,t=0,pt=0,l=5,st=ok:19.7r
    0;0;3;0;9;read: 21-21-0 s=1,c=1,t=0,pt=7,l=5:5.4
    publish: MyMQTT/21/1/V_TEMP 5.4
    0;0;3;0;9;send: 0-0-21-21 s=1,c=1,t=0,pt=0,l=5,st=fail:5.47r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:147r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:047r
    0;0;3;0;9;read: 21-21-0 s=0,c=1,t=0,pt=7,l=5:19.8
    publish: MyMQTT/21/0/V_TEMP 19.8
    0;0;3;0;9;send: 0-0-21-21 s=0,c=1,t=0,pt=0,l=5,st=ok:19.8r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:1.8r
    0;0;3;0;9;send: 0-0-24-24 s=2,c=1,t=2,pt=0,l=4,st=ok:0.8r
    0;0;3;0;9;read: 21-21-0 s=1,c=1,t=0,pt=7,l=5:5.6
    publish: MyMQTT/21/1/V_TEMP 5.6
    0;0;3;0;9;send: 0-0-21-21 s=1,c=1,t=0,pt=0,l=5,st=fail:5.68r
    0;0;3;0;9;read: 21-21-0 s=1,c=1,t=0,pt=7,l=5:5.5
    

    so.. node 21 is just sending temp values, node 24 is the mixed temp/relay..

    As you may notice the 1 and zero code for the relay is getting mixed with the last received temp values, which seems to be ok if the last temp read is more than 10degrees resulting in a 1.xx value sent or a 0.xx value sent, which is accepted as a 1 or 0, but when it receives a value below 10 then it converts it to something like 047 or 147 which doesn't trigger the relay correctly! Please any help or guidance to understand where the 1 or 0 message is coming from?

    I imagine its what is being sent from the gateway sketch that is mixing the payload, but i cannot see how to reformulate what is sent to send only a 1 or 0 when sending to the relay...... ??

    MyMQTT/24/0/V_TEMP 23.9
    MyMQTT/21/1/V_TEMP 5.1
    MyMQTT/24/2/V_LIGHT 1
    MyMQTT/24/2/V_LIGHT 0
    MyMQTT/24/2/V_LIGHT 1
    

    =Sample of mqtt messages showing 24 node with v_temp and V_light on node 24 and v_temp on node 21



  • For ease of access here is the mqtt gateway sketch with the intro comments removed for pasting here,
    #include <SPI.h>
    #include <MySensor.h>
    #include "MyMQTTClient.h"
    #include "PubSubClient.h"

        #include <Ethernet.h>
        
        /*
         * To configure MQTTClientGateway.ino to use an ENC28J60 based board include
         * 'UIPEthernet.h' (SPI.h required for MySensors anyway). The UIPEthernet-library can be downloaded
         * from: https://github.com/ntruchsess/arduino_uip
         */
        
        //#include <UIPEthernet.h>
        /*
         * To execute MQTTClientGateway.ino on Yun uncomment Bridge.h and YunClient.h.
         * Do not include Ethernet.h or SPI.h in this case.
         * On Yun there's no need to configure local_ip and mac in the sketch
         * as this is configured on the linux-side of Yun.
         */
        
        //#include <Bridge.h>
        //#include <YunClient.h>
        // * Use this for IBOARD modded to use standard MISO/MOSI/SCK, see note *1 above!
        /*
         #define RADIO_CE_PIN        3			// radio chip enable
         #define RADIO_SPI_SS_PIN    8			// radio SPI serial select
         #define RADIO_ERROR_LED_PIN A2  		// Error led pin
         #define RADIO_RX_LED_PIN    A1  		// Receive led pin
         #define RADIO_TX_LED_PIN    A0  		// the PCB, on board LED*/
        
        // * Use this for default configured pro mini / nano etc :
        ///*
        #define RADIO_CE_PIN        7		// radio chip enable
        #define RADIO_SPI_SS_PIN    8		// radio SPI serial select
        #define RADIO_ERROR_LED_PIN 5		// Error led pin
        #define RADIO_RX_LED_PIN    6		// Receive led pin
        #define RADIO_TX_LED_PIN    9		// the PCB, on board LED*/
        
        //replace with ip of server you want to connect to, comment out if using 'remote_host'
        uint8_t remote_ip[] =
          { 192, 168, 0, 7 };
        //replace with hostname of server you want to connect to, comment out if using 'remote_ip'
        //char* remote_ip = "server.local";
        //replace with the port that your server is listening on
        #define remote_port 1883
        //replace with arduinos ip-address. Comment out if Ethernet-startup should use dhcp. Is ignored on Yun
        uint8_t local_ip[] = {192,168,0,10};
        //replace with ethernet shield mac. It's mandatory every device is assigned a unique mac. Is ignored on Yun
        uint8_t mac[] =
          { 0x90, 0xA2, 0xDA, 0x0D, 0x07, 0x02 };
        
        //////////////////////////////////////////////////////////////////
        
        #if defined remote_ip && defined remote_host
        #error "cannot define both remote_ip and remote_host at the same time!"
        #endif
        
        #ifdef _YUN_CLIENT_H_
        YunClient ethClient;
        #else
        EthernetClient ethClient;
        #endif
        
        void
        processMQTTMessages(char* topic, byte* payload, unsigned int length);
        
        PubSubClient client(remote_ip, remote_port, processMQTTMessages, ethClient);
        MyMQTTClient gw(client,RADIO_CE_PIN, RADIO_SPI_SS_PIN);
        
        void
        setup()
        {
          Ethernet.begin(mac, local_ip);
          delay(1000);   // Wait for Ethernet to get configured.
          gw.begin(RF24_PA_LEVEL_GW, RF24_CHANNEL, RF24_DATARATE,
          RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN);
        }
        
        void
        loop()
        {
          if (!client.connected())
            {
              client.connect("mysensor");
              client.subscribe("MyMQTT/#");
            }
          client.loop();
          gw.processRadioMessage();
        }
        
        void
        processMQTTMessages(char* topic, byte* payload, unsigned int length)
        {
          gw.processMQTTMessage(topic, payload, length);
        }


  • and here is the modified relay/temp sketch

    // 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>presen
        
        #define ONE_WIRE_BUS 3 // Pin where dallase 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
        
        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);
        
        void setup()  
        { 
          // Startup OneWire 
          sensors.begin();
        
          // Startup and initialize MySensors library. Set callback for incoming messages. 
          //gw.begin(); 
          gw.begin(incomingMessage, AUTO, true);
        
          // Send the sketch version information to the gateway and Controller
          gw.sendSketchInfo("Temp and Relays", "1.0");
        
          // 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++) {   
             gw.present(i, V_TEMP);
          }
        
          // Fetch relay status
          for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
            // Register all sensors to gw (they will be created as child devices)
            gw.present(sensor, S_LIGHT);
            // Then set relay pins in output mode
            pinMode(pin, OUTPUT);   
            // Set relay to last known state (using eeprom storage) 
            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<numSensors && 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
             digitalWrite(message.sensor-1+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());
           } 
        }


  • I guess this probably should have been in troubleshooting :S



  • Just guessing here, have you different child id's on the temp and relay?



  • No it seems like they are given the same child id's. Ok, so maybe i'l look at how to force a different child id for each sensor/actuator


  • Contest Winner

    the combining of the extensible sketches make it harder than needs to be.

    How many sensors are you connecting of each type?



  • Hi, i have 3 temp sensors and 2 relays, I am just looking at how to make this work but am not making much progress. Cant figure out how to assign the child id's. Any help would be appreciated.



  • was thinking of presenting the temps sensors first, and adding something like && i>NUMBER_OF_RELAYS to start assigining child id's above the range of relays? Will test and report back



  • 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?


  • Contest Winner

    @Gambituk said:

    #include <OneWire.h>presen

    #include <OneWire.h>presen
    

    do you still have this typo in your code?



  • no, i took it out (without effect) about an hour ago


  • Contest Winner

    @Gambituk

    try something like this:

    #define NUMBER_OF_TEMP_SENSORS 3
    
    void 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.1

    So 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 😄 )

    Thanks for the help so far!


  • Contest Winner

    @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...



  • @BulldogLowell

    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

    For 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.

    1. 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.. 😄

    1. 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: 0
    

    And 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
    
    1. So i am thinking it is still a problem with what is sent from gateway somehow... 😞

    Any ideas


  • Contest Winner

    @Gambituk

    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 0
    

    I 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!!!


  • Admin

    Not my code 🙂

    I have no idea what does. Especially the special check for V_LIGHT seems a bit peculiar.



  • Ok, well i guess you were listed on the sketch from before it was branched, but thanks for replying.

    As an update to my struggles 😉 i have found a workaround which might hint at a solution..

    If i publish :

    MyMQTT/25/5/V_LIGHT 0.0r
    MyMQTT/25/5/V_LIGHT 1.0r
    

    instead of

    MyMQTT/25/5/V_LIGHT 0
    MyMQTT/25/5/V_LIGHT 1
    

    Then it seems that it overwrites the scraps of the previous temp readings that are causing trouble, and activates the relay everytime.

    also.. interestingly if i publish 0.00r to my mqtt, then the gateway reads all the following temps with a trailing 0 eg 21.90 instead of 21.9 / or '1.9rr' instead of '1.9r' so it seems like it is storing a value somewhere and only overwriting the parts that are conflicting with the next received value.



  • @Gambituk said:

    @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 0
    

    I 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.

    Actually yes, I have a relay sketch that BulldogLowell helped me with in this thread:
    http://forum.mysensors.org/topic/901/relaywithbuttonactuator-another-n00b-question/7

    The idea behind the sketch is written in the thread, but the short story is that I needed two relays and when the button is pressed one goes on for a sec (then off) and the other goes on until i push the button again. So it's actually only controlling one relay, nothing else.
    By publishing...

    pi@raspberrypi ~ $ mosquitto_pub -r -t MyMQTT/23/1/V_LIGHT -m "1"
    pi@raspberrypi ~ $ mosquitto_pub -r -t MyMQTT/23/1/V_LIGHT -m "0"
    

    I can see the following...

    pi@raspberrypi ~ $ mosquitto_sub -v -t MyMQTT/#
    MyMQTT/23/1/V_LIGHT 1
    MyMQTT/23/1/V_LIGHT 0


  • ah, sorry, @gadu i dont think i explained clearly... what i wanted to see was what happens in the serial monitor on the gateway when those values are published (what gets sent over nrf to the node). thanks for trying that, i understand if you cant get serial monitor output. but if it was possible, i would really appreciate it



  • I'll get tomorrow. No worries 🙂



  • Thanks! That would be really useful



  • Here goes...

    This is the ProMini output from the monitor when I turn on and off the relay...

    send: 23-23-0-0 s=1,c=1,t=2,pt=2,l=2,st=ok:1
    read: 0-0-23 s=1,c=1,t=2,pt=2,l=2:1
    This is an ack from gateway
    Incoming change for sensor:1, New status: 1
    read: 0-0-23 s=1,c=1,t=2,pt=0,l=4:1.6r
    Incoming change for sensor:1, New status: 1
    send: 23-23-0-0 s=1,c=1,t=2,pt=2,l=2,st=ok:0
    read: 0-0-23 s=1,c=1,t=2,pt=2,l=2:0
    This is an ack from gateway
    Incoming change for sensor:1, New status: 0
    read: 0-0-23 s=1,c=1,t=2,pt=0,l=4:0.6r
    Incoming change for sensor:1, New status: 0
    

    This what I see on the gateway when I turn on and off the relay....

    publish: MyMQTT/23/1/V_LIGHT 1
    0;0;3;0;9;send: 0-0-23-23 s=1,c=1,t=2,pt=0,l=4,st=ok:1sor
    0;0;3;0;9;read: 23-23-0 s=1,c=1,t=2,pt=2,l=2:0
    0;0;3;0;9;send: 0-0-23-23 s=1,c=1,t=2,pt=2,l=2,st=ok:0
    publish: MyMQTT/23/1/V_LIGHT 0
    0;0;3;0;9;send: 0-0-23-23 s=1,c=1,t=2,pt=0,l=4,st=ok:0sor
    0;0;3;0;9;read: 23-23-0 s=1,c=1,t=2,pt=2,l=2:1
    0;0;3;0;9;send: 0-0-23-23 s=1,c=1,t=2,pt=2,l=2,st=ok:1
    

    I hope it helps.



  • That's perfect, that shows clearly that the problem is coming from the gateway sketch. I assume that the r on the end of both your and my output's is a termination character, and everything between the (1/0) and the 'r' in the gateway serial output is 'debris' left over from a previous output.. (for me a previous temp reading, for you something ending in 'so' .

    With my workaround from yesterday:- (publishing something like this from openhab or wherever mysensor:MyMQTT/25/4/V_LIGHT:command:ON:1.0r <-1.0r instead of just 1) , my relay reacts really fast and accurately when triggered and continues to work. Before it was very slow and not reliable.

    I am not sure if i will find the cause and be able to correct it but at least there is a workaround.

    Thanks for your time @gadu



  • No worries!



  • Hi! I'm starting to play with relay and I experiencing somethings similar. I have 3 sensors (two of them works great, just temperature, volt, light and humidity) one is relay sensor. First of all it just doesn't react to my commands:

    mosquitto_pub -p 1883 -h 10.0.0.11 -t MyMQTT/22/1/V_LIGHT -m "1"
    

    serial shows just this:

    connecting at 115200
    repeater started, id 22
    send: 22-22-0-0 s=255,c=0,t=18,pt=0,l=3,st=ok:1.4
    send: 22-22-0-0 s=255,c=3,t=6,pt=1,l=1,st=fail:0
    send: 22-22-0-0 s=255,c=3,t=11,pt=0,l=12,st=ok:Relay sketch
    send: 22-22-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 22-22-0-0 s=1,c=0,t=3,pt=0,l=3,st=ok:1.4
    

    I'm using stock http://www.mysensors.org/build/relay code, just setting node_id manually to 22.

    On the controller I have:

    0;0;3;0;9;read: 21-21-0 s=11,c=1,t=0,pt=7,l=5:23.0
    publish: MyMQTT/21/11/V_TEMP 23.0
    0;0;3;0;9;send: 0-0-21-21 s=11,c=1,t=0,pt=0,l=7,st=fail:23.0001
    0;0;3;0;9;send: 0-0-22-22 s=1,c=1,t=2,pt=0,l=7,st=fail:13.0001
    

    It looks like it tries to send '1' with garbage from last sensor read.

    It does this with my humidity sensor:

    publish: MyMQTT/21/12/V_VOLTAGE 5001
    0;0;3;0;9;send: 0-0-21-21 s=12,c=1,t=38,pt=0,l=4,st=ok:5001
    0;0;3;0;9;read: 21-21-0 s=10,c=1,t=1,pt=7,l=5:52.0
    publish: MyMQTT/21/10/V_HUM 52.0
    0;0;3;0;9;send: 0-0-21-21 s=10,c=1,t=1,pt=0,l=8,st=fail:52.05001
    

    I am also using MQTT client gateway which @gadu recommended me.

    I did not understood how does this workaround @Gambituk mention work. Do you know what is going on above? What am I doing wrong?

    P.S. Using standart EthernetGateway code also scrambles messages (please note strange sing after '1'):

    0;0;3;0;9;read: 22-22-0 s=255,c=3,t=11,pt=0,l=12:Relay sketch
    0;0;3;0;9;read: 22-22-0 s=255,c=3,t=12,pt=0,l=3:1.0
    0;0;3;0;9;read: 22-22-0 s=1,c=0,t=3,pt=0,l=3:1.4
    0;0;3;0;9;send: 0-0-22-22 s=1,c=1,t=2,pt=0,l=2,st=ok:1à
    0;0;3;0;9;read: 0-1-22 s=1,c=1,t=2,pt=0,l=2:1à
    0;0;3;0;9;read: 21-21-0 s=12,c=1,t=38,pt=4,l=4:5023
    MyMQTT/21/12/V_VOLTAGE
    
    0;0;3;0;9;send: 0-0-22-22 s=1,c=1,t=2,pt=0,l=2,st=fail:1à
    

    after this relay node does not accept any message (you can see st=fail on the last line - that was me retrying mosquitto_pub -p 1883 -h 10.0.0.34 -t MyMQTT/22/1/V_LIGHT -m "1").



  • Sorry, i just saw this, do you still have the issue or is it resolved?



  • I still have it. I need to check how this is (not)working in single sensor environment. I will laso try not to set IT manually. Only if I get some tim to do it...



  • I have reconnected it again and it did just starte to work as it should from the start. I changed nothing. Strange...



  • What i think happens.. in my own way of thinking!

                          1 2 3 4 5 6 7 8
                          B a d v a l u e      something longer than expected
                        1 1 . 4 v a l u e        next value is 11.4 but longer value stays in a register somewhere
                        2 1 . 6 5 7 l u e       and is mixed with the next value -
                        1 2 . 5 5 7 l u e       until restart or overwrite -
    

    So i think there is something that needs to be changed to control the length of expected values or actual values to adapt to whatever data arrives.

    For my workaround, send 1.0 and 0.0 instead of 1 and 0 seems to force the sketch to round the value to 1 or 0 even when there is "1.0dvalue" as the received instruction.



  • http://forum.mysensors.org/topic/524/mqtt-client-gateway/29 There is a proposed solution in the following post, i will test and see if it helps, and report back.



  • Initial tests seem that it is now resolved with the fixed version of the mqttclient gateway as modified by fotofieber



  • I try this code on pro mini with Vera3 but then I implementing it I have a DOOR Switch instead of Ds18b20. So is it possile to show temperature on vera and what's wrong?

    repeater started, id 1
    send: 1-1-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=25,st=ok:Liquid warm floore relay 
    send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 1-1-0-0 s=0,c=0,t=0,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=1,c=0,t=0,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=2,c=0,t=0,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=4,c=0,t=3,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=5,c=0,t=3,pt=0,l=5,st=ok:1.4.1
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=ok:28.6
    send: 1-1-0-0 s=1,c=1,t=0,pt=7,l=5,st=ok:28.2
    send: 1-1-0-0 s=2,c=1,t=0,pt=7,l=5,st=ok:28.5
    

  • Admin

    @tjay4x4

    We can't help you much without any code.



  • Sorry. 🙂 Hek, I using this code. Vera3 find relay and it works, but also appears 3 door sensors instead of 3 temp sensors.
    I try to use the my arduino board only with sd18b20 sketch and it work's and show temperature. Is it sketch suitale for vera?

    @Gambituk said:

    and here is the modified relay/temp sketch

    // 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>presen
        
        #define ONE_WIRE_BUS 3 // Pin where dallase 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
        
        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);
        
        void setup()  
        { 
          // Startup OneWire 
          sensors.begin();
        
          // Startup and initialize MySensors library. Set callback for incoming messages. 
          //gw.begin(); 
          gw.begin(incomingMessage, AUTO, true);
        
          // Send the sketch version information to the gateway and Controller
          gw.sendSketchInfo("Temp and Relays", "1.0");
        
          // 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++) {   
             gw.present(i, V_TEMP);
          }
        
          // Fetch relay status
          for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
            // Register all sensors to gw (they will be created as child devices)
            gw.present(sensor, S_LIGHT);
            // Then set relay pins in output mode
            pinMode(pin, OUTPUT);   
            // Set relay to last known state (using eeprom storage) 
            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<numSensors && 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
             digitalWrite(message.sensor-1+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());
           } 
        }

Log in to reply
 

Suggested Topics

  • 4
  • 199
  • 16
  • 16
  • 9
  • 1
  • 4
  • 5

13
Online

11.4k
Users

11.1k
Topics

112.7k
Posts