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. Controllers
  3. Vera
  4. Sending Variables to a arduino switch

Sending Variables to a arduino switch

Scheduled Pinned Locked Moved Vera
28 Posts 8 Posters 11.9k Views 6 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.
  • sundberg84S Offline
    sundberg84S Offline
    sundberg84
    Hardware Contributor
    wrote on last edited by sundberg84
    #19

    In the library you can use timeawaresensor to recieve time
    https://github.com/mysensors/Arduino/tree/development/libraries/MySensors/examples/TimeAwareSensor

    The raingauge, WaterMeterPulseSensor and Power meter to recieve V_VAR1

    Controller: Proxmox VM - Home Assistant
    MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
    MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
    RFLink GW - Arduino Mega + RFLink Shield, 433mhz

    1 Reply Last reply
    0
    • P Offline
      P Offline
      patrick schaerer
      wrote on last edited by
      #20

      @BartE: Thank you for your corrections to the code. I changed that.

      Now the sketch works. All I did is to add a new repeaternode between the gateway and the receiving node. It was definetly a hardware problem (or the problem was solved in 1.5.3 update).

      The LED_Node_var sketch works!

      1 Reply Last reply
      0
      • NuubiN Offline
        NuubiN Offline
        Nuubi
        wrote on last edited by
        #21

        Eh, how do you define or set a value for, let's say, V_VAR1 in Vera?

        1 Reply Last reply
        0
        • P Offline
          P Offline
          patrick schaerer
          wrote on last edited by
          #22

          in the advanced tab all the way down at the bottom there are should be Variable1. Put a value in the field and save.
          the next time your device requests the variable, the new value will be sent.

          NuubiN 1 Reply Last reply
          0
          • P patrick schaerer

            in the advanced tab all the way down at the bottom there are should be Variable1. Put a value in the field and save.
            the next time your device requests the variable, the new value will be sent.

            NuubiN Offline
            NuubiN Offline
            Nuubi
            wrote on last edited by
            #23

            @patrick-schaerer said:

            in the advanced tab all the way down at the bottom there are should be Variable1. Put a value in the field and save.
            the next time your device requests the variable, the new value will be sent.

            Thanks, though so, too.
            So the next question is, is it possible to add variables to sensor types that don't have those to begin with? In my case I'd like to add few variables to window covers (S_COVER in http://www.mysensors.org/download/serial_api_15). Can't test now, but would this gw.present(CHILD_ID_OF_BLINDS, V_VAR1) work in adding this property to the blinds?

            1 Reply Last reply
            0
            • P Offline
              P Offline
              patrick schaerer
              wrote on last edited by
              #24

              It should work. The variable1 appears in vera after the sensor had requested var1. (But Im not completely shure about that ... )

              NuubiN 1 Reply Last reply
              0
              • P patrick schaerer

                It should work. The variable1 appears in vera after the sensor had requested var1. (But Im not completely shure about that ... )

                NuubiN Offline
                NuubiN Offline
                Nuubi
                wrote on last edited by
                #25

                @patrick-schaerer said:

                It should work. The variable1 appears in vera after the sensor had requested var1. (But Im not completely shure about that ... )

                Oh yeah, works as you suggested. Thanks!
                First I didn't get it to work, but re-reading your answer solved it. One really needs to request the variable to make it appear in the controller (Vera, that is in this case).

                1 Reply Last reply
                0
                • P Offline
                  P Offline
                  patrick schaerer
                  wrote on last edited by
                  #26

                  On my newest project I have several sensors on the same node. Some of those sensors demand values on Var1 and Var2.
                  The code works fine so far, but I have to write those values all in the same number of digits. (sorry for my english) For example:
                  Sensor 1 has V_Var1 422
                  Sensor 2 has V_Var1 20
                  In order to get the right value on my node I must write the value on Sensor2 in Vera like this: 020
                  Otherwise Sensor 2 would receive a V_Var1 of 420.
                  Also I had to write a workaround for the incoming message of the switch states. I receive a String and check if the first value is asci 48 for 0 or asci 49 for 1

                  It looks to me that some memory in receiving values is left after a value is received. Is it possible to clear that memory?

                  Here is the code I am talking about:

                  /**
                   * The MySensors Arduino library handles the wireless radio link and protocol
                   * between your home built sensors/actuators and HA controller of choice.
                   * The sensors forms a self healing radio network with optional repeaters. Each
                   * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                   * network topology allowing messages to be routed to nodes.
                   *
                   * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                   * Copyright (C) 2013-2015 Sensnology AB
                   * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                   *
                   * Documentation: http://www.mysensors.org
                   * Support Forum: http://forum.mysensors.org
                   *
                   * This program is free software; you can redistribute it and/or
                   * modify it under the terms of the GNU General Public License
                   * version 2 as published by the Free Software Foundation.
                   *
                   *******************************
                   *
                   * REVISION HISTORY
                   * Version 1.0 - Henrik Ekblad
                   */
                  
                  #define SKETCH_NAME "Bewässerung"
                  #define SKETCH_VERSION "0.7a"
                  
                  #include <MySensor.h>  
                  #include <SPI.h>
                  #include "DHT.h"
                  #include <Wire.h>
                  #include <BH1750.h>
                  
                  
                  
                  DHT dht;
                  BH1750 lightMeter;
                  
                  
                  int dhtpin = 47;
                  int strom_beet_pin = 48;
                  int first_hum_pin = 0;
                  int first_temp_pin = 4;
                  int first_valve_pin = 43;
                  
                  unsigned long timer_manual;
                  unsigned long timer_umgebung;
                  unsigned long timer_beet;
                  unsigned long zeit_umgebung = 30;
                  unsigned long zeit_beet = 50;
                  unsigned long zeit_manual = 60;
                  unsigned int helligkeit = 700; // Schwellenwert für Licht bei Bewässerung
                  int feuchtigkeit = 50; // Schwellenwert für Erdfeuchtigkeit bei Bewässerung
                  int temperatur = 25; //Schwellenwert für Erdtemperatur bei Bewässerung
                  
                  // 0 wasser ein, 1-4 hum, 5-8 temp, 9-12 valve, 13 DHT temp, 14 DHT hum, 15 light
                  float beet_data[16];
                  
                  //definitions for mySensors
                  #define DHT_TEMP_ID 13
                  #define DHT_HUM_ID 14
                  #define LIGHT_ID 15
                  
                  //Initialize MySensors
                  MyTransportNRF24 transport(49, 53);
                  MySensor gw(transport);
                  MyMessage msg_temp(DHT_TEMP_ID, V_TEMP);
                  MyMessage msg_hum(DHT_HUM_ID, V_HUM);
                  MyMessage msg_light(LIGHT_ID, V_LIGHT_LEVEL);
                  MyMessage msg_hum1(1,V_HUM);
                  MyMessage msg_hum2(2,V_HUM);
                  MyMessage msg_hum3(3,V_HUM);
                  MyMessage msg_hum4(4,V_HUM);
                  MyMessage msg_temp1 (5,V_TEMP);
                  MyMessage msg_temp2 (6,V_TEMP);
                  MyMessage msg_temp3 (7,V_TEMP);
                  MyMessage msg_temp4 (8,V_TEMP);
                  MyMessage msg_valve1 (9,V_LIGHT);
                  MyMessage msg_valve2 (10,V_LIGHT);
                  MyMessage msg_valve3 (11,V_LIGHT);
                  MyMessage msg_valve4 (12,V_LIGHT);
                  //Initialize mySensor Variables
                  MyMessage msg_zeit_umgebung(DHT_TEMP_ID, V_VAR1);
                  MyMessage msg_helligkeit(LIGHT_ID, V_VAR1);
                  MyMessage msg_feuchtigkeit(1, V_VAR1);
                  MyMessage msg_zeit_beet(1, V_VAR2);
                  MyMessage msg_temperatur(5, V_VAR1);
                  MyMessage msg_zeit_manual(9, V_VAR1);
                  
                  void setup() {
                    // put your setup code here, to run once:
                    Serial.begin(115200); 
                    Serial1.begin(115200); 
                    gw.begin(incomingMessage);
                    gw.sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
                    lightMeter.begin();
                    dht.setup(dhtpin);
                    
                    pinMode(strom_beet_pin, OUTPUT);
                    gw.present(DHT_TEMP_ID, S_TEMP);
                    gw.present(DHT_HUM_ID, S_HUM);
                    gw.present(LIGHT_ID, S_LIGHT_LEVEL);
                    int i=0;
                    for ( i=0;i<4;i++) {
                      pinMode(first_valve_pin+i,OUTPUT);
                      gw.present(i+1,S_HUM);
                      gw.present(i+5,S_TEMP);
                      gw.present(i+9, S_LIGHT);
                      digitalWrite(first_valve_pin+i,HIGH);
                    }
                    getVariables();
                    timer_umgebung = millis()-zeit_umgebung*1000;
                    timer_beet = millis()-zeit_beet*1000;
                    Serial.println("Initialized");
                  }
                  
                  void loop() {
                   gw.process(); 
                    // Abfrage der Umgebungsdaten
                  if (zeit_umgebung*1000 <= millis()- timer_umgebung) {
                    umgebung();
                    timer_umgebung = millis();
                    Ausgabe();
                  }
                  //Abfrage der Beetdaten und evtl. Wässerung
                  if (zeit_beet*1000 <= millis() - timer_beet) {
                    beet();
                    send_beet_data();
                    wassern_entscheid();
                    timer_beet = millis();
                    getVariables();
                  }
                  for (int i=0;i<4;i++) {
                    if (beet_data[9+i] == HIGH) {
                    beet();
                    wassern_entscheid();
                    }
                  }
                  // Manuelle Wässerung nach zeit_manual ausschalten
                  if (zeit_manual*1000 <= millis() - timer_manual && beet_data[0] == HIGH) {
                    Serial.println("Manual time is up");
                    for (int i=0;i<4;i++) {
                      beet_data[i+9] = LOW;
                      wasser(i,LOW);
                      }
                     beet_data[0] = LOW;
                     }
                  
                        
                  // Alle Timer nach Overflow von millis() zurücksetzen
                  if (millis() < timer_umgebung) {
                    timer_umgebung = millis();
                    timer_beet = millis();
                    timer_manual = millis();   
                    }
                  }
                  
                  void getVariables() {
                    gw.request(DHT_TEMP_ID, V_VAR1);
                    gw.request(LIGHT_ID, V_VAR1);
                    gw.request(1, V_VAR1);
                    gw.request(1, V_VAR2);
                    gw.request(5, V_VAR1);
                    gw.request(9, V_VAR1);
                  }
                  
                  void wassern_entscheid() {
                    /* kriterien: 
                     *  Morgen oder Abend d.h. Lux unter bestimmtem Wert
                     *  Feuchtigkeit Beet unter bestimmtem Wert
                     *  Temperatur Beet über bestimmtem Wert ?
                     */
                     if (beet_data[0] == HIGH) {
                      Serial.println("Manual Valve override");
                     }
                     else {
                     
                     if (beet_data[15] < helligkeit) {
                      for (int i=0;i<4;i++) {
                        if (beet_data[i+1] < feuchtigkeit) {
                          if (beet_data[i+9] == LOW) wasser(i,HIGH);
                        }
                        else {
                          if (beet_data[i+9] == HIGH) wasser(i,LOW);
                        }
                      }
                     }
                     else {
                      for (int i=0;i<4;i++) {
                        if (beet_data[i+9] == HIGH) wasser(i,LOW);
                      }
                     }
                  }
                  }
                  
                  void umgebung() {
                    float temperature = dht.getTemperature();
                    float humidity = dht.getHumidity();
                    uint16_t lux = lightMeter.readLightLevel();
                    gw.send(msg_temp.set(temperature,1));
                    gw.send(msg_hum.set(humidity,1));
                    gw.send(msg_light.set(lux,1));
                    beet_data[13] = temperature;
                    beet_data[14] = humidity;
                    beet_data[15] = lux;
                  }
                  
                  
                  void beet() {
                    digitalWrite(strom_beet_pin, HIGH);
                    gw.wait(2000);
                    int i=0;
                    for(i = 0;i<4;i++) {
                      int hum = analogRead(first_hum_pin+i);
                      hum = map(hum,1023,0,0,100);
                      beet_data[1+i] = hum;
                      int rawvoltage= analogRead(first_temp_pin+i);
                      rawvoltage = 1024 - rawvoltage;
                      float temp= ((rawvoltage/1024.0) * 5000/10)-273.15;
                      beet_data[5+i] = temp;
                    }
                    digitalWrite(strom_beet_pin, LOW);
                  }
                  
                  
                  void send_beet_data() {
                      gw.send(msg_hum1.set(beet_data[1],1));
                      gw.send(msg_hum2.set(beet_data[2],1));
                      gw.send(msg_hum3.set(beet_data[3],1));
                      gw.send(msg_hum4.set(beet_data[4],1));
                      gw.send(msg_temp1.set(beet_data[5],1));
                      gw.send(msg_temp2.set(beet_data[6],1));
                      gw.send(msg_temp3.set(beet_data[7],1));
                      gw.send(msg_temp4.set(beet_data[8],1));
                      Serial.println("beet data sent");
                  }
                  
                  void Ausgabe() {
                    Serial.print("Hum: ");
                   for (int i=0; i<4; i++) {
                    Serial.print(beet_data[i+1]);
                    Serial.print(" ");
                   }
                   Serial.print(" Temp: ");
                   for (int i=0; i<4; i++) {
                    Serial.print(beet_data[i+5]);
                    Serial.print(" ");
                   } 
                   Serial.print(" Valve: ");
                   for (int i=0; i<4; i++) {
                    Serial.print(beet_data[i+9]);
                    Serial.print(" ");
                   }
                   Serial.print(" Zeit Beet: ");
                   Serial.print(millis() - timer_beet);
                   Serial.println("finished");
                   //Variabeln anzeigen
                     Serial.print("Variables ");
                     Serial.print(zeit_umgebung);
                     Serial.print("  ");
                     Serial.print(zeit_beet);
                     Serial.print("  ");
                     Serial.print(zeit_manual);
                     Serial.print("  ");
                     Serial.print(feuchtigkeit);
                     Serial.print("  ");
                     Serial.print(helligkeit);
                     Serial.print("  ");
                     Serial.print(temperatur);
                     Serial.println("  ");
                  }
                  
                  void wasser(int valve_nr,boolean state) {
                      digitalWrite(first_valve_pin+valve_nr,!state);
                      beet_data[valve_nr+9] = state;
                      if (valve_nr == 0) gw.send(msg_valve1.set(state,1));
                      if (valve_nr == 1) gw.send(msg_valve2.set(state,1));
                      if (valve_nr == 2) gw.send(msg_valve3.set(state,1));
                      if (valve_nr == 3) gw.send(msg_valve4.set(state,1));
                  }
                  
                  void incomingMessage(const MyMessage &message) {
                    int i;
                    for (i=0;i<4;i++) {
                       if (message.sensor == i+9) {
                        if (message.type == V_LIGHT) {
                          char buffer[10];
                          char* empfang = message.getString(buffer);
                          int asci = buffer[0];
                          boolean state;
                          if (asci == 49) state=HIGH;
                          if (asci == 48) state = LOW;
                          wasser(i,state);
                          if (state == HIGH) beet_data[0] = HIGH;
                          timer_manual = millis();
                          Serial.print(" Valve: ");
                          Serial.print(i+9);
                          //Serial.print(" Empfangen:  ");
                          //Serial.print(asci);
                          Serial.print(" State: ");
                          Serial.println(state);
                        }
                       }  
                    }
                    if (message.sensor == DHT_TEMP_ID && message.type == V_VAR1) zeit_umgebung = message.getULong();
                    if (message.sensor == LIGHT_ID && message.type == V_VAR1) helligkeit = message.getInt();
                    if (message.sensor == 1 && message.type == V_VAR1) feuchtigkeit = message.getInt();
                    if (message.sensor == 1 && message.type == V_VAR2) zeit_beet = message.getULong();
                    if (message.sensor == 5 && message.type == V_VAR1) temperatur = message.getInt();
                    if (message.sensor == 9 && message.type == V_VAR1) zeit_manual = message.getULong();
                  }
                  
                  
                  1 Reply Last reply
                  0
                  • MagiskeM Offline
                    MagiskeM Offline
                    Magiske
                    wrote on last edited by
                    #27

                    I have started to use ESP8266 for some of my devices with my Vera. So a combination of mysensors and esp's.
                    How would I go around reading values via WIFI only(esp8266) ? I can do a HTTP request to put values but how would I do a READ ?

                    /M

                    1 Reply Last reply
                    0
                    • hekH Offline
                      hekH Offline
                      hek
                      Admin
                      wrote on last edited by
                      #28

                      The ESP gateway will send any incoming (radio messages) or locally sent messages on to the socket you have opened from the controller.

                      The ESP gateway doesn't differ from the Ethernet variant in any way (from the controllers point of view).

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      16

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.1k

                      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