Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. jantup
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    jantup

    @jantup

    0
    Reputation
    4
    Posts
    369
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    jantup Follow

    Best posts made by jantup

    This user hasn't posted anything yet.

    Latest posts made by jantup

    • RE: No communication between Sensor and Gateway

      Hi,

      Sketches needs not to be changed. Node IDs are not encoded in software, they are data from MySensors perspective. Nodes doesn't manage IDs themselves, but any node need an ID in order to communicate. Assigning node IDs must be done from outside MySensors network and totally depends on the controller you use.

      I use OpenHab as a controller, you can automate (code) ID assigning there.

      Honestly, I myself am too lazy and still assign node IDs manually by sending appropriate string to controller's USB port the gateway is attached to from command line as a response to gateway when a node asks for ID on the nodes radio network. You can do the same without even having a controller, just attach the gateway node to a computer through USB, monitor what's incoming and send the right string back to the USB port when you see a node asking for the ID.

      I was very surprised when I found out that MySensors nodes network is not self-sufficient in this sense. You can see how I figured it out here, but as I said, it really depends on the controller you use.

      posted in Troubleshooting
      jantup
      jantup
    • RE: No communication between Sensor and Gateway

      When I started with MySensors recently, I got non-communication because I didn't assign the gateway and the sensor node an ID so they can identify themselves during communication. Seeing node ID's 0 and 255 on your logs, my first question would be: did you assign node ID's (from controller)?

      posted in Troubleshooting
      jantup
      jantup
    • RE: messages from sensor doesn't seem to appear on gateway, st=ok [solved]

      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 🙂

      posted in Troubleshooting
      jantup
      jantup
    • messages from sensor doesn't seem to appear on gateway, st=ok [solved]

      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;
      
      
      
      posted in Troubleshooting
      jantup
      jantup