[Solved] Vera device not showing variable value on GUI
-
I have built my first sensor (moisture sensor) and gateway.
With a simple sketch the value displays correctly in the Vera device.
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 #define CHILD_ID 0 #include <MySensors.h> // Here we are setting up some water thresholds that we will // use later. Note that you will need to change these to match // your soil type and environment. It doesn't do much for me because I'm using domoticz int thresholdUp = 400; int thresholdDown = 075; MyMessage msg(CHILD_ID, V_LEVEL); unsigned long SLEEP_TIME = 1000; // We are setting up the pin A0 on the redboard to be our sensor // pin input: int sensorPin = A0; void presentation() { present(CHILD_ID, S_MOISTURE); } void loop() { int sensorValue; sensorValue = analogRead(sensorPin); //send back the values send(msg.set(sensorValue)); // delay until next measurement (msec) sleep(SLEEP_TIME); }
Debug output
Vera grep log output
However, when I move onto the sketch I want to use everything works except the moisture value does not display in the Vera device.
/** * 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. * * Code and ideas from * mfalkvidd (http://forum.mysensors.org/user/mfalkvidd), * carlierd (https://www.openhardware.io/user/97/projects/carlierd) * Scalz (https://www.openhardware.io/user/12/projects/scalz) */ /**************************************************************************************/ /* Moisture sensor Pro Mini */ /* */ /* Version : V1.1.2 */ /* Supported Hardware : V1.1.x */ /* Date : 15/03/2017 */ /* Modified by : Jordan Bouey */ /**************************************************************************************/ /* Fuse L:E2 H:DA E:06 x * BOD 1.8V - Int 8Mhz Osc * avec boot ATmegaBOOT_168_atmega328_pro_8MHz.hex */ #define MY_NODE_ID 1 #define MY_DEBUG // Enables debug messages in the serial log #define MY_DEBUG_VERBOSE_SIGNING // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_OTA_FIRMWARE_FEATURE // Enables OTA firmware updates if DualOptiBoot // Enables software signing #define MY_SIGNING_SOFT // SETTINGS FOR MY_SIGNING_SOFT #define MY_SIGNING_SOFT_RANDOMSEED_PIN 7 //!< Unconnected analog pin for random seed // Enable node whitelisting //#define MY_SIGNING_NODE_WHITELISTING {{.nodeId = 0,.serial = {0xEB,0x86,0x43,0x73,0x14,0xB1,0xAF,0x0E,0x17}}} // Enable this if you want destination node to sign all messages sent to this node. // If enabled, You need to use securityPersonalizer for more security and change the default HMAC_KEY (https://www.mysensors.org/about/signing) //#define MY_SIGNING_REQUEST_SIGNATURES #include <MySensors.h> #include <SPI.h> //Define functions #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) //Constants for MySensors #define SKETCH_NAME "Moisture Sensor Pro Mini" #define SKETCH_VERSION "1.1.2" #define CHILD_ID_VOLTAGE 0 // Id of the sensor child (default 0) #define CHILD_ID_MOISTURE 1 // Id of the sensor child (default 1) #define BATTERY_SENSE_PIN A0 // select the input pin for the battery sense point (default A0) #define LED_PIN_INFO 3 //INFO LED PIN (default 3) #define LED_PIN_WARN 4//WARNING LED PIN (default 4) #define THRESHOLD 1.1 // Only make a new reading with reverse polarity if the change is larger than 10% (default 1.1) #define MOISTURE_THRESHOLD 1.01 // Delta needing for sending moisture to the controler (default 1.01) #define STABILIZATION_TIME 2000 // Let the sensor stabilize before reading (default 2000) #define BATTERY_FULL 3300 // when full AAA (default 3300) #define BATTERY_ZERO 2340 // 2.34V limit for 328p at 8MHz (set extended fuse to 0x06 for BOD 1.8V or you'll never see 2.34V) (default 2340) const int SENSOR_ANALOG_PINS[] = {A1, A2}; //(default {A1, A2}) #ifndef MY_DEBUG #define SLEEP_TIME 3600000 // Sleep time between reads (in milliseconds) (close to 1 hour)(default 3600000) #endif #ifdef MY_DEBUG #define SLEEP_TIME 1000 // Sleep time between reads (in milliseconds) (close to 1 sec) (default 1000) #endif //Variables int oldbatteryPcnt = -1; byte direction = 0; int oldMoistureLevel = -1; MyMessage msgMoisture(CHILD_ID_MOISTURE, V_HUM); MyMessage msgVolt(CHILD_ID_VOLTAGE, V_VOLTAGE); /**************************************************************************************/ /* Presentation */ /**************************************************************************************/ void presentation() { //Get time (for presentation) #ifdef MY_DEBUG unsigned long startTime = millis(); #endif blinkLedFastly(3); //Start MySensors and send the sketch version information to the gateway sendSketchInfo(SKETCH_NAME, SKETCH_VERSION); //Register all sensors present(CHILD_ID_VOLTAGE, S_MULTIMETER); present(CHILD_ID_MOISTURE, S_MOISTURE); //Setup done ! blinkLedFastly(3); //Print setup debug #ifdef MY_DEBUG int duration = millis() - startTime; Serial.print("[Presentation duration: "); Serial.print(duration, DEC); Serial.println(" ms]"); #endif } /**************************************************************************************/ /* Initialization */ /**************************************************************************************/ void setup() { //Setup LED INFO pin pinMode(LED_PIN_INFO, OUTPUT); //Setup LED WARNING pin pinMode(LED_PIN_WARN, OUTPUT); //Set moisutre sensor pins for (int i = 0; i < N_ELEMENTS(SENSOR_ANALOG_PINS); i++) { pinMode(SENSOR_ANALOG_PINS[i], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[i], LOW); } } /**************************************************************************************/ /* Main loop */ /**************************************************************************************/ void loop() { //Get time (for a complete loop) #ifdef MY_DEBUG unsigned long startTime = millis(); #endif //Get moisture level int moistureLevel = readMoisture(); //Send rolling average of 2 samples to get rid of the "ripple" produced by different resistance in the internal pull-up resistors //See http://forum.mysensors.org/topic/2147/office-plant-monitoring/55 for more information //Verify if current measurement is not too far from the previous one if (moistureLevel > (oldMoistureLevel * THRESHOLD) || moistureLevel < (oldMoistureLevel / THRESHOLD)) { //The change was large, so it was probably not caused by the difference in internal pull-ups. //Measure again, this time with reversed polarity. moistureLevel = readMoisture(); } #ifdef MY_DEBUG Serial.print("Soil Value: "); Serial.println(moistureLevel); send(msgMoisture.set((moistureLevel), 0)); #endif if (moistureLevel > (oldMoistureLevel * MOISTURE_THRESHOLD) || moistureLevel < (oldMoistureLevel / MOISTURE_THRESHOLD)) //Send moisture only if moisture changed more than MOISTURE_THRESHOLD { if (oldMoistureLevel == -1) { send(msgMoisture.set((moistureLevel) / 10.23, 0)); }else{ send(msgMoisture.set((moistureLevel + oldMoistureLevel) / 2.0 / 10.23, 0)); } //Store current moisture level oldMoistureLevel = moistureLevel; } //Report data to the gateway long voltage = getVoltageBySoft(); int batteryPcnt = round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)); if (batteryPcnt > 100) {batteryPcnt = 100;} if (batteryPcnt <= 0) {batteryPcnt = 0;} if (oldbatteryPcnt != batteryPcnt) { send(msgVolt.set(voltage / 1000.0, 2)); sendBatteryLevel(batteryPcnt); oldbatteryPcnt = batteryPcnt; } //Print debug #ifdef MY_DEBUG Serial.print((moistureLevel + oldMoistureLevel) / 2.0 / 10.23); Serial.print("%"); Serial.print(" "); Serial.print(batteryPcnt); Serial.print("%"); int duration = millis() - startTime; Serial.print(" "); Serial.print("["); Serial.print(duration, DEC); Serial.println(" ms]"); Serial.flush(); #endif //Sleep until next measurement - smart sleep for OTA blinkLedFastly(1); smartSleep(SLEEP_TIME); } /**************************************************************************************/ /* Allows to get moisture. */ /**************************************************************************************/ int readMoisture() { //Power on the sensor and read once to let the ADC capacitor start charging pinMode(SENSOR_ANALOG_PINS[direction], INPUT_PULLUP); analogRead(SENSOR_ANALOG_PINS[direction]); //Stabilize and read the value sleep(STABILIZATION_TIME); int moistureLevel = (1023 - analogRead(SENSOR_ANALOG_PINS[direction])); //Turn off the sensor to conserve battery and minimize corrosion pinMode(SENSOR_ANALOG_PINS[direction], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[direction], LOW); //Make direction alternate between 0 and 1 to reverse polarity which reduces corrosion // direction = (direction + 1) % 2; return moistureLevel; } /**************************************************************************************/ /* Allows to fastly blink the LED. */ /**************************************************************************************/ void blinkLedFastly(byte loop) { byte delayOn = 150; byte delayOff = 150; for (int i = 0; i < loop; i++) { blinkLed(LED_PIN_INFO, delayOn); delay(delayOff); } } /**************************************************************************************/ /* Allows to blink a LED. */ /**************************************************************************************/ void blinkLed(byte pinToBlink, int delayInMs) { digitalWrite(pinToBlink,HIGH); delay(delayInMs); digitalWrite(pinToBlink,LOW); } /**************************************************************************************/ /* Allows to get the real Vcc (return value in mV). */ /* http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ */ /**************************************************************************************/ long getVoltageBySoft() { ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0); delay(50); // Let mux settle a little to get a more stable A/D conversion //Start a conversion ADCSRA |= _BV( ADSC ); //Wait for it to complete while (bit_is_set(ADCSRA, ADSC)); //Compute and return the value uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts } /**************************************************************************************/ /* Mesure battery with divider */ /* */ /**************************************************************************************/ long getVoltageByHard() { analogReference(INTERNAL); // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef MY_DEBUG Serial.print("Battery Value: "); Serial.println(sensorValue); #endif //The analog reference only changes when you make an analogread and it takes a little time to change, hence the tempo and repeat of the analogRead command delay(1000); // this delay is needed sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef MY_DEBUG Serial.print("Battery Value: "); Serial.println(sensorValue); #endif // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 float batteryV = sensorValue * 0.003363075; int batteryMv = round(batteryV * 1000); // int batteryPcnt = sensorValue * 0.0977517106549365; int batteryPcnt = round((batteryMv - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)); if (batteryPcnt > 100) {batteryPcnt = 100;} #ifdef MY_DEBUG Serial.print("Battery Voltage: "); Serial.print(batteryMv); Serial.println(" mV"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif analogReference(DEFAULT); return batteryMv; // Vcc in mV }
Debug output
Vera grep log output
The variable value is getting to the Vera device as it shows in the device advanced tab
Vera 3 UI15
IDE 1.8.2
MySensor library 2.2.0 - betaI have removed the sensors and gateway multiple times, reloaded Vera multiple times. To no avail.
Any suggestions welcome.
-
Solved:
Vera does not have a dedicated moisture device, S_MOISTURE is implemented as a Light Sensor (Ref)
MyMessage msgMoisture(CHILD_ID_MOISTURE, V_HUM);
is therefore incorrect and results in no value being shown in the device.
For Vera this has to be
MyMessage msgMoisture(CHILD_ID_MOISTURE, V_LEVEL);
The level is now showing in the device
-
-
@Woodside done. Welcome to the MySensors commu ity and thanks for sharing the solution.