Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. messages from sensor doesn't seem to appear on gateway, st=ok [solved]

messages from sensor doesn't seem to appear on gateway, st=ok [solved]

Scheduled Pinned Locked Moved Troubleshooting
2 Posts 1 Posters 1.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jantup
    wrote on last edited by jantup
    #1

    Hi,

    I'm trying to put very basic config together for the first time and it seem that I'm missing something very obvious here.

    I have made a serial GW connected to RPi2 running OpenHAB 1.7.0 on top of Ubuntu server and sensor node with 3 sensors attached: DHT temperature and humidity, BMP180 pressure and simple soil moisture. Both Adruinos are Pro Mini. I have downloaded 1.4.1 MySensors library, I use Arduino IDE 1.6.4 on OS X.

    I have put together sensor node sketch from library examples. After some tinkering it seem to me that I've got communication flowing, but messages seem empty! I've looked at it for a while, tried to google it but with no result so far.

    Please help me with advice! I will read detailed API and protocol descriptions meanwhile :)

    Here is sensor node sketch:

    #include <SPI.h>
    #include <MySensor.h>  
    #include <DHT.h>  
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_DHT_TEMP 1
    #define CHILD_ID_BARO 2
    #define CHILD_ID_BMP_TEMP 3
    #define CHILD_ID_SOIL_MOIST 4
    
    #define HUMIDITY_SENSOR_DIGITAL_PIN 4
    
    #define SOIL_MOISTURE_SENSOR_ANALOG_PIN 0
    
    const float ALTITUDE = 20; // <-- adapt this value to your own location's altitude.
    
    const unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    
    const char *weather[] = { "stable", "sunny", "cloudy", "unstable", "thunderstorm", "unknown" };
    enum FORECAST
    {
    	STABLE = 0,			// "Stable Weather Pattern"
    	SUNNY = 1,			// "Slowly rising Good Weather", "Clear/Sunny "
    	CLOUDY = 2,			// "Slowly falling L-Pressure ", "Cloudy/Rain "
    	UNSTABLE = 3,		// "Quickly rising H-Press",     "Not Stable"
    	THUNDERSTORM = 4,	// "Quickly falling L-Press",    "Thunderstorm"
    	UNKNOWN = 5			// "Unknown (More Time needed)
    };
    
    Adafruit_BMP085 bmp = Adafruit_BMP085();      // BMP180 Digital Pressure Sensor 
    DHT dht;      // DHT Temperature and humidity sensor
    MySensor gw;
    
    float lastDHTTemp = -1;
    float lastHum = -1;
    float DHTtemperature = -1;
    float humidity = -1;
    
    boolean metric = true;
    
    float lastPressure = -1;
    float lastBMPTemp = -1;
    int lastForecast = -1;
    
    const int LAST_SAMPLES_COUNT = 5;
    float lastPressureSamples[LAST_SAMPLES_COUNT];
    
    // this CONVERSION_FACTOR is used to convert from Pa to kPa in forecast algorithm
    // get kPa/h be dividing hPa by 10 
    #define CONVERSION_FACTOR (1.0/10.0)
    
    int minuteCount = 0;
    bool firstRound = true;
    float pressureAvg[7];
    
    float dP_dt;
    
    int lastSoilMoisture = -1;
    int soilMoisture = -1;
    
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgDHTTemp(CHILD_ID_DHT_TEMP, V_TEMP);
    MyMessage msgBMPTemp(CHILD_ID_BMP_TEMP, V_TEMP);
    MyMessage msgPressure(CHILD_ID_BARO, V_PRESSURE);
    MyMessage msgForecast(CHILD_ID_BARO, V_FORECAST);
    
    MyMessage msgSoilMoisture(CHILD_ID_SOIL_MOIST, V_RAIN);
    
    
    void setup()  
    { 
      gw.begin();
    
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); 
    
      if (!bmp.begin()) 
      {
        Serial.println("Could not find a valid BMP085 sensor, check wiring!");
        while (1) {}
      }
    
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("Outside sensor", "0.01");
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_HUM, S_HUM);
      gw.present(CHILD_ID_DHT_TEMP, S_TEMP);
      gw.present(CHILD_ID_BARO, S_BARO);
      gw.present(CHILD_ID_BMP_TEMP, S_TEMP);
      gw.present(CHILD_ID_SOIL_MOIST, S_RAIN);
    
      metric = gw.getConfig().isMetric;
    }
    
    void loop()      
    {  
    
      // ****** DHT ******
    
      delay(dht.getMinimumSamplingPeriod());
    
      DHTtemperature = dht.getTemperature();
      if (isnan(DHTtemperature)) {
          Serial.println("Failed reading temperature from DHT");
      } else if (DHTtemperature != lastDHTTemp) {
        lastDHTTemp = DHTtemperature;
        if (!metric) {
          DHTtemperature = dht.toFahrenheit(DHTtemperature);
        }
        gw.send(msgDHTTemp.set(DHTtemperature, 1));
        Serial.print("DHT Temperature: ");
        Serial.println(DHTtemperature);
      }
      
      humidity = dht.getHumidity();
      if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
      } else if (humidity != lastHum) {
          lastHum = humidity;
          gw.send(msgHum.set(humidity, 1));
          Serial.print("Humidity: ");
          Serial.println(humidity);
      }
    
      // ****** BMP ******
      
      float pressure = bmp.readSealevelPressure(ALTITUDE) / 100.0;
      float BMPtemperature = bmp.readTemperature();
      
      if (!metric) 
      {
        // Convert to fahrenheit
        BMPtemperature = BMPtemperature * 9.0 / 5.0 + 32.0;
      }
      
      int forecast = sample(pressure);
      
      Serial.print("BMP Temperature = ");
      Serial.print(BMPtemperature);
      Serial.println(metric ? " *C" : " *F");
      Serial.print("Pressure = ");
      Serial.print(pressure);
      Serial.println(" hPa");
      Serial.print("Forecast = ");
      Serial.println(weather[forecast]);
      
      if (BMPtemperature != lastBMPTemp) 
      {
        gw.send(msgBMPTemp.set(BMPtemperature, 1));
        lastBMPTemp = BMPtemperature;
      }
      
      if (pressure != lastPressure) 
      {
        gw.send(msgPressure.set(pressure, 0));
        lastPressure = pressure;
      }
      
      if (forecast != lastForecast)
      {
        gw.send(msgForecast.set(weather[forecast]));
        lastForecast = forecast;
      }
    
      // ****** Soil moisture ******
      
      soilMoisture = analogRead(SOIL_MOISTURE_SENSOR_ANALOG_PIN);
      
      Serial.print("Soil moisture (0-1023) = ");
      Serial.println(soilMoisture);
      
      if (soilMoisture != lastSoilMoisture) 
      {
        gw.send(msgSoilMoisture.set(soilMoisture, 1));
        lastSoilMoisture = soilMoisture;
      }
      
      gw.sleep(SLEEP_TIME); //sleep a bit
    }
    
    float getLastPressureSamplesAverage()
    {
    	float lastPressureSamplesAverage = 0;
    	for (int i = 0; i < LAST_SAMPLES_COUNT; i++)
    	{
    		lastPressureSamplesAverage += lastPressureSamples[i];
    	}
    	lastPressureSamplesAverage /= LAST_SAMPLES_COUNT;
    
    	return lastPressureSamplesAverage;
    }
    
    // Algorithm found here
    // http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
    // Pressure in hPa -->  forecast done by calculating kPa/h
    int sample(float pressure)
    {
    	// Calculate the average of the last n minutes.
    	int index = minuteCount % LAST_SAMPLES_COUNT;
    	lastPressureSamples[index] = pressure;
    
    	minuteCount++;
    	if (minuteCount > 185)
    	{
    		minuteCount = 6;
    	}
    
    	if (minuteCount == 5)
    	{
    		pressureAvg[0] = getLastPressureSamplesAverage();
    	}
    	else if (minuteCount == 35)
    	{
    		pressureAvg[1] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[1] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) // first time initial 3 hour
    		{
    			dP_dt = change * 2; // note this is for t = 0.5hour
    		}
    		else
    		{
    			dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value.
    		}
    	}
    	else if (minuteCount == 65)
    	{
    		pressureAvg[2] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[2] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) //first time initial 3 hour
    		{
    			dP_dt = change; //note this is for t = 1 hour
    		}
    		else
    		{
    			dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value
    		}
    	}
    	else if (minuteCount == 95)
    	{
    		pressureAvg[3] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[3] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) // first time initial 3 hour
    		{
    			dP_dt = change / 1.5; // note this is for t = 1.5 hour
    		}
    		else
    		{
    			dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value
    		}
    	}
    	else if (minuteCount == 125)
    	{
    		pressureAvg[4] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[4] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) // first time initial 3 hour
    		{
    			dP_dt = change / 2; // note this is for t = 2 hour
    		}
    		else
    		{
    			dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value
    		}
    	}
    	else if (minuteCount == 155)
    	{
    		pressureAvg[5] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[5] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) // first time initial 3 hour
    		{
    			dP_dt = change / 2.5; // note this is for t = 2.5 hour
    		}
    		else
    		{
    			dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value
    		}
    	}
    	else if (minuteCount == 185)
    	{
    		pressureAvg[6] = getLastPressureSamplesAverage();
    		float change = (pressureAvg[6] - pressureAvg[0]) * CONVERSION_FACTOR;
    		if (firstRound) // first time initial 3 hour
    		{
    			dP_dt = change / 3; // note this is for t = 3 hour
    		}
    		else
    		{
    			dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value
    		}
    		pressureAvg[0] = pressureAvg[5]; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
    		firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
    	}
    
    	int forecast = UNKNOWN;
    	if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
    	{
    		forecast = UNKNOWN;
    	}
    	else if (dP_dt < (-0.25))
    	{
    		forecast = THUNDERSTORM;
    	}
    	else if (dP_dt > 0.25)
    	{
    		forecast = UNSTABLE;
    	}
    	else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
    	{
    		forecast = CLOUDY;
    	}
    	else if ((dP_dt > 0.05) && (dP_dt < 0.25))
    	{
    		forecast = SUNNY;
    	}
    	else if ((dP_dt >(-0.05)) && (dP_dt < 0.05))
    	{
    		forecast = STABLE;
    	}
    	else
    	{
    		forecast = UNKNOWN;
    	}
    
    	return forecast;
    }
    

    Sensor node log:

    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    sensor started, id 255
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    DHT Temperature: 23.00
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Humidity: 48.70
    
    BMP Temperature = 23.20 *C
    
    Pressure = 1016.88 hPa
    
    Forecast = unknown
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Soil moisture (0-1023) = 1023
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Humidity: 48.90
    
    BMP Temperature = 23.20 *C
    
    Pressure = 1016.83 hPa
    
    Forecast = unknown
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Soil moisture (0-1023) = 1023
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    DHT Temperature: 23.10
    
    BMP Temperature = 23.30 *C
    
    Pressure = 1016.83 hPa
    
    Forecast = unknown
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Soil moisture (0-1023) = 1023
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Humidity: 49.20
    
    BMP Temperature = 23.30 *C
    
    Pressure = 1016.85 hPa
    
    Forecast = unknown
    
    req node id
    send: 255-255-0-0 s=255,c=3,t=3,pt=0,l=0,st=ok:
    Soil moisture (0-1023) = 1023
    

    Extract from OpenHAB log, specifically what it gets on serial:

    2015-08-01 15:07:31.604 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;14;Gateway startup complete.
    
    2015-08-01 15:09:08.070 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:10.073 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:12.082 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:14.088 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:16.099 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:18.106 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:20.114 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:24.126 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:26.139 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:28.193 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:30.200 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:32.207 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:09:34.217 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:10:07.495 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:10:09.551 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:10:42.826 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:10:44.885 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:11:18.159 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    2015-08-01 15:11:20.215 [INFO ] [runtime.busevents             ] - Arduino_serial state updated to 0;0;3;0;9;read: 255-255-0 s=255,c=3,t=3,pt=0,l=0:
    255;255;3;0;3;
    
    
    
    1 Reply Last reply
    0
    • J Offline
      J Offline
      jantup
      wrote on last edited by
      #2

      ok, I got where my fundamental mistake was: I was thinking that GW is managing node ID's...

      this helped me

      ok, headed to OpenHAB now :)

      1 Reply Last reply
      0

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      16

      Online

      12.0k

      Users

      11.2k

      Topics

      113.4k

      Posts


      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • MySensors
      • OpenHardware.io
      • Categories
      • Recent
      • Tags
      • Popular