Track battery level, handle wackier parameters.

This commit is contained in:
William Pietri
2017-11-05 11:09:14 -08:00
parent 3f02a3d9cf
commit 24f8a58a63
2 changed files with 22 additions and 5 deletions
+15 -4
View File
@@ -26,6 +26,7 @@ class VacBot(ClientXMPP):
self.ready_flag = Event()
self.clean_status = None
self.charge_status = None
self.battery_status = None
def wait_until_ready(self):
self.ready_flag.wait()
@@ -40,11 +41,21 @@ class VacBot(ClientXMPP):
self.register_handler(Callback('clean report',
MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="ChargeState"]'),
self.handle_charge_report))
self.register_handler(Callback('clean report',
MatchXPath('{jabber:client}iq/{com:ctl}query/{com:ctl}ctl[@td="BatteryInfo"]'),
self.handle_battery_report))
def handle_clean_report(self, iq):
self.clean_status = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}clean').get('type')
logging.debug("*** clean_status =" + self.clean_status)
def handle_battery_report(self, iq):
try:
self.battery_status = float(iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}battery').get('power')) / 100
except ValueError:
logging.warning("couldn't parse battery status " + ET.tostring(iq))
logging.debug("*** battery_status = {:.0%}".format(self.battery_status))
def handle_charge_report(self, iq):
report = iq.find('{com:ctl}query/{com:ctl}ctl/{com:ctl}charge').get('type')
if report.lower() == 'going':
@@ -140,7 +151,7 @@ class Stop(VacBotCommand):
class FrequencyParamType(click.ParamType):
name = 'frequency'
RATIONAL_PATTERN = re.compile(r'([.0-9])/([.0-9])')
RATIONAL_PATTERN = re.compile(r'([.0-9]+)/([.0-9]+)')
def convert(self, value, param, ctx):
result = None
@@ -153,7 +164,7 @@ class FrequencyParamType(click.ParamType):
result = float(value)
except ValueError:
pass
except ValueError:
except (ValueError, ArithmeticError):
pass
if result is None:
@@ -176,10 +187,10 @@ def read_config(filename):
def should_run(frequency):
if frequency is None:
return
return True
n = random.random()
result = n <= frequency
logging.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format( n, frequency, result))
logging.debug("tossing coin: {:0.3f} <= {:0.3f}: {}".format(n, frequency, result))
return result
+7 -1
View File
@@ -46,12 +46,19 @@ def test_frequency_param_type():
assert_equals(t.convert('1', None, None), 1.0)
assert_equals(t.convert('1/2', None, None), 0.5)
assert_equals(t.convert('1/7', None, None), 1.0 / 7.0)
assert_equals(t.convert('1/14', None, None), 1.0 / 14.0)
assert_equals(t.convert('1/1000', None, None), 1.0 / 1000.0)
assert_equals(t.convert('1.5/2', None, None), 1.5 / 2.0)
assert_equals(t.convert('0/2', None, None), 0)
with assert_raises(click.exceptions.BadParameter):
t.convert('bob', None, None)
with assert_raises(click.exceptions.BadParameter):
t.convert('2', None, None)
with assert_raises(click.exceptions.BadParameter):
t.convert('7/5', None, None)
with assert_raises(click.exceptions.BadParameter):
t.convert('1/0', None, None)
def test_should_run():
count = 0
@@ -65,4 +72,3 @@ def test_should_run():
if should_run(0.9):
count += 1
assert_almost_equal(count, 9000, delta=200)