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. How to include the battery measurement?

How to include the battery measurement?

Scheduled Pinned Locked Moved Troubleshooting
12 Posts 3 Posters 4.5k Views 2 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.
  • tlpeterT Offline
    tlpeterT Offline
    tlpeter
    wrote on last edited by
    #1

    I am trying to build a sensor with a DHT22 and for now on a solar panel and a battery.
    I want to see the battery level within Domoticz.
    I cannot seem to merge both the battery sketch and the DHT sketch together.
    Most of the times i get an error about a { being in a place where it should not belong.
    I think i lost it :smiley: and i am going mad soon.
    Also how to send the battery level to Domoticz? i tried the battery sketch alone and nothing happens.

    sundberg84S 1 Reply Last reply
    0
    • tlpeterT tlpeter

      I am trying to build a sensor with a DHT22 and for now on a solar panel and a battery.
      I want to see the battery level within Domoticz.
      I cannot seem to merge both the battery sketch and the DHT sketch together.
      Most of the times i get an error about a { being in a place where it should not belong.
      I think i lost it :smiley: and i am going mad soon.
      Also how to send the battery level to Domoticz? i tried the battery sketch alone and nothing happens.

      sundberg84S Offline
      sundberg84S Offline
      sundberg84
      Hardware Contributor
      wrote on last edited by sundberg84
      #2

      @tlpeter

      Most of the times i get an error about a { being in a place where it should not belong.

      Its easier for us if you post the code so we can have a look if you want help :)

      Also how to send the battery level to Domoticz?

      Well, before 2.0 it was gw.sendBatteryLevel(batteryPcnt); and now it is sendBatteryLevel(batteryPcnt);
      The battery% needs to be attached to a sensor - so it will be displayed in the deviced tab if you look at the device/sensor.

      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
      1
      • tlpeterT Offline
        tlpeterT Offline
        tlpeter
        wrote on last edited by
        #3

        sendBatteryLevel doesn't do anything.
        I have modified it a bit and now i have some readings.
        I will do a bit more playing to see where i will end.

        sundberg84S 1 Reply Last reply
        0
        • tlpeterT tlpeter

          sendBatteryLevel doesn't do anything.
          I have modified it a bit and now i have some readings.
          I will do a bit more playing to see where i will end.

          sundberg84S Offline
          sundberg84S Offline
          sundberg84
          Hardware Contributor
          wrote on last edited by
          #4

          @tlpeter - it does, but it needs to be together with a sensor. You will find it in "devices".

          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
          • sundberg84S Offline
            sundberg84S Offline
            sundberg84
            Hardware Contributor
            wrote on last edited by
            #5

            0_1472575404591_1.JPG

            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
            • tlpeterT Offline
              tlpeterT Offline
              tlpeter
              wrote on last edited by tlpeter
              #6

              I have voltage now (utility) and a percentage under devices.
              I have read somewhere that the percentage is depending on the last sensors poll so i will now try to add the DHT part in to the sketch.

              1 Reply Last reply
              0
              • tlpeterT Offline
                tlpeterT Offline
                tlpeter
                wrote on last edited by tlpeter
                #7

                I have the voltage part working and i think also the battery percentage with it.
                I build the sketch like this. Can you have a little look?

                /**
                 * 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.
                 *
                 *******************************
                 *
                 * DESCRIPTION
                 *
                 * This is an example that demonstrates how to report the battery level for a sensor
                 * Instructions for measuring battery capacity on A0 are available here:
                 * http://www.mysensors.org/build/battery
                 * 
                 */
                
                
                
                // Enable debug prints to serial monitor
                #define MY_DEBUG 
                
                // Enable and select radio type attached
                #define MY_RADIO_NRF24
                //#define MY_RADIO_RFM69
                
                #include <SPI.h>
                #include <MySensors.h>
                #include <DHT.h>
                
                #define CHILD_ID_BATT 0
                #define CHILD_ID_HUM 1
                #define CHILD_ID_TEMP 2
                
                #define DHT_DATA_PIN 3 // Set this to the pin you connected the DHT's data pin to
                int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
                
                // Set this offset if the sensor has a permanent small offset to the real temperatures
                #define SENSOR_TEMP_OFFSET 0
                
                static const uint64_t UPDATE_INTERVAL = 30000;
                
                // Force sending an update of the temperature after n sensor reads, so a controller showing the
                // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                // the value didn't change since;
                // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                static const uint8_t FORCE_UPDATE_N_READS = 10;
                
                //unsigned long SLEEP_TIME = 9000;  // sleep time between reads (seconds * 1000 milliseconds)
                int oldBatteryPcnt = 0;
                
                float lastTemp;
                float lastHum;
                uint8_t nNoUpdatesTemp;
                uint8_t nNoUpdatesHum;
                boolean metric = true; 
                
                MyMessage msgBatt(CHILD_ID_BATT, V_VOLTAGE);
                MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                DHT dht;
                
                void setup()  
                {
                   // use the 1.1 V internal reference
                #if defined(__AVR_ATmega2560__)
                   analogReference(INTERNAL1V1);
                #else
                   analogReference(INTERNAL);
                #endif
                //}
                
                {
                dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                  if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                    Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                  }
                  // Sleep for the time of the minimum sampling period to give the sensor time to power up
                  // (otherwise, timeout errors might occure for the first reading)
                  sleep(dht.getMinimumSamplingPeriod());
                }
                }
                void presentation() {
                   // Send the sketch version information to the gateway and Controller
                   sendSketchInfo("Battery Meter", "1.0");
                
                   present(CHILD_ID_BATT, S_MULTIMETER);
                   wait(20);
                   present(CHILD_ID_HUM, S_HUM);
                   wait(20);
                   present(CHILD_ID_TEMP, S_TEMP);
                   wait(20);
                   metric = getConfig().isMetric;
                
                }
                void loop()
                {
                   // get the battery Voltage
                   int sensorValue = analogRead(BATTERY_SENSE_PIN);
                   #ifdef MY_DEBUG
                   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
                   
                   int batteryPcnt = sensorValue / 10;
                
                   #ifdef MY_DEBUG
                   float batteryV  = sensorValue * 0.003363075;
                   Serial.print("Battery Voltage: ");
                   Serial.print(batteryV);
                   Serial.println(" V");
                
                   Serial.print("Battery percent: ");
                   Serial.print(batteryPcnt);
                   Serial.println(" %");
                   #endif
                
                   if (oldBatteryPcnt != batteryPcnt) {
                     // Power up radio after sleep
                     send(msgBatt.set(batteryV, 1));
                    //sendBatteryLevel(batteryPcnt);
                     oldBatteryPcnt = batteryPcnt;
                   }
                
                   {  
                  // Force reading sensor, so it works also after sleep()
                  dht.readSensor(true);
                  
                  // Get temperature from DHT library
                  float temperature = dht.getTemperature();
                  if (isnan(temperature)) {
                    Serial.println("Failed reading temperature from DHT!");
                  } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                    // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                    lastTemp = temperature;
                    if (!metric) {
                      temperature = dht.toFahrenheit(temperature);
                    }
                    // Reset no updates counter
                    nNoUpdatesTemp = 0;
                    temperature += SENSOR_TEMP_OFFSET;
                    send(msgTemp.set(temperature, 1));
                
                    #ifdef MY_DEBUG
                    Serial.print("T: ");
                    Serial.println(temperature);
                    #endif
                  } else {
                    // Increase no update counter if the temperature stayed the same
                    nNoUpdatesTemp++;
                  }
                
                  // Get humidity from DHT library
                  float humidity = dht.getHumidity();
                  if (isnan(humidity)) {
                    Serial.println("Failed reading humidity from DHT");
                  } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                    // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                    lastHum = humidity;
                    // Reset no updates counter
                    nNoUpdatesHum = 0;
                    send(msgHum.set(humidity, 1));
                    
                    #ifdef MY_DEBUG
                    Serial.print("H: ");
                    Serial.println(humidity);
                    #endif
                  } else {
                    // Increase no update counter if the humidity stayed the same
                    nNoUpdatesHum++;
                  }
                   //sleep(SLEEP_TIME);
                   sleep(UPDATE_INTERVAL);
                   }}```
                sundberg84S 1 Reply Last reply
                0
                • tlpeterT tlpeter

                  I have the voltage part working and i think also the battery percentage with it.
                  I build the sketch like this. Can you have a little look?

                  /**
                   * 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.
                   *
                   *******************************
                   *
                   * DESCRIPTION
                   *
                   * This is an example that demonstrates how to report the battery level for a sensor
                   * Instructions for measuring battery capacity on A0 are available here:
                   * http://www.mysensors.org/build/battery
                   * 
                   */
                  
                  
                  
                  // Enable debug prints to serial monitor
                  #define MY_DEBUG 
                  
                  // Enable and select radio type attached
                  #define MY_RADIO_NRF24
                  //#define MY_RADIO_RFM69
                  
                  #include <SPI.h>
                  #include <MySensors.h>
                  #include <DHT.h>
                  
                  #define CHILD_ID_BATT 0
                  #define CHILD_ID_HUM 1
                  #define CHILD_ID_TEMP 2
                  
                  #define DHT_DATA_PIN 3 // Set this to the pin you connected the DHT's data pin to
                  int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
                  
                  // Set this offset if the sensor has a permanent small offset to the real temperatures
                  #define SENSOR_TEMP_OFFSET 0
                  
                  static const uint64_t UPDATE_INTERVAL = 30000;
                  
                  // Force sending an update of the temperature after n sensor reads, so a controller showing the
                  // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                  // the value didn't change since;
                  // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                  static const uint8_t FORCE_UPDATE_N_READS = 10;
                  
                  //unsigned long SLEEP_TIME = 9000;  // sleep time between reads (seconds * 1000 milliseconds)
                  int oldBatteryPcnt = 0;
                  
                  float lastTemp;
                  float lastHum;
                  uint8_t nNoUpdatesTemp;
                  uint8_t nNoUpdatesHum;
                  boolean metric = true; 
                  
                  MyMessage msgBatt(CHILD_ID_BATT, V_VOLTAGE);
                  MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                  MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                  DHT dht;
                  
                  void setup()  
                  {
                     // use the 1.1 V internal reference
                  #if defined(__AVR_ATmega2560__)
                     analogReference(INTERNAL1V1);
                  #else
                     analogReference(INTERNAL);
                  #endif
                  //}
                  
                  {
                  dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                    if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                      Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                    }
                    // Sleep for the time of the minimum sampling period to give the sensor time to power up
                    // (otherwise, timeout errors might occure for the first reading)
                    sleep(dht.getMinimumSamplingPeriod());
                  }
                  }
                  void presentation() {
                     // Send the sketch version information to the gateway and Controller
                     sendSketchInfo("Battery Meter", "1.0");
                  
                     present(CHILD_ID_BATT, S_MULTIMETER);
                     wait(20);
                     present(CHILD_ID_HUM, S_HUM);
                     wait(20);
                     present(CHILD_ID_TEMP, S_TEMP);
                     wait(20);
                     metric = getConfig().isMetric;
                  
                  }
                  void loop()
                  {
                     // get the battery Voltage
                     int sensorValue = analogRead(BATTERY_SENSE_PIN);
                     #ifdef MY_DEBUG
                     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
                     
                     int batteryPcnt = sensorValue / 10;
                  
                     #ifdef MY_DEBUG
                     float batteryV  = sensorValue * 0.003363075;
                     Serial.print("Battery Voltage: ");
                     Serial.print(batteryV);
                     Serial.println(" V");
                  
                     Serial.print("Battery percent: ");
                     Serial.print(batteryPcnt);
                     Serial.println(" %");
                     #endif
                  
                     if (oldBatteryPcnt != batteryPcnt) {
                       // Power up radio after sleep
                       send(msgBatt.set(batteryV, 1));
                      //sendBatteryLevel(batteryPcnt);
                       oldBatteryPcnt = batteryPcnt;
                     }
                  
                     {  
                    // Force reading sensor, so it works also after sleep()
                    dht.readSensor(true);
                    
                    // Get temperature from DHT library
                    float temperature = dht.getTemperature();
                    if (isnan(temperature)) {
                      Serial.println("Failed reading temperature from DHT!");
                    } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                      // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                      lastTemp = temperature;
                      if (!metric) {
                        temperature = dht.toFahrenheit(temperature);
                      }
                      // Reset no updates counter
                      nNoUpdatesTemp = 0;
                      temperature += SENSOR_TEMP_OFFSET;
                      send(msgTemp.set(temperature, 1));
                  
                      #ifdef MY_DEBUG
                      Serial.print("T: ");
                      Serial.println(temperature);
                      #endif
                    } else {
                      // Increase no update counter if the temperature stayed the same
                      nNoUpdatesTemp++;
                    }
                  
                    // Get humidity from DHT library
                    float humidity = dht.getHumidity();
                    if (isnan(humidity)) {
                      Serial.println("Failed reading humidity from DHT");
                    } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                      // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                      lastHum = humidity;
                      // Reset no updates counter
                      nNoUpdatesHum = 0;
                      send(msgHum.set(humidity, 1));
                      
                      #ifdef MY_DEBUG
                      Serial.print("H: ");
                      Serial.println(humidity);
                      #endif
                    } else {
                      // Increase no update counter if the humidity stayed the same
                      nNoUpdatesHum++;
                    }
                     //sleep(SLEEP_TIME);
                     sleep(UPDATE_INTERVAL);
                     }}```
                  sundberg84S Offline
                  sundberg84S Offline
                  sundberg84
                  Hardware Contributor
                  wrote on last edited by
                  #8

                  @tlpeter - Im not a coding guy, but it looks good to me.
                  Myself i build my sketches, test and look at serial output and Domoticz output. When im happy with the result - i go for it.

                  This is going to create two devices i think, one humidity/temp and one voltage. The batterypct and voltage will be seperated from humidity/temp i think even if they belong together. If you want the procentage in devices for the right device you just skip the voltage part.

                  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
                  • tlpeterT Offline
                    tlpeterT Offline
                    tlpeter
                    wrote on last edited by
                    #9

                    I have voltage now and a percentage at the devices.
                    Hum and temp do work fine.
                    I only sucked all the juice out of the battery so it is charging now by the little solar panel.
                    I found out that 2,4V was really the lowest voltage that worked :smile:

                    sundberg84S 1 Reply Last reply
                    0
                    • tlpeterT tlpeter

                      I have voltage now and a percentage at the devices.
                      Hum and temp do work fine.
                      I only sucked all the juice out of the battery so it is charging now by the little solar panel.
                      I found out that 2,4V was really the lowest voltage that worked :smile:

                      sundberg84S Offline
                      sundberg84S Offline
                      sundberg84
                      Hardware Contributor
                      wrote on last edited by
                      #10

                      @tlpeter If you want to suck more juice out of the batteries use a DC-DC step up booster: https://www.mysensors.org/store/#regulators then you can go down to 0.9V :)

                      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
                      • tlpeterT Offline
                        tlpeterT Offline
                        tlpeter
                        wrote on last edited by
                        #11

                        I will buy one later :smile:
                        This is just to play with as i wanted to know how the battery measurement works.

                        1 Reply Last reply
                        0
                        • clio75C Offline
                          clio75C Offline
                          clio75
                          wrote on last edited by
                          #12

                          @tlpeter said:

                          if (oldBatteryPcnt != batteryPcnt) {
                          // Power up radio after sleep
                          send(msgBatt.set(batteryV, 1));
                          //sendBatteryLevel(batteryPcnt);
                          oldBatteryPcnt = batteryPcnt;
                          }

                          Hi, This part should not have been updated

                          this part is icluded in the lib
                          So leave it like the exsample
                          if (oldBatteryPcnt != batteryPcnt) {
                          // Power up radio after sleep
                          sendBatteryLevel(batteryPcnt);
                          oldBatteryPcnt = batteryPcnt;
                          }

                          For sending over your voltage you need one additional

                          send(msgBatt.set(batteryV, 1));

                          Good luck

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


                          20

                          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