Weather Station with Scene Activator!!!


  • Hero Member

    Now I ran int to the next issue. How do I know which pin the SDA and SCL should be connected to??

    Is it this line that defines it?

    LiquidCrystal_I2C lcd(0x27,20,4);
    

    So what should it be if I'm using a Pro Mini?


  • Hero Member

    I think I found it now... For the Pro Mini it is like this:

    "I2C: A4 (SDA) and A5 (SCL). Support I2C (TWI) communication using the Wire library."

    I was expecting it to be declared somehow in the sketch so I got confused... Well I learned something once again...


  • Contest Winner

    @korttoma hey, glad you have it figured out.

    I have been very busy and haven't been able to check in here for a while:(

    all working now?


  • Hero Member

    Yepp, all working now. Just need to find some time to make my deviec


  • Hero Member

    Hi @BulldogLowell (or anybody else),I'm hoping you could help me with one last thing to finish this project of mine.

    The issue I'm facing is that I do not know how to send a "string" from Vera using luup. Or basically collecting a string from a variable of one device and sending it to a MySensors node. Here is what I tried:

    local text = luup.variable_get("urn:empuk-net:serviceId:SimpleAlarm1","StatusLabel", 319)
    
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=text}, 276)
    

    If I give the variable "text" a numeric value it is sent and received without problems but how the h**l can I send a string??

    Grateful for any help


  • Hero Member

    One step closer:

    local text = "Test"
    
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=text}, 276)
    

    Instantly prints the text "Test" on my display 😄
    Seems like my issue is that I can not get the text from the SimpleAlarm Variable "StatusLable".

    any suggestions?


  • Hero Member

    Solved! 😄

    local status_label = luup.variable_get("urn:upnp-empuk-net:serviceId:SimpleAlarm1", "StatusLabel", 319)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=status_label}, 276)
    

    Found my answere from the vera forum:
    http://forum.micasaverde.com/index.php/topic,23942.msg168373.html#msg168373


  • Contest Winner

    @korttoma said:

    Solved! 😄

    local status_label = luup.variable_get("urn:upnp-empuk-net:serviceId:SimpleAlarm1", "StatusLabel", 319)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=status_label}, 276)
    

    Found my answere from the vera forum:
    http://forum.micasaverde.com/index.php/topic,23942.msg168373.html#msg168373

    Hye korttoma,

    Did you finish this project?

    I have a bit of time and thought I would convert my weather station up to the new mySensors version... was wondering if you could share your work...


  • Hero Member

    @BulldogLowell

    Hi Jim, Yeah I finished it. there is a few posts about it over in heks scene controller thread -> http://forum.mysensors.org/topic/446/scene-controller


  • Contest Winner

    Tomas,

    My business has kept me away from this, I guess I didn't notice how far along you took it... brilliant job!

    I'll check in when it's done.

    Thanks mate.

    jim


  • Contest Winner

    Tomas,

    Again, thanks for your example. I have to say, it helped a lot.

    I am however struggling with radio communication it seems and I am wondering at this point what I am doing wrong, having spent a couple hours trying to find my errors.

    Would you mind to take a look for anything you may see:

    #define STATES 7
    #define HUMIDITY_SENSOR_DIGITAL_PIN 4
    #define DEBUG
    
    #ifdef DEBUG
    #define DEBUG_SERIAL(x) Serial.begin(x)
    #define DEBUG_PRINT(x) Serial.print(x)
    #define DEBUG_PRINTLN(x) Serial.println(x)
    #else
    #define DEBUG_SERIAL(x)
    #define DEBUG_PRINT(x) 
    #define DEBUG_PRINTLN(x) 
    #endif
    
    #include <Wire.h>
    #include <Time.h>
    #include <SPI.h>
    #include <MySensor.h>
    #include <LiquidCrystal_I2C.h>
    #include <DHT.h> 
    //
    #define RADIO_ID 11
    #define CHILD_ID_SCENE 3
    //
    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display
    //
    void (*lcdDisplay[STATES])();
    //
    byte state = 0;
    byte lastState;
    byte timeCounter = 0;
    unsigned long lastTime;
    unsigned long refreshInterval = 3000UL;
    unsigned long lastClockSet;
    boolean isMessage = false;
    float insideTemperature;
    float humidity;
    int OutdoorTemp = -99;
    int OutdoorHumidity = -99;
    int todayHigh = -99; 
    int todayLow = -99;
    String conditions = "Not yet Reported";
    String FreeMessage = "No Message recieved"; //*****
    int ledStatus = 1;// to toggle LCD backlight led
    //int ledLevel = 254;
    boolean buttonPushed = false;
    //
    MySensor gw;
    DHT dht;
    //
    MyMessage msgOn(CHILD_ID_SCENE, V_SCENE_ON);
    MyMessage msgOff(CHILD_ID_SCENE, V_SCENE_OFF);
    MyMessage msgVAR1(CHILD_ID_SCENE, V_VAR1);
    MyMessage msgVAR2(CHILD_ID_SCENE, V_VAR2);
    MyMessage msgVAR3(CHILD_ID_SCENE, V_VAR3);
    MyMessage msgVAR4(CHILD_ID_SCENE, V_VAR4);
    MyMessage msgVAR5(CHILD_ID_SCENE, V_VAR5);
    //
    void setup()  
    { 
      DEBUG_SERIAL(115200);
      DEBUG_PRINTLN(F("Serial started"));
      attachInterrupt(1, PushButton, CHANGE);
      //
      lcdDisplay[0] = lcdDisplay0;
      lcdDisplay[1] = lcdDisplay1;
      lcdDisplay[2] = lcdDisplay2;
      lcdDisplay[3] = lcdDisplay3;
      lcdDisplay[4] = lcdDisplay4;
      lcdDisplay[5] = lcdDisplay5;
      lcdDisplay[6] = lcdDisplay6;
      //
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
      gw.begin(TempStatus, RADIO_ID);
      gw.sendSketchInfo("WeatherClock", "1.0");
      gw.present(CHILD_ID_SCENE, S_SCENE_CONTROLLER);
      int clockTimer;
      while(timeStatus() != timeSet && clockTimer < 10)
      {
        gw.requestTime(receiveTime);
        Serial.println("getting Time");
        delay(500);
        clockTimer++;
      }
      //
      lcd.init();
      lcd.clear();
      lcd.backlight();
      lcd.setCursor(0, 0);
      lcd.print("Hello World!!!");
      delay(2000);
      lcd.clear();
      lastTime = millis();
    }
    void loop()      
    {
      gw.process();
      if (millis() - lastClockSet >= 60000UL)
      {
        gw.requestTime(receiveTime);
        lastClockSet = millis();
      }
      if (millis() - lastTime >= refreshInterval)
      {
        state++;
        if (state > STATES - 1) state = 0;
        DEBUG_PRINTLN(F("State:")); 
        DEBUG_PRINTLN(state);
        lastTime += refreshInterval;
        getTempHumidity();
      }
      if (state != lastState) 
      {
        fastClear();
        lcdDisplay[state]();
      }
      lastState = state;
      if (buttonPushed)
      {
        activateScene();
      }
    }
    void fastClear()
    {
      lcd.setCursor(0,0);
      lcd.print("                ");
      lcd.setCursor(0,1);
      lcd.print("                ");
    }
    //
    void lcdDisplay0()
    {
      lcd.setCursor(0,0);
      lcd.print(F("Time: "));
      if (hourFormat12() < 10) lcd.print("0");
      lcd.print(hourFormat12());
      lcd.print(":");
      if (minute() < 10) lcd.print("0");
      lcd.print(minute());
      DEBUG_PRINT(F("Time:"));
      DEBUG_PRINTLN(hourFormat12());
      lcd.setCursor(0,1);
      lcd.print(F("Date: "));
      if (month() < 10) lcd.print("0");
      lcd.print(month());
      lcd.print("/");
      if (day() < 10) lcd.print("0");
      lcd.print(day());
      lcd.print("/");
      lcd.print(year());
      DEBUG_PRINTLN(F("Date: 01.11.2014"));
    }
    void lcdDisplay1()
    {
      lcd.setCursor(0,0);
      lcd.print(F("Indoor Temp:"));
      lcd.print(int(insideTemperature));
      lcd.print(char(223));
      DEBUG_PRINT(F("Indoor Temp:")); 
      DEBUG_PRINT(int(insideTemperature)); 
      DEBUG_PRINTLN(F("F"));
      lcd.setCursor(0,1);
      lcd.print("   Humidity:");
      lcd.print(int(humidity));
      lcd.print(F("%"));
      DEBUG_PRINT("   Humidity:");
      DEBUG_PRINT(int(humidity));
      DEBUG_PRINTLN(F("F"));
    }
    void lcdDisplay2()
    {
      lcd.setCursor(0,0);
      lcd.print("Outdoor Temp:"); 
      lcd.print(OutdoorTemp); 
      lcd.print(char(223));
      DEBUG_PRINT(F("Outdoor Temp:"));
      DEBUG_PRINTLN(OutdoorTemp);
      lcd.setCursor(0,1);
      lcd.print(F("    Humidity:")); 
      lcd.print(OutdoorHumidity); 
      lcd.print(F("%"));
      DEBUG_PRINT(F("    Humidity:"));
      DEBUG_PRINTLN(OutdoorHumidity);
    }
    void lcdDisplay3()
    {
      lcd.setCursor(0,0);
      lcd.print(F("Today's HI:"));
      lcd.print(todayHigh); 
      lcd.print(char(223));
      DEBUG_PRINT(F("Today's HIGH"));
      DEBUG_PRINTLN(todayHigh);
      lcd.setCursor(0,1);
      lcd.print(F("        LO:"));
      lcd.print(todayLow); 
      lcd.print(char(223));
      DEBUG_PRINT(F("Today's LOW"));
      DEBUG_PRINTLN(todayLow);
    }
    void lcdDisplay4()
    {
      lcd.setCursor(0,0);
      lcd.print(F("Today's Weather is"));
      DEBUG_PRINTLN(F("Today's Weather:"));
      lcd.setCursor(0,1);
      lcd.print(conditions);
      DEBUG_PRINTLN(F("EXAMPLE"));
    }
    void lcdDisplay5()
    {
      if (isMessage)
      {
        lcd.setCursor(0,0);
        lcd.print(F("****Message****"));
        DEBUG_PRINTLN(F("****Message****"));
        lcd.setCursor(0,1);
        lcd.print(F("Custom Message"));
        DEBUG_PRINTLN(F("Custom Message"));
      }
      else
      {
        lcd.setCursor(0,0);
        lcd.print(F("****Message****"));
        DEBUG_PRINTLN(F("****Message****"));
        lcd.setCursor(0,1);
        lcd.print(F("Have a Nice Day"));
        DEBUG_PRINTLN(F("Have a Nice Day"));
      }
    }
    void lcdDisplay6()
    {
      lcd.setCursor(0,0);
      lcd.print(F(" Weather & Time "));
      DEBUG_PRINTLN(F(" Weather & Time "));
      lcd.setCursor(0,1);
      lcd.print(F("by BulldogLowell"));
      DEBUG_PRINTLN(F("by BulldogLowell")); 
    }
    
    //
    void getTempHumidity()
    {
      insideTemperature = dht.toFahrenheit(dht.getTemperature());
      if (isnan(insideTemperature)) 
      {
        DEBUG_PRINTLN(F("Failed reading temperature from DHT"));
      } 
      humidity = dht.getHumidity();
      if (isnan(humidity)) 
      {
        DEBUG_PRINTLN(F("Failed reading humidity from DHT"));
      } 
    }
    //
    void receiveTime(unsigned long time)
    {
      DEBUG_PRINTLN(F("Time value received: "));
      DEBUG_PRINTLN(time);
      setTime(time);
    }
    //
    void PushButton()
    {
      static unsigned long last_interrupt_time = 0;
      unsigned long interrupt_time = millis();
      if (interrupt_time - last_interrupt_time > 200)
      {
        buttonPushed = true;
      }
      last_interrupt_time = interrupt_time;
    }
    //
    void activateScene()
    {
      DEBUG_PRINTLN(F("ButtonPushed"));
      fastClear();
      for (byte i = 0; i < 10; i++)
      {
        lcd.noBacklight();
        delay(50);
        lcd.backlight();
        delay(50);
      }
      lcd.setCursor(0,0);
      lcd.print(F(" A/C Boost Mode "));
      lcd.setCursor(0,1);
      lcd.print(F("**** ACTIVE ****"));
      delay(2000);
      buttonPushed = false;
      lastTime = millis(); //Reset the timer to even out display interval
    }
    //
    void TempStatus(const MyMessage &message)
    {
      if (message.type == V_VAR1)
      {
        OutdoorTemp = atoi(message.data);
        DEBUG_PRINTLN(F("OutdoorTemp recieved:"));
        DEBUG_PRINTLN(OutdoorTemp);
      }
      if (message.type == V_VAR2)
      {
        OutdoorHumidity = atoi(message.data);
        DEBUG_PRINT(F("OutdoorHumidity recieved:"));
        DEBUG_PRINTLN(OutdoorHumidity);
      }
      if (message.type == V_VAR3)
      {
        todayLow = atoi(message.data);
        DEBUG_PRINT(F("Today's LOW:"));
        DEBUG_PRINTLN(todayLow);
      }
    
      if (message.type == V_VAR4)
      {
        todayHigh = atoi(message.data);
        DEBUG_PRINT(F("Today's HIGH:"));
        DEBUG_PRINTLN(todayHigh);
      }
      if (message.type == V_VAR5)
      {
        conditions = String(message.data);
      }
    }
    

    my error looks like this:

    Serial started
    sensor started, id 11
    send: 11-11-0-0 s=255,c=0,t=17,pt=0,l=3,st=fail:1.4
    send: 11-11-0-0 s=255,c=3,t=6,pt=1,l=1,st=fail:0
    send: 11-11-0-0 s=255,c=3,t=11,pt=0,l=12,st=fail:WeatherClock
    send: 11-11-0-0 s=255,c=3,t=12,pt=0,l=3,st=fail:1.0
    send: 11-11-0-0 s=3,c=0,t=25,pt=0,l=3,st=fail:1.4
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=3,st=fail:1.4
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=3,st=fail:1.4
    send: 11-11-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=0,st=fail:
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=0,st=fail:
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=0,st=fail:
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=0,st=fail:
    getting Time
    send: 11-11-0-0 s=255,c=3,t=1,pt=0,l=0,st=fail:
    getting Time
    State:
    1
    Indoor Temp:71F
       Humidity:46F
    State:
    2
    Outdoor Temp:-99
        Humidity:-99
    State:
    3
    Today's HIGH-99
    Today's LOW-99
    State:
    

    My lua code server-side is this:

    local temp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 60)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_1", value=temp}, 85)
    
     local humid = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1","CurrentLevel", 63)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_2", value=humid}, 85)
    
    local low = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 61)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=low}, 85)
    
    local high = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 62)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_4", value=high}, 85)
    
    local conditions = luup.variable_get("urn:upnp-org:serviceId:Weather1","CurrentTemperature", 59)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_5", value=conditions}, 85)

  • Contest Winner

    I added delays in the lua code and that seemed to help a lot:

    local temp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 60)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_1", value=temp}, 85)
    
    luup.sleep(750)
    
    local humid = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1","CurrentLevel", 63)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_2", value=humid}, 85)
    
    luup.sleep(750)
    
    local low = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 61)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=low}, 85)
    
    luup.sleep(750)
    
    local high = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 62)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_4", value=high}, 85)
    
    luup.sleep(750)
    
    local conditions = luup.variable_get("urn:upnp-org:serviceId:Weather1","CurrentTemperature", 59)
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_5", value=conditions}, 85)
    

    still struggling with this, however:

    if (message.type == V_VAR5)
    {
      conditions = String(message.data);
      DEBUG_PRINT(F("Received today's Conditions:"));
      DEBUG_PRINTLN(conditions);
    }
    

    not returning the present conditions....


  • Contest Winner

    also noticed that variable5 (V_VAR5) does not show up here (in device 85):

    Screen Shot 2014-11-02 at 1.19.11 AM.png


  • Hero Member

    @BulldogLowell

    I do have all 5 variables listed under my scene-controler device. Do you still get the failed for getting time in your serial print? Seems like you might have "general" communication issues, you have cap on the radio? Try a different power source or temporarily move your device closer to the gateway. I had some similar problems when trying to use the PA+LNA radio module so I switched to a regular one and that one works fine. I wanted to use the PA+LNA version because the device is quite far from GW and I did not think the regular one could handle the distance but it did.

    Thanks for showing me how to add a delay to the lua code btw, I newer figured that out so I only ewer sent two variables at a time. Btw, does the delay affect vera in any way? I thought I read somewhere that the unit does not do anything during sleep.


  • Contest Winner

    Tomas,

    (and I'm opening this up to anyone who knows how to work messages into more than one device )

    well, I figured out the problem of "conditions" which was the wrong serviceId in the lua coding for that variable.

    Regarding the delay, if you luup.sleep() for anything that approaches a second, your Vera will restart 😞 so I figure that the 750ms would be OK. I am concerned about it being incommunicado so often, so I'll probably put the transmissions into different scenes.

    I definitely have a communication issue... and it bothers me a bit. I have all that, capacitors on the antenna, etc. I think I have a bad node and its likely my PhoneyTV. Whenever I 'manually' toggle the lights using the Vera interface, it seems to lock up the gateway.... More on that to come.

    I really appreciate your sharing the code. In retrospect, it seems that the latest mySensors implementation is a lot more elegant with respect to setting up communications like these, but the example helped immensely.

    I'm now tripping up on using variables in the second device: Can I recycle the variables here (e.g. V_VAR1) or must I create another instance of gw?

    MySensor gw;
    DHT dht;
    //
    MyMessage msgOn(CHILD_ID_SCENE, V_SCENE_ON);
    MyMessage msgOff(CHILD_ID_SCENE, V_SCENE_OFF);
    MyMessage msgVAR1(CHILD_ID_SCENE, V_VAR1);// outdoor temperature
    MyMessage msgVAR2(CHILD_ID_SCENE, V_VAR2);// outdoor humidity
    MyMessage msgVAR3(CHILD_ID_SCENE, V_VAR3);//today's low
    MyMessage msgVAR4(CHILD_ID_SCENE, V_VAR4);// today's high
    MyMessage msgVAR5(CHILD_ID_SCENE, V_VAR5);//conditions
    //
    MyMessage lightMsg(CHILD_ID_LED, V_LIGHT);
    //MyMessage msgMOTD(CHILD_ID_LED, V_VAR1); // message of the day//<<<<<<<<<<<<<<<<<
    //MyMessage msgAlarm(CHILD_ID_LED, V_VAR2); // alarm status//<<<<<<<<<<<<<<<<<<<<<<<<
    //MyMessage msgBrite(CHILD_ID_LED, V_VAR3); // led briteness (nice idea!!!!)<<<<<<<<<<<<<<<
    //
    

    setup() bit:

       //
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
      gw.begin(getVariables, RADIO_ID);
      gw.sendSketchInfo("WeatherClock", "1.0");
      gw.present(CHILD_ID_SCENE, S_SCENE_CONTROLLER);
      gw.present( CHILD_ID_LED, S_LIGHT);
      int clockTimer;
    

    used here:

    void getVariables(const MyMessage &message)
    {  
      if (message.type == V_VAR1)
      {
        OutdoorTemp = atoi(message.data);
        DEBUG_PRINTLN(F("OutdoorTemp recieved:"));
        DEBUG_PRINTLN(OutdoorTemp);
      }
      if (message.type == V_VAR2)
      {
        OutdoorHumidity = atoi(message.data);
        DEBUG_PRINT(F("OutdoorHumidity recieved:"));
        DEBUG_PRINTLN(OutdoorHumidity);
       }
       if (message.type == V_VAR3)
      etc...
    

    any advice?

    best,

    Jim


  • Hero Member

    Did not try it but how about this:

    void getVariables(const MyMessage &message)
        {
            if (message.sensor==CHILD_ID_SCENE){  
                if (message.type == V_VAR1){
                    OutdoorTemp = atoi(message.data);
                    DEBUG_PRINTLN(F("OutdoorTemp recieved:"));
                    DEBUG_PRINTLN(OutdoorTemp);
               }
               if (message.type == V_VAR2){
                   OutdoorHumidity = atoi(message.data);
                   DEBUG_PRINT(F("OutdoorHumidity recieved:"));
                   DEBUG_PRINTLN(OutdoorHumidity);
              }
              if (message.type == V_VAR3)
                  etc...
    
            if (message.sensor==CHILD_ID_LED){  
                if (message.type == V_VAR1){
                    DayMessage = atoi(message.data);
                    DEBUG_PRINTLN(DayMessage);
               }
               if (message.type == V_VAR2){
                   AlarmStatus = atoi(message.data);
                   DEBUG_PRINT(F("House is:"));
                   DEBUG_PRINTLN(AlarmStatus);
              }
              if (message.type == V_VAR3)
                 etc...

  • Contest Winner

    @korttoma

    thanks, I'll give it a shot.

    another method for dispatching messages (with delays in between) from Vera with this type of lua function:

    (thanks to @RexBeckett for the assistance)

    function SendWeatherData(strstep)
    	local step = tonumber(strstep)
    	if step == 1 then
    		local temp = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 60)
    		luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_1", value=temp}, 85)
    	elseif step == 2 then
    		local humid = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1","CurrentLevel", 63)
    		luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_2", value=humid}, 85)
    	elseif step == 3 then
    		local low = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 61)
    		luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_3", value=low}, 85)
    	elseif step == 4 then
    		local high = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1","CurrentTemperature", 62)
    		luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_4", value=high}, 85)
    	elseif step == 5 then
    		local conditions = luup.variable_get("urn:upnp-micasaverde-com:serviceId:Weather1","Condition", 59)
    		luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_5", value=conditions}, 85)
    	end
    	step = step + 1
    	if step <= 5 then
    		luup.call_delay(1,tostring(step))
    	end
    end
    
    SendWeatherData("1")

  • Hero Member

    wow, don't understand what that lua function does but I'll give it a try. Thanks @RexBeckett


  • Contest Winner

    @korttoma

    "The following code calls the function SendWeatherData immediately and the function calls itself with a one second delay. Each time the function runs, it uses a step counter to chose a value to be read and sent. The step gets incremented on each run until it exceeds five after which the function stops calling itself." - rex

    This way, it shouldn't affect vera's watchdog.

    Rex is really helpful on matters of lua 😉


  • Contest Winner

    @korttoma

    I was thinking that perhaps it may be easier/better to recycle V_VAR1 and transmit messages to the node with a leading char. then have the arduino sort out the message based on the header:

    for example:

    local conditions = luup.variable_get("urn:upnp-micasaverde-com:serviceId:Weather1","Condition", 59)
    conditions = "#" .. conditions
    luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="11;3", variableId="VAR_5", value=conditions}, 85)
    

    then sort and strip out the char arduino-side... you could move a lot more message types through one variable

    new message types need to be hard coded into Arduino and Vera, so if we want to expand the data flow... it becomes easier this way, no? Perhaps there is a better message type to use for this type of effort...

    This device is in our guest house and since I have it open I want to add capabilities like:

    1: Message of the day
    2: quick SMS type of message
    3: alarm clock settable by mobile app
    4: twitter feed

    stuff like that...


Log in to reply
 

1.2k
Online

7.0k
Users

7.9k
Topics

84.8k
Posts

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.