Smooth battery values for smartsense devices

Since we have been receiving a lot of reports and complaints about the
battery readings on the smartsense devices that received battery
updates (multi and motion), we are adding this code to smooth out the
readings so it doesn't constantly oscillate between two values.  The
basic logic is, only create an event if we have two readings in a row
that are the same, or a reading is more than 100 millivolts off of the
current battery percentage.
This commit is contained in:
Zach Varberg
2017-07-26 14:14:21 -05:00
parent 04f56060c9
commit c86d61a862
2 changed files with 42 additions and 10 deletions

View File

@@ -173,11 +173,27 @@ private Map getBatteryResult(rawValue) {
} else { } else {
def minVolts = 2.4 def minVolts = 2.4
def maxVolts = 2.7 def maxVolts = 2.7
def pct = (volts - minVolts) / (maxVolts - minVolts) // Get the current battery percentage as a multiplier 0 - 1
def roundedPct = Math.round(pct * 100) def curValVolts = Integer.parseInt(device.currentState("battery")?.value ?: "100") / 100.0
if (roundedPct <= 0) // Find the corresponding voltage from our range
roundedPct = 1 curValVolts = curValVolts * (maxVolts - minVolts) + minVolts
result.value = Math.min(100, roundedPct) // Round to the nearest 10th of a volt
curValVolts = Math.round(10 * curValVolts) / 10.0
// Only update the battery reading if we don't have a last reading,
// OR we have received the same reading twice in a row
// OR we don't currently have a battery reading
// OR the value we just received is at least 2 steps off from the last reported value
if(state?.lastVolts == null || state?.lastVolts == volts || device.currentState("battery")?.value == null || Math.abs(curValVolts - volts) > 0.1) {
def pct = (volts - minVolts) / (maxVolts - minVolts)
def roundedPct = Math.round(pct * 100)
if (roundedPct <= 0)
roundedPct = 1
result.value = Math.min(100, roundedPct)
} else {
// Don't update as we want to smooth the battery values
result = null
}
state.lastVolts = volts
} }
} }

View File

@@ -275,11 +275,27 @@ private Map getBatteryResult(rawValue) {
} else { } else {
def minVolts = 2.1 def minVolts = 2.1
def maxVolts = 2.7 def maxVolts = 2.7
def pct = (volts - minVolts) / (maxVolts - minVolts) // Get the current battery percentage as a multiplier 0 - 1
def roundedPct = Math.round(pct * 100) def curValVolts = Integer.parseInt(device.currentState("battery")?.value ?: "100") / 100.0
if (roundedPct <= 0) // Find the corresponding voltage from our range
roundedPct = 1 curValVolts = curValVolts * (maxVolts - minVolts) + minVolts
result.value = Math.min(100, roundedPct) // Round to the nearest 10th of a volt
curValVolts = Math.round(10 * curValVolts) / 10.0
// Only update the battery reading if we don't have a last reading,
// OR we have received the same reading twice in a row
// OR we don't currently have a battery reading
// OR the value we just received is at least 2 steps off from the last reported value
if(state?.lastVolts == null || state?.lastVolts == volts || device.currentState("battery")?.value == null || Math.abs(curValVolts - volts) > 0.1) {
def pct = (volts - minVolts) / (maxVolts - minVolts)
def roundedPct = Math.round(pct * 100)
if (roundedPct <= 0)
roundedPct = 1
result.value = Math.min(100, roundedPct)
} else {
// Don't update as we want to smooth the battery values
result = null
}
state.lastVolts = volts
} }
} }